Простейший Direct I/O

Тема в разделе "WASM.BEGINNERS", создана пользователем rain, 11 июл 2007.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Ковыряю дрова по ману 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):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5.  
    6. include w2k\ntstatus.inc
    7. include w2k\ntddk.inc
    8.  
    9. include w2k\ntoskrnl.inc
    10.  
    11. includelib ntoskrnl.lib
    12.  
    13. include Strings.mac
    14.  
    15. STACK_SIZE equ 100h ;driver buffer size for I/O operations
    16.  
    17. .data
    18.     CCOUNTED_UNICODE_STRING "\\Device\\MyFirstDevice" , usDeviceName, 4
    19.     CCOUNTED_UNICODE_STRING "\\??\\MyFirstSymbolicLink", usSymbolLink, 4
    20.  
    21.     IrpCount dd 0
    22. .code
    23.  
    24. DriverUnload proc  pDriverObject: PDRIVER_OBJECT
    25.    
    26.     invoke DbgPrint, $CTA0("drv1: Driver Unload runs")
    27.    
    28.     invoke IoDeleteSymbolicLink, offset usSymbolLink
    29.     mov eax, pDriverObject
    30.     invoke IoDeleteDevice, (DRIVER_OBJECT ptr [eax]).DeviceObject
    31. ;
    32.     mov eax, STATUS_SUCCESS
    33.     ret
    34. DriverUnload endp
    35.  
    36. DispatchCreate proc pDeviceObject: PDEVICE_OBJECT, pIrp:PIRP
    37.  
    38.     invoke DbgPrint, $CTA0("drv1: Dispatch Create runs")
    39.     mov eax, pIrp
    40.     assume eax: ptr _IRP
    41.     mov [eax].IoStatus.Status, STATUS_SUCCESS
    42.     mov [eax].IoStatus.Information, 0
    43.     assume eax: nothing
    44.     fastcall IofCompleteRequest, eax, IO_NO_INCREMENT
    45.  
    46.     mov eax, STATUS_SUCCESS
    47.     ret
    48. DispatchCreate endp
    49.  
    50. DispatchClose proc pDeviceObject: PDEVICE_OBJECT, pIrp:PIRP
    51.    
    52.     invoke DbgPrint, $CTA0("drv1: Dispatch Close runs")
    53.    
    54.     mov eax, pIrp
    55.     assume eax: ptr _IRP
    56.     mov [eax].IoStatus.Status, STATUS_SUCCESS
    57.     mov [eax].IoStatus.Information, 0
    58.     assume eax: nothing
    59.  
    60.     fastcall IofCompleteRequest, eax, IO_NO_INCREMENT
    61.     mov eax, STATUS_SUCCESS
    62.     ret
    63.  
    64. DispatchClose endp
    65.  
    66. DispatchControl proc pDeviceObject: PDEVICE_OBJECT, pIrp:PIRP
    67.    
    68.     invoke DbgPrint, $CTA0("drv1: Dispatch Control runs")
    69.    
    70.     mov eax, pIrp
    71.     assume eax: ptr _IRP
    72.     mov [eax].IoStatus.Status, STATUS_SUCCESS
    73.     mov [eax].IoStatus.Information, 0
    74.     assume eax: nothing
    75.  
    76.     fastcall IofCompleteRequest, eax, IO_NO_INCREMENT
    77.  
    78.     mov eax, STATUS_SUCCESS
    79.     ret
    80.  
    81. DispatchControl endp
    82.  
    83. DispatchRead proc pDeviceObject: PDEVICE_OBJECT, pIrp: PIRP
    84.     invoke DbgPrint, $CTA0("drv1: DispatchRead")   
    85.  
    86.     mov eax, pIrp
    87.     assume eax: ptr _IRP
    88.     mov [eax].IoStatus.Status, STATUS_SUCCESS
    89.     mov [eax].IoStatus.Information, 0
    90.     assume eax: nothing
    91.  
    92.     fastcall IofCompleteRequest, eax, IO_NO_INCREMENT
    93.     mov eax, STATUS_SUCCESS
    94.    
    95.     ret
    96.  
    97. DispatchRead endp
    98.  
    99. DispatchWrite proc uses esi edi ebx, pDeviceObject: PDEVICE_OBJECT, pIrp: PIRP
    100.    
    101.     invoke DbgPrint, $CTA0("drv1: DispatchWrite")
    102.     mov eax, pIrp
    103.     assume eax: ptr _IRP
    104.     mov [eax].IoStatus.Status, STATUS_SUCCESS
    105.     mov [eax].IoStatus.Information, 0
    106.     assume eax: nothing
    107.  
    108.     fastcall IofCompleteRequest, eax, IO_NO_INCREMENT
    109.     mov eax, STATUS_SUCCESS
    110.     ret
    111.  
    112. DispatchWrite endp
    113.    
    114. DriverEntry proc uses ebx edi esi, pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    115.     LOCAL pDeviceObject: PDEVICE_OBJECT
    116.     mov IrpCount, 0
    117.  
    118.     ;int 3
    119.     invoke DbgPrint, $CTA0("drv1: Driver Entry runs")
    120.  
    121.    
    122.     invoke IoCreateDevice, pDriverObject, 0, offset usDeviceName, FILE_DEVICE_UNKNOWN,\
    123.                         0, FALSE, addr pDeviceObject
    124.                        
    125.     mov ebx, eax
    126.     invoke DbgPrint, $CTA0("drv1: IoCreateDeviceReturns - 0x%X"), eax
    127.     .IF ebx != STATUS_SUCCESS
    128.         jmp @exit
    129.     .endif
    130.  
    131.     ;direct io initialzing
    132.     mov esi, pDeviceObject
    133.     mov ebx, (DEVICE_OBJECT ptr [esi]).Flags
    134.     invoke DbgPrint, $CTA0("drv1: Driver Entry: DRIVER_OBJECT.Flags = 0x%X"), ebx
    135.     or ebx, DO_DIRECT_IO
    136.     mov (DEVICE_OBJECT ptr [esi]).Flags, ebx
    137.    
    138.    
    139.     invoke DbgPrint, $CTA0("drv1: Driver Entry : IoCreateDevice OK")
    140.    
    141.     invoke IoCreateSymbolicLink, offset usSymbolLink, offset usDeviceName
    142.    
    143.     .if eax != STATUS_SUCCESS
    144.         invoke IoDeleteDevice, pDeviceObject
    145.         jmp @exit
    146.     .endif
    147.    
    148.     invoke DbgPrint, $CTA0("drv1: Driver Entry : IoCreateSymbolicLink OK")
    149.    
    150.     mov esi, pDriverObject
    151.     assume esi: ptr DRIVER_OBJECT
    152.     mov [esi].DriverUnload, offset DriverUnload
    153.     mov [esi].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],              offset DispatchCreate
    154.     mov [esi].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],                   offset DispatchClose
    155.     mov [esi].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)],  offset DispatchControl
    156.     mov [esi].MajorFunction[IRP_MJ_READ*(sizeof PVOID)],            offset DispatchRead
    157.     mov [esi].MajorFunction[IRP_MJ_WRITE*(sizeof PVOID)],           offset DispatchWrite
    158.     assume esi: nothing
    159.     mov eax, STATUS_SUCCESS
    160.     ret
    161.  
    162.   @exit:
    163.     mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    164.     ret
    165.  
    166. DriverEntry endp
    167.  
    168. end DriverEntry
    юзер
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include windows.inc
    6. include kernel32.inc
    7. includelib kernel32.lib
    8.  
    9. include Strings.mac
    10.  
    11. .data?
    12.     buf db 265 dup (?)
    13.     rw  dd ?
    14. .code
    15. start:
    16.    
    17.     invoke GetStdHandle, STD_INPUT_HANDLE
    18.     mov esi, eax
    19.     invoke GetStdHandle, STD_OUTPUT_HANDLE
    20.     mov edi, eax
    21.  
    22.     invoke CreateFile, $CTA0("\\\\.\\MyFirstSymbolicLink"), GENERIC_READ or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0
    23.  
    24.  
    25.     invoke ReadFile, esi, offset buf, 1, addr rw, 0
    26.     ret
    27. end start
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Почему первый параметр esi, а не eax?
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ааа, бред, вчера весь вечер искал ошибку в драйвере, а на вызывающий код и вовсе не смотрел, нужно приучаться ко внимательности а не к программированию :dntknw:
    gilg спасибо!