Приветик... мальчики помогите плиззззз... Курсовик делаю... Сам драйвер мне написали, но теперь надо как нибудь вывести информацию на экран!!! Переменная типа UNICODE_STRING... Подскажите плиззззз... какой лучше функцией воспользоваться и как?
В какой момент должен производиться вывод строки? Если в момент загрузки системы - то подойдет ZwDisplayString, иначе, скорее всего, только прямая запись в видеобуфер...
Не обязательно в момент загрузки, главное, чтобы HAL владел дисплеем. Это действительно бывает при загрузке обычно, но можно самостоятельно захватить дисплей: Код (Text): // Initialization InbvAcquireDisplayOwnership( ); InbvResetDisplay( ); InbvSolidColorFill(0,0,639,479,4); // make the screen blue InbvSetTextColor(15); InbvInstallDisplayStringFilter((INBV_DISPLAY_STRING_FILTER)NULL); bDisplayStringEnabled = InbvEnableDisplayString(TRUE); // enable display string InbvSetScrollRegion(0,0,639,479); // set to use entire screen // Display string InbvDisplayString("Hello, World!"); Правда одна тонкость - я не знаю как потом вернуть прежний режим =)))) Так что скорее всего придется воспользоваться DbgPrint'ом. Код (Text): PUNICODE_STRING String; PWSTR Buffer; Buffer = ExAllocatePool( PagedPool, String->Length*2 + 2 ); memcpy( Buffer, String->Buffer, String->Length*2 ); Buffer[String->Length] = 0; DbgPrint("String: %S", Buffer); ExFreePool( Buffer ); Вся эта шня на случай если в конце UNICODE-строки нету нуля. Если есть, тогда просто DbgPrint("String: %S", String->Buffer); и все
Интересно, а какой именно "вывод на экран" все-таки интересует Маруську? Ибо DbgPrint конечно "вывод", но не совсем на экран...
Вообще, можно и не заставлять ХАЛ захватывать экран. Можно попробовать "нарисовать" текст. Кое-что есть вот тут: https://www.rootkit.com/board.php?thread=10285&did=edge0&disp=10285
IMHO все эти шаманства с экраном, мягко сказать фигня. У разного железа с этим по разному, да и вывод этот IMHO криво отображается. Гораздо правильнее и красивше передавать данные в юзермод, и потом красивыми окошками их показывать. Ну или если по простому и чисто для отладки, то как предложил Great юзать DbgPrint.
Упссс... столько ответов, спасибки... DbgPrint - это наверное не пойдёт... насколько я поняла занимаясь этой наукой, DbgPrint - функция для отладки и на экран выводит сообщения только в специальных программах... DbgView вроде чёта мне объясняли =)) А если я хочу во время загрузки чтоб на таком синеньком фоне... Понимаете? И да кстати цвет фона можно менять?
Тогда ZwDisplayString InbvSolidColorFill(0,0,639,479,4); // make the screen blue' Цвет фона - последний параметр
Я так понимаю, что можно так сделать: Код (Text): NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING theRegistryPath) { UNICODE_STRING usString; RtlInitUnicodeString (&usString, L"My driver...."); ZwDisplayString(&usString); DriverObject -> DriverUnload = MyUnload; RtlFreeUnicodeString (&usString); return STATUS_SUCCESS; }
НИкакой памяти не выделяется, используется строчка L"My driver...." из секции .rdata драйвера. ПОпытка освобождения такой (невыделенной отдельно) памяти - бсод сразу.
А я могу проверить такой драйвер без перезагрузки... Просто слышала есть какая то недокументированная функция которая может взять и запустить драйвер в память...
Запустить можно вошь в голову Драйвер можно загрузить в память и затем попытаться запустить его в работу.
Ой-ай.. кошмар. Начнем по-порядку, таких функций аж две. ZwLoadDriver позволяет нормальным образом загрузить драйвер с созданием ветки в реестре и DRIVER_OBJECT'а ZwSetSystemInformation( SysLoadAndCallImage ) позволяет загрузить образ без создания веток реестра и DRIVER_OBJECT'ов.