![]() |
eXeL@B —› Программирование —› NtDisplayString (ZwDisplayString) - control characters (\r - загадка)? |
Посл.ответ | Сообщение |
|
Создано: 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 ![]() |
|
Создано: 14 мая 2007 02:42 · Личное сообщение · #2 |
|
Создано: 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 так в чём же может быть ошибка? ![]() |
|
Создано: 14 мая 2007 20:10 · Личное сообщение · #4 |
|
Создано: 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); //задержка в одну секунду } но в первом и во-втором случае результат одинаков - чёрная полоса... ![]() |
|
Создано: 15 мая 2007 12:31 · Личное сообщение · #6 |
|
Создано: 15 мая 2007 14:08 · Личное сообщение · #7 |
|
Создано: 15 мая 2007 17:46 · Личное сообщение · #8 Ratinsh пишет: Могу лишь посоветовать Попробовать использовать функции GetConsole... SetConsole... из kernel32.dll Если захочешь избавиться от использования лишней dll, посмотреть реализацию функций в ней. Может конечно ещё посмотреть dwFlags в Process_Parameters. GetConsole... SetConsole... из kernel32.dll ![]() ![]() |
|
Создано: 15 мая 2007 17:49 · Личное сообщение · #9 |
|
Создано: 15 мая 2007 17:54 · Личное сообщение · #10 |
|
Создано: 15 мая 2007 17:55 · Личное сообщение · #11 |
|
Создано: 15 мая 2007 20:12 · Личное сообщение · #12 Ratinsh пишет: Странно а я думал kernel32.dll "native приложение" Это не native приложение, а компонент ядра и ты меня не понял я имел ввиду, что GetConsole... SetConsole - это WinAPI, а их использовать нельзя, что касается kernel32.dll, то я сделал небольшой файлик с именами функций экспортируемых из ней... Большая часть это NtXxx и RtlXxx... ![]() |
|
Создано: 15 мая 2007 22:34 · Личное сообщение · #13 sxd пишет: Офигеть!!! Так а ты проверил как? То есть скинул в C:\Windows\System32 добавил инфу в реестр и перезагрузился? Какая у тебя система и её версия? Сразу как ты создал тему, скачал я файл, глянул на код, чтоб бяку всякую не запускать, и перезагрузился с твоей записью в реестре. Никаких глюков. Две строки на синем фоне: 123456789 .......... Правда пришлось подправить boot.ini после Морозильника (он добавляет /noguiboot). Вот и думаю - о чём речь? ВМ у меня сейчас нет, так что проверить не могу. А система XP home edition SP2. Но думаю тут дело не в самой системе, а в настройках. ----- Всем привет, я вернулся ![]() |
|
Создано: 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 ![]() |
|
Создано: 16 мая 2007 19:30 · Личное сообщение · #15 |
|
Создано: 16 мая 2007 20:26 · Личное сообщение · #16 Так значит надо копаться в autochk.exe и искать функцию которая перерисовывает фон? Вообще я хочу сделать чтоб у меня как при работе autochk.exe проценты прогонялисть, на С++ для Windows будет так примерно: for (i = 100; i < 1; i--)
В native приложении мог бы так примерно сделать: for (i = 100; i < 1; i--)
Так всё таки может по другому как нибудь проценты вывести... Или надо обращаться к людям которые autochk.exe продезассемблируют и разберуться что за функция фон меняет, а может и не функция... Вообще не понятно в документации сказано Some basic control characters are implemented (like CR, LF). а на самом деле... ![]() ![]() |
|
Создано: 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. ----- Всем привет, я вернулся ![]() |
|
Создано: 16 мая 2007 20:37 · Личное сообщение · #18 |
|
Создано: 17 мая 2007 01:55 · Личное сообщение · #19 |
|
Создано: 18 мая 2007 16:38 · Личное сообщение · #20 |
|
Создано: 18 мая 2007 16:49 · Личное сообщение · #21 |
|
Создано: 18 мая 2007 18:32 · Личное сообщение · #22 |
|
Создано: 19 мая 2007 12:22 · Личное сообщение · #23 |
|
Создано: 21 мая 2007 19:06 · Личное сообщение · #24 |
|
Создано: 23 мая 2007 10:59 · Личное сообщение · #25 |
|
Создано: 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,...)
И есть её вызов: case PROGRESS:
Но при повторе такого же кода в своём приложении опять таже проблемма - чёрный фон ![]() Хотя в ReactOS всё выводится нормально... Навождение!!! Хотя может там ещё есть то что я пока не вижу... Тем более заголовочных файлов - несколько... #include <debug.h>
![]() |
|
Создано: 24 мая 2007 23:11 · Личное сообщение · #27 sxd ...То WinAPI предлагают... Если не понимаешь, то спроси. Повторюсь. Пишешь прогу на WinAPI из kernel32, а он вызывает ntdll трассернёшь прогу до вызова функций из ntdll дальше реализуй без вызова kernel32. А за тебя кодить и исследовать никто не будет. Хочешь так ищи исходники NT или 2000 - какие-то в сети были. Ну не на все функции есть описания. ![]() |
![]() |
eXeL@B —› Программирование —› NtDisplayString (ZwDisplayString) - control characters (\r - загадка)? |