Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывод с помощью функции NtDisplayString()  (Прочитано 24566 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
sxd
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-01-2007 15:29 » 

можно вопрос для общего развития?
NativeAPI - эт что за зверь?)
а... кажется разобрался ntoskrn.exe .... xm...
вопрос снимается)
« Последнее редактирование: 20-01-2007 15:39 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline Offline

« Ответ #2 : 20-01-2007 15:38 » 

NativeAPI (родной интерфейс) - функции которыми можно пользоваться ещё до загрузки системы, используются не только для написания драйверов, но и приложений NativeAPI, типа как scandisk или svchost.exe, позволяют писать системные сервисы и всякую другую хрень вот так вкратце.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 20-01-2007 15:40 » 

до кучи, а где описание его функций можно посмотреть?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 20-01-2007 15:46 » 

кстати по поводу....
http://www.microsoft.com/technet/sysinternals/miscellaneousutilities.mspx
там - Ctrl2Cap... хотя чкерт его знает, без исходняков вроде..

« Последнее редактирование: 20-01-2007 15:49 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline Offline

« Ответ #5 : 20-01-2007 18:02 » 

Эти функции доступны для использования, если скачал DDK - Driver Developmen Kit, пакет для разработки драйверов, там их описание, для компиляции, а литература - всякая инфа по драйверам и вчастности по их описанию.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 22-01-2007 07:31 » 

в том то и дело что NtDisplayString я DDK не обнаружил...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline Offline

« Ответ #7 : 22-01-2007 13:28 » 

не ну я же компилирую программу без ошибок и она выводит произвольные строки, проюлемма только со спецификаторами и возвратом каретки
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 22-01-2007 13:36 » 

да я верю, верю...
просто у меня в DDK который версии 3790 build 1830 (который из KMDF) не объявлено такой функции!?!.... вот и любопытно.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline Offline

« Ответ #11 : 23-01-2007 13:17 » 

CR, LF - да ты прав перевод строки и возврат коретки, но как быть со спецификатором %d?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline 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
Участник

ru
Offline Offline

« Ответ #14 : 25-01-2007 18:07 » new

Второй файл - где почему-то чёрный фон?
Код:
Код:
	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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 26-01-2007 11:05 » 

подумал... помимо использования sprintf... возможно это из за возврата каретки происходит?
попробуй тот же код без нее.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 29-01-2007 17:07 » 

чего то я запутался) в этом коде вроде нет возврата каретки? и все равно черная полоса?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 02-02-2007 10:55 » 

не знаю не знаю... у меня все большее подозрения что не работает это все впринципе... А черт его знает...
« Последнее редактирование: 02-02-2007 10:59 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sxd
Участник

ru
Offline Offline

« Ответ #23 : 02-02-2007 18:38 » 

Да и этот код тоже не работает!
Пи...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines