sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 19-01-2007 18:41 »   | 
								
								 | 
							  
							 
							Здравствуйте люди! Окажите помощь пожалуйста, кто знает: пишу NativeAPI приложение и не пойму: поддерживает ли функция NtDisplayString() возврат каретки и спецификаторы, в общем в С++ будет выглядеть так:
  for(int i = 10; i >= 0; i--) { printf ("Timer: %d second(s).\r", i); }
  можно ли тоже самое но использовав NativeAPI, например функцию NtDisplayString()? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 20-01-2007 15:29 »   | 
								
								 | 
							  
							 
							можно вопрос для общего развития? NativeAPI - эт что за зверь?) а... кажется разобрался ntoskrn.exe .... xm... вопрос снимается) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 20-01-2007 15:39 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 20-01-2007 15:38 »   | 
								
								 | 
							  
							 
							NativeAPI (родной интерфейс) - функции которыми можно пользоваться ещё до загрузки системы, используются не только для написания драйверов, но и приложений NativeAPI, типа как scandisk или svchost.exe, позволяют писать системные сервисы и всякую другую хрень вот так вкратце. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 20-01-2007 15:40 »   | 
								
								 | 
							  
							 
							до кучи, а где описание его функций можно посмотреть? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	| 
		
		
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 20-01-2007 18:02 »   | 
								
								 | 
							  
							 
							Эти функции доступны для использования, если скачал DDK - Driver Developmen Kit, пакет для разработки драйверов, там их описание, для компиляции, а литература - всякая инфа по драйверам и вчастности по их описанию. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 22-01-2007 07:31 »   | 
								
								 | 
							  
							 
							в том то и дело что NtDisplayString я DDK не обнаружил... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 22-01-2007 13:28 »   | 
								
								 | 
							  
							 
							не ну я же компилирую программу без ошибок и она выводит произвольные строки, проюлемма только со спецификаторами и возвратом каретки
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 22-01-2007 13:36 »   | 
								
								 | 
							  
							 
							да я верю, верю...  просто у меня в DDK который версии 3790 build 1830 (который из KMDF) не объявлено такой функции!?!.... вот и любопытно. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 22-01-2007 16:19 »   | 
								
								 | 
							  
							 
							У меня стоит Microsoft Windows Server 2003 Service Pack 1 (SP1) Driver Development Kit (DDK), поиском так же не обнаружил NtDisplayString(), наверное вызывает зразу из ntdll.dll, я же подключаю #pragma comment (lib, ntdll.lib) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 23-01-2007 08:59 »   | 
								
								 | 
							  
							 
							ntdll.lib он действительно есть... но чем то смущет такой подход) и то что в хелпах родных ее нет. впрочем в 98 тоже отсутсвовали PsGetCurrentThreadId/PsGetCurrentProcessId из ntoskrnl но это не мешало мне их использовать... -------------------------------------------------------------------------------- PS тогда насчет возврата картетки: NTSYSAPI NTSTATUS NTAPI NtDisplayString(  IN PUNICODE_STRING      String ); Function NtDisplayString display specified string in text-mode (typically: blue screen). Warning: Trying to display string without previously switch to text-mode results as system hang.  -------------------------------------------------------------------------------- String     Pointer to UNICODE_STRING contains string to display. Some basic control characters are implemented (like CR, LF). - вроде как может?! Requirements: Library: ntdll.lib  Privilege: SE_TCB_PRIVILEGE  http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error/NtDisplayString.html 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 23-01-2007 09:09 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 23-01-2007 13:17 »   | 
								
								 | 
							  
							 
							CR, LF - да ты прав перевод строки и возврат коретки, но как быть со спецификатором %d? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 23-01-2007 14:14 »   | 
								
								 | 
							  
							 
							 #define PCI_DEVICE_NAME_N   L"\\Device\\NameDriver_" //имя физического устройства (device)
  UNICODE_STRING      uniNtDeviceName; WCHAR               pszName[64];  LPCWSTR             pszFormat = L"%s%02d";      //форматирование имени и номера  name-xx
      RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), pszFormat, PCI_DEVICE_NAME_N ,InstanceCount);     RtlInitUnicodeString(&uniNtDeviceName,pszName);
 
 
 например это формирует строку uniNtDeviceName = "\\Device\\NameDriver_XX" (XX - равно InstanceCount, 01,02 и т.д. в моем случае) думаю по аналогии))) кстати рекомендую...RtlStringCbPrintfW... PS что характерно RtlStringCbPrintfW - документированная))) правда насчет CR LF... ЗЗЫ это мы в соседней ветке с Анатоличем "Две одинаковые PCI платы на один драйвер" ставили) PPPS но все таки... где то в хедере то NtDisplayString у вас должна быть прописана? или по умолчанке ее компилятор сам определяет как только встретит...  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 23-01-2007 14:22 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 25-01-2007 18:04 »   | 
								
								 | 
							  
							 
							Привет Ochkarik спасибо за код очень помог, но вот косяк скомпилир два кода и возврат коретки вроде работает, но не совсем - на чёрном фоне я записал видео с виртуальной машины, второй как выводит обычную строку, скидываю два файла. 	UNICODE_STRING string; 	int i;
  	RtlInitUnicodeString(&string, L"\n........................HELLO........................");
  	for(i = 0; i < 10; i++) 	{ 		NtDisplayString(&string); 	}  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 16-12-2007 13:53 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 25-01-2007 18:07 »   | 
								
								 | 
							  
							 
							Второй файл - где почему-то чёрный фон? Код: 	char buffer[512]; 	int i; 	UNICODE_STRING UnicodeString; 	ANSI_STRING AnsiString; 	LARGE_INTEGER iDelayInterval;
  	iDelayInterval.QuadPart = -10000000; 	 	for (i = 0; i < 10; i++) 	{ 	sprintf(buffer, "HELLO %d WORLD! \r", i );
  	RtlInitAnsiString (&AnsiString, buffer); 	RtlAnsiStringToUnicodeString (&UnicodeString, &AnsiString, TRUE);
  	NtDisplayString (&UnicodeString);
  	NtDelayExecution(FALSE, &iDelayInterval); 	} 	RtlFreeUnicodeString (&UnicodeString); Где же косяк здеся?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 16-12-2007 13:55 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 26-01-2007 10:24 »   | 
								
								 | 
							  
							 
							а вообще sprintf в драйверах можно использовать?   он же код из Libc.lib цепляет...фиг его там знает.попробуй все таки поставить RtlStringCbPrintfW/RtlInitUnicodeString из примера вопервых и короче будет и всего дву функции вместо трех...))  накрайняк  Carriage return CR 13 or 0x0d='\r'  Newline NL (LF) 10 or 0x0a='\n'  UNICODE_STRING      UnicodeString; WCHAR               pszName[64]; 
      RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), L"%s%d%s", L"HELLO  "  ,i, L" WORLD! \r" );     //или RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), L"%s%d%s", L"HELLO  "  ,i, L" WORLD! \n" );
      RtlInitUnicodeString(&UnicodeString,pszName);
 
  но я еще подумаю сейчас за обедом над этим вопросом))) попозже отпишусь....  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 16-12-2007 13:50 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #16 : 26-01-2007 11:05 »   | 
								
								 | 
							  
							 
							подумал... помимо использования sprintf... возможно это из за возврата каретки происходит? попробуй тот же код без нее. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #17 : 27-01-2007 19:43 »   | 
								
								 | 
							  
							 
							Привет Ochkarik! в общем использовал следущий код: 	UNICODE_STRING      UnicodeString; 	WCHAR               pszName[64]; 	int i; 	LARGE_INTEGER iDelayInterval;
  	iDelayInterval.QuadPart = -10000000;
  	for (i = 0; i < 10; i++) 	{ 	     RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), L"%s%d%s", L"HELLO "  ,i, L" WORLD!");               RtlInitUnicodeString(&UnicodeString,pszName);
  	     NtDisplayString (&UnicodeString);
  	     NtDelayExecution(FALSE, &iDelayInterval); 	}
  	NtTerminateProcess( NtCurrentProcess(), 0 ); Но результат такой же, опять чёрная полоса хотел попробовать с CR но не получается их использовать. Самое главное, что \n работает нормально и темного фона не наблюдается.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #18 : 29-01-2007 17:07 »   | 
								
								 | 
							  
							 
							чего то я запутался) в этом коде вроде нет возврата каретки? и все равно черная полоса? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #19 : 30-01-2007 12:05 »   | 
								
								 | 
							  
							 
							Привет Ochkarik! в общем использовал следущий код: 	UNICODE_STRING      UnicodeString; 	WCHAR               pszName[64]; 	int i; 	LARGE_INTEGER iDelayInterval;
  	iDelayInterval.QuadPart = -10000000;
  	for (i = 0; i < 10; i++) 	{ 	     RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), L"%s%d%s", L"HELLO "  ,i, L" WORLD![b]\r[/b]");               RtlInitUnicodeString(&UnicodeString,pszName);
  	     NtDisplayString (&UnicodeString);
  	     NtDelayExecution(FALSE, &iDelayInterval); 	}
  	NtTerminateProcess( NtCurrentProcess(), 0 ); Но результат такой же, опять чёрная полоса хотел попробовать с CR но не получается их использовать. Самое главное, что \n работает нормально и темного фона не наблюдается. Виноват просто не усмотрел.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #20 : 30-01-2007 12:50 »   | 
								
								 | 
							  
							 
							сейчас... все таки уточню. вышуеказанный код UNICODE_STRING      UnicodeString; 	WCHAR               pszName[64]; 	int i; 	LARGE_INTEGER iDelayInterval;
  	iDelayInterval.QuadPart = -10000000;
  	for (i = 0; i < 10; i++) 	{ 	     RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), L"%s%d%s", L"HELLO "  ,i, L" WORLD!\r");               RtlInitUnicodeString(&UnicodeString,pszName);
  	     NtDisplayString (&UnicodeString);
  	     NtDelayExecution(FALSE, &iDelayInterval); 	}
  	NtTerminateProcess( NtCurrentProcess(), 0 );
  работает как надо, возврат каретки функционирует, НО ОСТАЕТСЯ ЧЕРНЫЙ ФОН? если строку :  RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), L"%s%d%s", L"HELLO "  ,i, L" WORLD!\r"); заменить на :  RtlStringCbPrintfW(pszName, 63 * sizeof(WCHAR), L"%s%d%s", L"HELLO "  ,i, L" WORLD!\n"); (в место возврата каретки - перенос) то перенос тоже работает как обычно, но ФОН СИНИЙ? все так? - тогда получается что это проблема возврата каретки...  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 30-01-2007 13:16 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #21 : 31-01-2007 18:26 »   | 
								
								 | 
							  
							 
							Да используя \n фон синий, может не зря всё-таки в описании функции NtDisplayString() упомянуты CR и LF может с ними будет работать.   ( Да кстати вот код написал, щас попробую, смысл в чём возращаю курсор на позицию назад и пробел ставлю, кол-во выводимых символов можно узнать определив длину строки - но ведь это же тупость, даже если будет работать с синем фоном.   ( #include "stdafx.h" #include "windows.h"
  int _tmain(int argc, _TCHAR* argv[]) { 	printf ("1_2_3_4_5_6_7_8_9_0"); 	Sleep (1000);
  	for (int i = 0; i < 19; i++) 	{ 		printf ("\x8"); 	}
  	for (int i = 0; i < 19; i++) 	{ 		printf ("\x20"); 		Sleep (500); 	}
  	for (int i = 0; i < 19; i++) 	{ 		printf ("\x8"); 	}
  	printf ("Hello_wold!");
  	Sleep (100000); 	return 0; }  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									 « Ответ #22 : 02-02-2007 10:55 »   | 
								
								 | 
							  
							 
							не знаю не знаю... у меня все большее подозрения что не работает это все впринципе...    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 02-02-2007 10:59 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sxd
							
								Участник 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #23 : 02-02-2007 18:38 »    | 
								
								 | 
							  
							 
							Да и этот код тоже не работает! Пи... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |