Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› NtDisplayString (ZwDisplayString) - control characters (\r - загадка)?
Посл.ответ Сообщение

Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 13 мая 2007 22:37 · Поправил: sxd
· Личное сообщение · #1

NtDisplayString

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).

По идеии должна отображать юникодовскую строку, переданную ей в качестве единственного параметра...

Я написал простенькую прога которая должна отображать строку.
\n - работает нормально без глюков
\r - с этим проблемма можете на видео посмотреть (чёрная полоса)

Потом покопался HIEW в autochk.exe (XP-ый SCANDISK) и убедился, что он использует юникод строку с возвратом каретки (можно наблюдать когда при загрузке проверяет диск)... Там в конце юникодовской строки таже последовательность байтов (0D 00 0A 00), что и в моей проге...

Обратился к зарубежным источникам и обнаружил, что там тоже у многих проблема с этой функцией, в частности возврат каретки...

Скриншоты тоже в архиве!!! Видео специально без компрессора записал, если у кого кодеков нет.

Так почемуже такой глюк? Может это какая-то специальная фитча по безопасности, то есть XP определяет, что это не autochk.exe и специально не правильно отображает или...

--> NATIVE_PROGRAM.rar <-- http://slil.ru/24362559



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 14 мая 2007 02:42
· Личное сообщение · #2

Никакого глюка не вижу.
Что за полоса? Объясни словами.
И разделил бы файлы. Без толку видео и картинки качать.

-----
Всем привет, я вернулся




Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 14 мая 2007 19:25 · Поправил: sxd
· Личное сообщение · #3

Bitfry когда я использую следующий код:

UNICODE_STRING string;
RtlInitUnicodeString(&string, L"123456789\n123456789"); //перевод строки
NtDisplayString(&string);

то всё отображается нормально белые буквы на синем фоне (файл в архиве перевод строки.avi), а когда такой код:

UNICODE_STRING string;
RtlInitUnicodeString(&string, L"123456789\r111111111"); //возврат каретки
NtDisplayString(&string);

то появляется на синем фоне чёрная полоса (файл в архиве возврат каретки.avi), хотя в описании явно сказано, что ...control characters are implemented (like CR, LF). Да и программа autochk.exe использует возврат каретки в функции NtDisplayString()...

Другие файлы из архива:
NATIVE.EXE - программа использующая возврат каретки (для демонстрации скопировать в С:\windows\system32 и добавить информацию в реестр с NATIVE.REG, далее перезагружаемся...)

AUTOCHK.JPG и NATIVE.JPG показывает что autochk.exe действительно использует юникодовскую строку с возвратом каретки, как и в моей проге NATIVE.JPG так в чём же может быть ошибка?



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 14 мая 2007 20:10
· Личное сообщение · #4

Ты напутал со строками, вот и не понятно.
Сам пример NATIVE.EXE работает без всяких глюков. У меня, по крайней мере.
Так что смотри сам, где у тебя глюк в примере со строками Hello World.

-----
Всем привет, я вернулся




Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 14 мая 2007 21:37 · Поправил: sxd
· Личное сообщение · #5

Bitfry да нет же я не то имею ввиду...
Во-первых я ничего не напутал...

UNICODE_STRING string;
RtlInitUnicodeString(&string, L"123456789\r111111111"); //возврат каретки
NtDisplayString(&string);

В этом примере просто и наглядно, а в видео (возврат каретки.avi) использовал следующий код:

for (i = 0; i < 10; i++)
{
sprintf(buffer, "HELLO %d WORLD! \r", i );//Форматирование буффера

RtlInitAnsiString (&AnsiString, buffer);//иницилизация Ansi строки
RtlAnsiStringToUnicodeString (&UnicodeString, &AnsiString, TRUE);//Ansi строка в Unicode строку

NtDisplayString (&UnicodeString);//выводим строку

NtDelayExecution(FALSE, &iDelayInterval); //задержка в одну секунду
}

но в первом и во-втором случае результат одинаков - чёрная полоса...



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 15 мая 2007 12:31
· Личное сообщение · #6

Могу лишь посоветовать
Попробовать использовать функции GetConsole... SetConsole... из kernel32.dll
Если захочешь избавиться от использования лишней dll, посмотреть реализацию
функций в ней. Может конечно ещё посмотреть dwFlags в Process_Parameters.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 15 мая 2007 14:08
· Личное сообщение · #7

sxd пишет:
но в первом и во-втором случае результат одинаков - чёрная полоса...

Ещё раз повторяю, у меня при запуске твоего NATIVE.EXE нет никаких чёрных полос (если не веришь, могу фотографию снять =).
Может у тебя что-то в настройках системы особое или версия...

