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 » |
|
Да и этот код тоже не работает! Пи...
|
|
|
Записан
|
|
|
|
|