Ковыряю дрова по ману Four-F проблема с сабжем. Цель этого простейшего драйвера выводить соответствующий DbgPrint для каждого из действий. Дров регистрируется нормально, процедуры DriverEntry, DispatchCreate и DispatchСlose репортуют нормально, проблемы кодга юзермод вызывает ReadFile\WriteFile и там и там DbgPrint не вызывается в первом случае юзермод блокируется, во втором WriteFile возвращает 0, LAST_ERROR = INVALID_HANDLE. Всё что делает DriverEntry это создаёт девайс устанавливает во флагах DO_DIRECT_IO, создаёт ссылку, устанавливает IRP_MJ_CREATE \ READ \ WRITE\ CLOSE \ DEVICE_CONTROL рутины. Вопрос собственно почему так себя ведёт юзермод и почему не получает управление рутины DispatchRead, DispatchWrite. драйвер: Код (Text): .386 .model flat, stdcall option casemap:none include w2k\ntstatus.inc include w2k\ntddk.inc include w2k\ntoskrnl.inc includelib ntoskrnl.lib include Strings.mac STACK_SIZE equ 100h ;driver buffer size for I/O operations .data CCOUNTED_UNICODE_STRING "\\Device\\MyFirstDevice" , usDeviceName, 4 CCOUNTED_UNICODE_STRING "\\??\\MyFirstSymbolicLink", usSymbolLink, 4 IrpCount dd 0 .code DriverUnload proc pDriverObject: PDRIVER_OBJECT invoke DbgPrint, $CTA0("drv1: Driver Unload runs") invoke IoDeleteSymbolicLink, offset usSymbolLink mov eax, pDriverObject invoke IoDeleteDevice, (DRIVER_OBJECT ptr [eax]).DeviceObject ; mov eax, STATUS_SUCCESS ret DriverUnload endp DispatchCreate proc pDeviceObject: PDEVICE_OBJECT, pIrp:PIRP invoke DbgPrint, $CTA0("drv1: Dispatch Create runs") mov eax, pIrp assume eax: ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS mov [eax].IoStatus.Information, 0 assume eax: nothing fastcall IofCompleteRequest, eax, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchCreate endp DispatchClose proc pDeviceObject: PDEVICE_OBJECT, pIrp:PIRP invoke DbgPrint, $CTA0("drv1: Dispatch Close runs") mov eax, pIrp assume eax: ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS mov [eax].IoStatus.Information, 0 assume eax: nothing fastcall IofCompleteRequest, eax, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchClose endp DispatchControl proc pDeviceObject: PDEVICE_OBJECT, pIrp:PIRP invoke DbgPrint, $CTA0("drv1: Dispatch Control runs") mov eax, pIrp assume eax: ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS mov [eax].IoStatus.Information, 0 assume eax: nothing fastcall IofCompleteRequest, eax, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchControl endp DispatchRead proc pDeviceObject: PDEVICE_OBJECT, pIrp: PIRP invoke DbgPrint, $CTA0("drv1: DispatchRead") mov eax, pIrp assume eax: ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS mov [eax].IoStatus.Information, 0 assume eax: nothing fastcall IofCompleteRequest, eax, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchRead endp DispatchWrite proc uses esi edi ebx, pDeviceObject: PDEVICE_OBJECT, pIrp: PIRP invoke DbgPrint, $CTA0("drv1: DispatchWrite") mov eax, pIrp assume eax: ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS mov [eax].IoStatus.Information, 0 assume eax: nothing fastcall IofCompleteRequest, eax, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchWrite endp DriverEntry proc uses ebx edi esi, pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING LOCAL pDeviceObject: PDEVICE_OBJECT mov IrpCount, 0 ;int 3 invoke DbgPrint, $CTA0("drv1: Driver Entry runs") invoke IoCreateDevice, pDriverObject, 0, offset usDeviceName, FILE_DEVICE_UNKNOWN,\ 0, FALSE, addr pDeviceObject mov ebx, eax invoke DbgPrint, $CTA0("drv1: IoCreateDeviceReturns - 0x%X"), eax .IF ebx != STATUS_SUCCESS jmp @exit .endif ;direct io initialzing mov esi, pDeviceObject mov ebx, (DEVICE_OBJECT ptr [esi]).Flags invoke DbgPrint, $CTA0("drv1: Driver Entry: DRIVER_OBJECT.Flags = 0x%X"), ebx or ebx, DO_DIRECT_IO mov (DEVICE_OBJECT ptr [esi]).Flags, ebx invoke DbgPrint, $CTA0("drv1: Driver Entry : IoCreateDevice OK") invoke IoCreateSymbolicLink, offset usSymbolLink, offset usDeviceName .if eax != STATUS_SUCCESS invoke IoDeleteDevice, pDeviceObject jmp @exit .endif invoke DbgPrint, $CTA0("drv1: Driver Entry : IoCreateSymbolicLink OK") mov esi, pDriverObject assume esi: ptr DRIVER_OBJECT mov [esi].DriverUnload, offset DriverUnload mov [esi].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)], offset DispatchCreate mov [esi].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)], offset DispatchClose mov [esi].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset DispatchControl mov [esi].MajorFunction[IRP_MJ_READ*(sizeof PVOID)], offset DispatchRead mov [esi].MajorFunction[IRP_MJ_WRITE*(sizeof PVOID)], offset DispatchWrite assume esi: nothing mov eax, STATUS_SUCCESS ret @exit: mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp end DriverEntry юзер Код (Text): .386 .model flat, stdcall option casemap:none include windows.inc include kernel32.inc includelib kernel32.lib include Strings.mac .data? buf db 265 dup (?) rw dd ? .code start: invoke GetStdHandle, STD_INPUT_HANDLE mov esi, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov edi, eax invoke CreateFile, $CTA0("\\\\.\\MyFirstSymbolicLink"), GENERIC_READ or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 invoke ReadFile, esi, offset buf, 1, addr rw, 0 ret end start
ааа, бред, вчера весь вечер искал ошибку в драйвере, а на вызывающий код и вовсе не смотрел, нужно приучаться ко внимательности а не к программированию gilg спасибо!