-----
Всем привет, я вернулся




Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 мая 2007 17:46
· Личное сообщение · #8

Ratinsh пишет:
Могу лишь посоветовать
Попробовать использовать функции GetConsole... SetConsole... из kernel32.dll
Если захочешь избавиться от использования лишней dll, посмотреть реализацию
функций в ней. Может конечно ещё посмотреть dwFlags в Process_Parameters.

GetConsole... SetConsole... из kernel32.dll да нет что ты Ratinsh это же native приложение, оно не может использовать WinAPI такое же ограничение как и на драйверы...



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 мая 2007 17:49
· Личное сообщение · #9

Bitfry пишет:
Ещё раз повторяю, у меня при запуске твоего NATIVE.EXE нет никаких чёрных полос (если не веришь, могу фотографию снять =).

Офигеть!!! Так а ты проверил как? То есть скинул в C:\Windows\System32 добавил инфу в реестр и перезагрузился? Какая у тебя система и её версия?



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 мая 2007 17:54
· Личное сообщение · #10

Bitfry или ты на виртуальной машине проверял?



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 15 мая 2007 17:55
· Личное сообщение · #11

Странно а я думал kernel32.dll "native приложение"



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 мая 2007 20:12
· Личное сообщение · #12

Ratinsh пишет:
Странно а я думал kernel32.dll "native приложение"

Это не native приложение, а компонент ядра и ты меня не понял я имел ввиду, что GetConsole... SetConsole - это WinAPI, а их использовать нельзя, что касается kernel32.dll, то я сделал небольшой файлик с именами функций экспортируемых из ней... Большая часть это NtXxx и RtlXxx...



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 15 мая 2007 22:34
· Личное сообщение · #13

sxd пишет:
Офигеть!!! Так а ты проверил как? То есть скинул в C:\Windows\System32 добавил инфу в реестр и перезагрузился? Какая у тебя система и её версия?

Сразу как ты создал тему, скачал я файл, глянул на код, чтоб бяку всякую не запускать, и перезагрузился с твоей записью в реестре. Никаких глюков. Две строки на синем фоне:
123456789
..........
Правда пришлось подправить boot.ini после Морозильника (он добавляет /noguiboot).
Вот и думаю - о чём речь?
ВМ у меня сейчас нет, так что проверить не могу. А система XP home edition SP2.
Но думаю тут дело не в самой системе, а в настройках.

-----
Всем привет, я вернулся




Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 16 мая 2007 18:20 · Поправил: sxd
· Личное сообщение · #14

А.... вот видишь не правильно!!!!
Потому что должен быть возврат каретки \r а у тебя перевод строки - \n!!!
Если это возврат каретки то должно вывести ..........6789,

Вот посмотри этот экзешник пожалуйста, а то может тот действительно был с переводом строки... \n - это работает, проблема с \r
Здесь я использую следущую иницилизацию строки...

RtlInitUnicodeString(&string, L"123456789\rHELLO_WORLD!!!.................");

По идеи должы быть сначала выведены символы 123456789 за тем произойдёт возврат каретки в начало строки и вывод следущей части HELLO_WORLD!!!.................

Извини Bitfry если я тебя напрягаю...

--> NATIVE.EXE <-- http://slil.ru/24377161



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 16 мая 2007 19:30
· Личное сообщение · #15

Ну вот, теперь понятно.

1. При возврате курсора на начало строки обновляется фон консоли для данной строки.
Это скорее не глюк, а особенность... хотя и глупая.

2. Ты спутал коды символов:
\n - это 0A00-0D00
\r – это 0D00

-----
Всем привет, я вернулся




Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 16 мая 2007 20:26
· Личное сообщение · #16

Так значит надо копаться в autochk.exe и искать функцию которая перерисовывает фон?
Вообще я хочу сделать чтоб у меня как при работе autochk.exe проценты прогонялисть, на С++ для Windows будет так примерно:

for (i = 100; i < 1; i--)
{
printf ("Timer: %d seconds.", i);
Sleep (1000);
}


В native приложении мог бы так примерно сделать:
for (i = 100; i < 1; i--)
{
sprintf (ansiString, "Timer: %d seconds.\r", i);
RtlAnsiStringToUnicodeString (&unicodeString, &ansiString, TRUE);
NtDisplayString(&unicodeString);

NtDelayExecution(FALSE, &iDelayInterval); //Sleep();
}


Так всё таки может по другому как нибудь проценты вывести...
Или надо обращаться к людям которые autochk.exe продезассемблируют и разберуться что за функция фон меняет, а может и не функция...
Вообще не понятно в документации сказано Some basic control characters are implemented (like CR, LF). а на самом деле...



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 16 мая 2007 20:33
· Личное сообщение · #17

