Мой первый эксперимент в написании драйверов не удался. Как говорится, первый блин комом. Проблема в том, что не выполняется функция DriverUnload или выполняется неправильно. Драйвер после запуска остается в памяти и его нельзя ни остановить ни удалить. Хотел поставить айс - да не пошел он что-то Возможности отладить нет, но я над этим упорно работаю. Посмотрите пожалуйста исходники (прикрепленный файл), может ошибка явно видна. Я буду очень признателен всем кто поможет.
_s_a_t_a_n_ раз это озземблер, то я бы понавтыкал везде align 4 и в прологе\эпилоге функций сделал pushad/popad (с сохранением статуса ошибки в аккумуляторе ес-но).
Неправильно определена структура DRIVER_OBJECT (в ее названии кстати нет P в начале) - пропущен DriverStartio между DriverInit и DriverUnload, поэтому ты пишешь свой адрес не в то поле, поэтому и драйвер не выгружается.
Я удалил в драйвере код создания устройств и симлинка, удалил вообще на мой взгляд лишнее, оставил только скелет. И в результате BSOD при запуске. Plz help. Вот код который я в данный момент мучаю: format PE native 4.0 at 10000h use32 align 4 entry DriverEntry include '%fasminc%\win32a.inc' section '.code' code readable writeable executable notpageable STATUS_DEVICE_CONFIGURATION_ERROR equ 0xC0000182 STATUS_SUCCESS equ 0x00000000 IRP_MJ_MAXIMUM_FUNCTION equ 0x1b struct UNICODE_STRING Length dw ? MaximumLength dw ? Buffer dd ? ends ; UNICODE_STRING macro PUNICODE_STRING name,string { _us_#name du #string _us_#name_len = ($-_us_#name) dw 0 #name UNICODE_STRING _us_#name_len,(_us_#name_len+2),_us_#name } ; PUNICODE_STRING struct DRIVER_OBJECT Type dw ? Size dw ? DeviceObject dd ? Flags dd ? DriverStart dd ? DriverSize dd ? DriverSection dd ? DriverExtension dd ? DriverName UNICODE_STRING HardwareDatabase dd ? FastIoDispatch dd ? DriverInit dd ? DriverStartIo dd ? DriverUnload dd ? MajorFunction dd (IRP_MJ_MAXIMUM_FUNCTION + 1) dup (?) ends ; PDRIVER_OBJECT proc DriverEntry stdcall, pDriverObject, usRegistryPath ; mov [eax+DRIVER_OBJECT.DriverInit],DriverEntry mov [eax+DRIVER_OBJECT.DriverStartIo], DriverStartIo mov [eax+DRIVER_OBJECT.DriverUnload],DriverUnload mov eax,STATUS_SUCCESS ret endp proc DriverStartIo stdcall, pDeviceObject, _Irp ret endp proc DriverUnload stdcall, pDevice_Object,_Irp ret endp section '.reloc' data fixups readable discardable
Код (Text): format PE DLL native 4.0 at 10000h entry DriverEntry include 'macro/struct.inc' include 'macro/proc32.inc' include 'KMD/KMD.inc' section '.text' code readable executable notpageable proc DriverEntry lpDriverObject, lpusRegistryPath cinvoke DbgPrint, sHello mov eax, [lpDriverObject] ; [eax + DRIVER_OBJECT.DriverStart] - ImageBase mov [eax + DRIVER_OBJECT.DriverUnload], DriverUnload xor eax, eax ret endp proc DriverUnload lpDriverObject cinvoke DbgPrint, sBye ret endp section '.data' data readable writeable notpageable sHello db 'Hello!', 0 sBye db 'Bye!', 0 section '.rdata' data readable notpageable data 12 IAT ntoskrnl,\ DbgPrint dd 0 end data section 'INIT' import code discardable executable readable writeable library ntoskrnl,'ntoskrnl.exe' import ntoskrnl,\ DbgPrint,'DbgPrint' section '.reloc' fixups data readable discardable Примерно так.