передача irp по стеку

Тема в разделе "WASM.NT.KERNEL", создана пользователем Llirik, 12 авг 2010.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4.  
    5. include \masm32\include\ntstatus.inc
    6. include \masm32\include\ntddk.inc
    7. include \masm32\include\ntoskrnl.inc
    8. include \masm32\include\ntddkbd.inc
    9. include \masm32\include\hal.inc
    10.  
    11. includelib \masm32\lib\ntoskrnl.lib
    12. includelib \masm32\lib\hal.lib
    13.  
    14. include \masm32\Macros\Strings.mac
    15.  
    16. include common.inc
    17.  
    18. .data
    19. CCOUNTED_UNICODE_STRING    "\\Device\\KeyMouse", g_usDeviceName, 4
    20.  CCOUNTED_UNICODE_STRING    "\\??\\KeyMouse", g_usSymbolicLinkName, 4
    21. CCOUNTED_UNICODE_STRING "\\Device\\KeyboardClass0", g_usTargetDeviceName, 4
    22. FALSE       equ 0
    23. TRUE        equ 1
    24. x dw ?
    25. y dw ?
    26. buttons dw ?
    27. KeyDeviceObject   PDEVICE_OBJECT ?
    28. ;;;pTargetFileObject   PFILE_OBJECT  ?
    29.  
    30. FiDO_DEVICE_EXTENSION STRUCT
    31.     pNextLowerDeviceObject  PDEVICE_OBJECT  ?
    32.     pTargetFileObject   PFILE_OBJECT    ?
    33. FiDO_DEVICE_EXTENSION ENDS
    34. PFiDO_DEVICE_EXTENSION typedef ptr FiDO_DEVICE_EXTENSION
    35.  
    36. .code
    37.  
    38.  
    39. FiDO_DispatchPassThrough proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    40.  
    41.     IoSkipCurrentIrpStackLocation pIrp
    42.  
    43.     mov eax, pDeviceObject
    44.     mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    45.     mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).pNextLowerDeviceObject
    46.  
    47.     invoke IoCallDriver, eax, pIrp
    48.     ret
    49.  
    50. FiDO_DispatchPassThrough endp
    51.  
    52.  
    53.  DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    54.  
    55.      mov eax, pIrp
    56.      assume eax:ptr _IRP
    57.      mov [eax].IoStatus.Status, STATUS_SUCCESS
    58.      and [eax].IoStatus.Information, 0
    59.      assume eax:nothing
    60.  
    61.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    62.  
    63.      mov eax, STATUS_SUCCESS
    64.      ret
    65.  
    66.  DispatchCreateClose endp
    67.  
    68. CDO_DispatchDeviceControl proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    69.  
    70.      mov eax, pIrp
    71.      assume eax:ptr _IRP
    72.      mov [eax].IoStatus.Status, STATUS_SUCCESS
    73.      and [eax].IoStatus.Information, 0
    74.      assume eax:nothing
    75.  
    76.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    77.  
    78.      mov eax, STATUS_SUCCESS
    79.      ret
    80.  
    81. CDO_DispatchDeviceControl endp
    82.  
    83.  
    84. DriverUnload proc pDriverObject:PDRIVER_OBJECT
    85.  
    86. ;local KeyData:KEY_DATA
    87.  
    88.     invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName
    89.  
    90.     mov eax, pDriverObject
    91.     invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
    92.  
    93.     ret
    94.  
    95. DriverUnload endp
    96.  
    97. DriverDispatch proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    98.  
    99. local status:NTSTATUS
    100. local dwMajorFunction:DWORD
    101.  
    102.     IoGetCurrentIrpStackLocation pIrp
    103.  
    104.     movzx eax, (IO_STACK_LOCATION PTR [eax]).MajorFunction
    105.     mov dwMajorFunction, eax
    106.  
    107.     mov eax, pDeviceObject
    108.     .if eax == KeyDeviceObject
    109.  
    110. ;       mov eax, dwMajorFunction
    111.  
    112. ;   .elseif eax == g_pControlDeviceObject
    113.  
    114.         ; Request is to our CDO. Let' see what our client want us do
    115.    
    116.         mov eax, dwMajorFunction
    117.         .if eax == IRP_MJ_CREATE
    118.             invoke DispatchCreateClose, pDeviceObject, pIrp
    119.             mov status, eax
    120.         .elseif eax == IRP_MJ_CLOSE
    121.             invoke DispatchCreateClose, pDeviceObject, pIrp
    122.             mov status, eax
    123.         .elseif eax == IRP_MJ_DEVICE_CONTROL
    124.             invoke CDO_DispatchDeviceControl, pDeviceObject, pIrp
    125.             mov status, eax
    126.         .else
    127.             invoke FiDO_DispatchPassThrough, pDeviceObject, pIrp
    128.             mov status, eax
    129.  
    130.             .endif
    131.  
    132.     .else
    133.  
    134.         mov ecx, pIrp
    135.         mov (_IRP PTR [ecx]).IoStatus.Status, STATUS_INVALID_DEVICE_REQUEST
    136.         and (_IRP PTR [ecx]).IoStatus.Information, 0
    137.  
    138.         fastcall IofCompleteRequest, ecx, IO_NO_INCREMENT
    139.  
    140.         mov status, STATUS_INVALID_DEVICE_REQUEST
    141.  
    142.     .endif
    143.  
    144.     mov eax, status
    145.     ret
    146.  
    147. DriverDispatch endp
    148.  
    149. .code INIT
    150.  
    151.  
    152. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    153.  local status:NTSTATUS
    154.  
    155. local pTargetDeviceObject:PDEVICE_OBJECT
    156.  local pTargetFileObject:PFILE_OBJECT
    157.  
    158.      mov status, STATUS_DEVICE_CONFIGURATION_ERROR
    159.  
    160. invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \
    161.                                               0, FALSE, addr KeyDeviceObject
    162. .if eax == STATUS_SUCCESS
    163.          invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    164.          .if eax == STATUS_SUCCESS
    165.  
    166.      invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \
    167.                                       addr pTargetFileObject, addr pTargetDeviceObject
    168.  
    169.             mov eax, pDriverObject
    170.              assume eax:PTR DRIVER_OBJECT
    171.     mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1
    172.     .while ecx
    173.     dec ecx
    174.     mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset DriverDispatch
    175.     .endw
    176.              mov [eax].DriverUnload, offset DriverUnload
    177.              assume eax:nothing
    178.         invoke IoAttachDeviceToDeviceStack, KeyDeviceObject, pTargetDeviceObject   
    179.              mov status, STATUS_SUCCESS
    180.          .else
    181.              invoke IoDeleteDevice, KeyDeviceObject
    182.          .endif
    183.      .endif
    184.  
    185.      mov eax, status
    186.  
    187. ret
    188.  
    189. DriverEntry endp
    190.  
    191. end DriverEntry
    Почему такой код приводит к синему экрану смерти??
     
  2. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Llirik
    Может лучше не стоит в kernel ?

    Crashdump ?
    WinDbg?
    Syser?

    А вот потом сюда...
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Syser: Компьютер был перезагружен после критической ошибки: 0x1000008e (0xc0000005, 0xbae84293, 0xba373a00, 0x00000000).

    Crashdump прилагаю.
    Хватит?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Llirik
    Нульдереференс в вашем дрове по смещению 0x293, выше в SFC клиф, удалить кису. Смотреть дизасмом что вы скомпилили.
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А можно по-русски) а то я в этом деле новичок. Я и свой код с трудом понял и написал)
     
  6. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    Код (Text):
    1. 0: kd> !analyze -v
    2. *******************************************************************************
    3. *                                                                             *
    4. *                        Bugcheck Analysis                                    *
    5. *                                                                             *
    6. *******************************************************************************
    7.  
    8. KERNEL_MODE_EXCEPTION_NOT_HANDLED_M (1000008e)
    9. This is a very common bugcheck.  Usually the exception address pinpoints
    10. the driver/function that caused the problem.  Always note this address
    11. as well as the link date of the driver/image that contains this address.
    12. Some common problems are exception code 0x80000003.  This means a hard
    13. coded breakpoint or assertion was hit, but this system was booted
    14. /NODEBUG.  This is not supposed to happen as developers should never have
    15. hardcoded breakpoints in retail code, but ...
    16. If this happens, make sure a debugger gets connected, and the
    17. system is booted /DEBUG.  This will let us see why this breakpoint is
    18. happening.
    19. Arguments:
    20. Arg1: c0000005, The exception code that was not handled
    21. Arg2: bae84293, The address that the exception occurred at
    22. Arg3: ba373a00, Trap Frame
    23. Arg4: 00000000
    24.  
    25. Debugging Details:
    26. ------------------
    27.  
    28.  
    29. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>
    30.  
    31. FAULTING_IP:
    32. Keymouse+293
    33. bae84293 8b00            mov     eax,dword ptr [eax]
    34.  
    35. TRAP_FRAME:  ba373a00 -- (.trap 0xffffffffba373a00)
    36. ErrCode = 00000000
    37. eax=00000000 ebx=889d3e80 ecx=8884ef18 edx=889d3e70 esi=88a44030 edi=88a5e680
    38. eip=bae84293 esp=ba373a74 ebp=ba373a74 iopl=0         nv up ei ng nz na po nc
    39. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010282
    40. Keymouse+0x293:
    41. bae84293 8b00            mov     eax,dword ptr [eax]  ds:0023:00000000=????????
    42. Resetting default scope
    43.  
    44. CUSTOMER_CRASH_COUNT:  1
    45.  
    46. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    47.  
    48. BUGCHECK_STR:  0x8E
    49.  
    50. PROCESS_NAME:  System
    51.  
    52. LAST_CONTROL_TRANSFER:  from bae8436f to bae84293
    53.  
    54. STACK_TEXT:  
    55. WARNING: Stack unwind information not available. Following frames may be wrong.
    56. ba373a74 bae8436f 8884ef18 889d3e70 00000012 Keymouse+0x293
    57. ba373a8c 8081818f 8884ef18 889d3e70 889d3e70 Keymouse+0x36f
    58. ba373a9c 808ac953 88a5e668 00000070 8a5dcca0 nt!IopfCallDriver+0x31
    59. ba373acc 808e5a0a 8a5b9830 8884ef18 00000000 nt!IopCloseFile+0x26b
    60. ba373b00 808e5333 8a5b9830 00000001 8a5dcca0 nt!ObpDecrementHandleCount+0xd8
    61. ba373b28 808e53d1 e1003e98 88a5e680 00000260 nt!ObpCloseHandleTableEntry+0x14d
    62. ba373b70 808e5509 00000260 00000000 00000000 nt!ObpCloseHandle+0x87
    63. ba373b84 8086a61c 80000260 ba373c38 80828f31 nt!NtClose+0x1d
    64. ba373b84 80828f31 80000260 ba373c38 80828f31 nt!KiFastCallEntry+0xfc
    65. ba373c00 ad515db1 80000260 8084f67e 00000000 nt!ZwClose+0x11
    66. ba373c38 ad5227df 88a5e680 ba373c64 ad5348a4 klif+0x18db1
    67. ba373d78 ad5241ec ad5348a4 8955b7a4 ba373da8 klif+0x257df
    68. ba373d88 ad5242bf ad5243cb 00000000 8955b770 klif+0x271ec
    69. ba373da8 ad504127 808f8f64 00000000 00000000 klif+0x272bf
    70. ba373ddc 8086f0de ad504120 00000000 00000000 klif+0x7127
    71. 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
    72.  
    73.  
    74. STACK_COMMAND:  kb
    75.  
    76. FOLLOWUP_IP:
    77. Keymouse+293
    78. bae84293 8b00            mov     eax,dword ptr [eax]
    79.  
    80. SYMBOL_STACK_INDEX:  0
    81.  
    82. SYMBOL_NAME:  Keymouse+293
    83.  
    84. FOLLOWUP_NAME:  MachineOwner
    85.  
    86. MODULE_NAME: Keymouse
    87.  
    88. IMAGE_NAME:  Keymouse.sys
    89.  
    90. DEBUG_FLR_IMAGE_TIMESTAMP:  4c6303ae
    91.  
    92. FAILURE_BUCKET_ID:  0x8E_Keymouse+293
    93.  
    94. BUCKET_ID:  0x8E_Keymouse+293
    95.  
    96. Followup: MachineOwner
    97. ---------
    дело в вашем драйвере, в памяти это Keymouse+293, ida pro в руки и проверяйте, что это за функция и почему там разыменование нулевого указателя
     
  7. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    FiDO_DispatchPassThrough proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

    IoSkipCurrentIrpStackLocation pIrp

    mov eax, pDeviceObject
    mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension <-- eax = (DeviceExtension == NULL)
    mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).pNextLowerDeviceObject <-- exception

    invoke IoCallDriver, eax, pIrp
    ret

    FiDO_DispatchPassThrough endp


    1. почитай для чего поле DeviceExtension в структуре DEVICE_OBJECT
    2. обрати внимание на параметр DeviceExtensionSize в IoCreateDevice
    3. почитай про передачу IRP
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я указал структуру FiDO_DEVICE_EXTENSION в IoCreateDevice
    invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \
    0, FALSE, addr KeyDeviceObject

    но ничего не изменилось
     
  9. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Llirik
    Не знаеш? Отладчик в зУбы и в перед ...

    Бряку на DriverEntry;

    Код (Text):
    1. DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    2.  
    3.      mov eax, pIrp
    4.      assume eax:ptr _IRP
    5.      mov [eax].IoStatus.Status, STATUS_SUCCESS
    6.      and [eax].IoStatus.Information, 0
    7.      assume eax:nothing
    8.  
    9.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    10.  
    11.      mov eax, STATUS_SUCCESS
    12.      ret
    13.  
    14.  DispatchCreateClose endp
    Где вы взяли этот код? больше от туда код не берете ... :) Как ниже стоящий драйвер узнает о создании Ссылки на него?
     
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Всех благодарю за помощь! Я заполнил структуру FiDO_DEVICE_EXTENSION и драйвер заработал. Если у меня возникнут еще вопросы, я продолжу писать в этот топик
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Вопрос такой: почему после загрузки моего драйвера перестают работать световые индикаторы клавиатуры и что с этим можно сделать? Код примерно тот же
    И ещё мне нужна информация про сканкоды клавиш стаблицей