Ещё раз.
У тебя ошибка в предположении что в autochk.exe используется "\r".
Bitfry пишет:
2. Ты спутал коды символов:
\n - это 0A00-0D00
\r – это 0D00

sxd пишет:
Вообще не понятно в документации сказано Some basic control characters are implemented (like CR, LF). а на самом деле...

На самом деле CR,LF = 0A,0D, а в unicode = 0A00,0D00.

-----
Всем привет, я вернулся




Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 16 мая 2007 20:37
· Личное сообщение · #18

Если он не использует \r то как он делает это?



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 17 мая 2007 01:55
· Личное сообщение · #19

... autochk.exe продезассемблируют ...

Тогда уж проще посмотреть bootvid.dll



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 мая 2007 16:38
· Личное сообщение · #20

sxd - хорош вату катать, ясно что надо перед перерисовкой еразить бкгрнд, а иначе как ?



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 18 мая 2007 16:49
· Личное сообщение · #21

[img]кстати, sxd, а что-бы не покласть исходн. этой байды, може хто и поможет,
а так, что , дизасемблить ?...[/img]



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 18 мая 2007 18:32
· Личное сообщение · #22

drunk_master как что дизасемблить autochk.exe ведь он когда проверяет диск использует для вывода информации на экран NtDisplayString() причём вывод процентов тоже есть и всё работает как надо! Ну сам наверное видел как проверяется диск в XP после перезагрузки...



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 19 мая 2007 12:22
· Личное сообщение · #23

sxd не поленись скачай исходники - давно народ советует
sourceforge.net/project/showfiles.php?group_id=6553
ну и сюда конечно
www.reactos.org/ru/index.html



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 21 мая 2007 19:06
· Личное сообщение · #24

Да-да спасибо конечно только вот осталось разобраться во всём этом...



Ранг: 29.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 23 мая 2007 10:59
· Личное сообщение · #25

sxd пишет:
Да-да спасибо конечно только вот осталось разобраться во всём этом...

что ето значит, ежели не секрет, и гохда будет сырье ?



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 мая 2007 19:03
· Личное сообщение · #26

drunk_master пишет:
что ето значит, ежели не секрет, и гохда будет сырье ?


Вообще я понял, что это дело тёмное...
В нете нашёл, что есть ещё функции типа:
HalDisplayString
bootvid.dll
VidBitBlt
VidBufferToScreenBlt
VidCleanUp
VidDisplayString
VidDisplayStringXY
VidInitialize
VidResetDisplay
VidScreenToBufferBlt
VidSetScrollRegion
VidSetTextColor

Много таких похожих на ZwDisplayString или ZwDisplayString...

Что касается ReactOS то скачал версию 0.3.1... Нашёл там исходник autochk.exe!
Там есть такая функция которая использует NtDisplayString():
static VOID PrintString(char* fmt,...)
{
char buffer[512];
va_list ap;
UNICODE_STRING UnicodeString;
ANSI_STRING AnsiString;

va_start(ap, fmt);
vsprintf(buffer, fmt, ap);
va_end(ap);

RtlInitAnsiString(&AnsiString, buffer);
RtlAnsiStringToUnicodeString(&UnicodeString,
&AnsiString,
TRUE);
NtDisplayString(&UnicodeString);
RtlFreeUnicodeString(&UnicodeString);
}


И есть её вызов:
case PROGRESS:
Percent = (PDWORD) Argument;
PrintString("%d percent completed.\r", *Percent);
break;


Но при повторе такого же кода в своём приложении опять таже проблемма - чёрный фон
Хотя в ReactOS всё выводится нормально... Навождение!!!

Хотя может там ещё есть то что я пока не вижу... Тем более заголовочных файлов - несколько...
#include <debug.h>
#include <stdio.h>
#include <windows.h>
#include <ndk/ntndk.h>
#include <fmifs/fmifs.h>




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 24 мая 2007 23:11
· Личное сообщение · #27

sxd
...То WinAPI предлагают...

Если не понимаешь, то спроси. Повторюсь.
Пишешь прогу на WinAPI из kernel32, а он вызывает ntdll
трассернёшь прогу до вызова функций из ntdll
дальше реализуй без вызова kernel32. А за тебя кодить
и исследовать никто не будет. Хочешь так ищи исходники NT
или 2000 - какие-то в сети были. Ну не на все функции есть описания.


 eXeL@B —› Программирование —› NtDisplayString (ZwDisplayString) - control characters (\r - загадка)?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати