функция pnp: в чём разница?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Llirik, 20 июн 2011.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    почему эта функция не работает?
    Код (Text):
    1. KbFilter_PnP proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    2. local pDevExt:PFiDO_DEVICE_EXTENSION
    3. local event:KEVENT
    4. mov eax, pDeviceObject
    5. push    ebx
    6. mov ebx, pIrp
    7. push    esi
    8. push    edi
    9. mov edi, [eax+28h]
    10. mov eax, [ebx+60h]
    11. movzx   ecx, byte ptr [eax+1]
    12. sub ecx, 0
    13. mov pIrp, edi
    14. jz  short loc_125
    15. dec ecx
    16. dec ecx
    17. mov edx, ebx
    18. jz  short loc_EE
    19. sub ecx, 15h
    20. jz  short loc_E1
    21. inc byte ptr [ebx+23h]
    22. add eax, 24h
    23. mov [ebx+60h], eax
    24.  
    25. loc_D1:
    26. mov ecx, [edi+8]
    27. call     IofCallDriver
    28. mov esi, eax
    29. jmp loc_1A9
    30.  
    31. loc_E1:
    32. mov byte ptr [edi+0Dh], 1
    33. inc byte ptr [ebx+23h]
    34. add dword ptr [ebx+60h], 24h
    35. jmp short loc_D1
    36.  
    37. loc_EE:
    38. dec gr
    39. mov byte ptr [edi+0Eh], 1
    40. and dword ptr [ebx+18h], 0
    41. inc byte ptr [ebx+23h]
    42. add dword ptr [ebx+60h], 24h
    43. mov ecx, [edi+8]
    44. call    IofCallDriver
    45. push    dword ptr [edi+8]
    46. mov esi, eax
    47. call    IoDetachDevice
    48. push    pDeviceObject
    49. call    IoDeleteDevice
    50. jmp loc_1A9
    51.  
    52. loc_125:
    53. push    7
    54. pop ecx
    55. lea edx, [eax-24h]
    56. push    0
    57. mov esi, eax
    58. mov edi, edx
    59. push    0
    60. lea eax, event
    61. rep movsd
    62. and byte ptr [edx+3], 0
    63. push    eax
    64. call    KeInitializeEvent
    65. mov eax, [ebx+60h]
    66. mov edi, pDevExt
    67. sub eax, 24h
    68. lea ecx, event
    69. mov dword ptr [eax+1Ch], offset KbFilter_Complete
    70. mov [eax+20h], ecx
    71. mov byte ptr [eax+3], 0E0h
    72. mov ecx, [edi+8]
    73. mov edx, ebx
    74. call    IofCallDriver
    75. mov esi, eax
    76. cmp esi, 103h
    77. jnz short loc_182
    78. xor eax, eax
    79. push    eax
    80. push    eax
    81. push    eax
    82. push    eax
    83. lea eax, event
    84. push    eax
    85. call    KeWaitForSingleObject
    86.  
    87. loc_182:
    88. test    esi, esi
    89. jl  short loc_198
    90. cmp dword ptr [ebx+18h], 0
    91. jl  short loc_198
    92. and byte ptr [edi+0Eh], 0
    93. and byte ptr [edi+0Dh], 0
    94. mov byte ptr [edi+0Ch], 1
    95.  
    96. loc_198:
    97. and dword ptr [ebx+1Ch], 0
    98. xor dl, dl
    99. mov ecx, ebx
    100. mov [ebx+18h], esi
    101. call    IofCompleteRequest
    102.  
    103. loc_1A9:
    104. pop edi
    105. mov eax, esi
    106. pop esi
    107. pop ebx
    108. ret
    109. KbFilter_PnP    endp
    , она же в IDA
    Код (Text):
    1. var_14      = byte ptr -14h
    2. var_4       = dword ptr -4
    3. arg_0       = dword ptr  8
    4. arg_4       = dword ptr  0Ch
    5.  
    6.         push    ebp
    7.         mov ebp, esp
    8.         add esp, 0FFFFFFECh
    9.         mov eax, [ebp+arg_0]
    10.         push    ebx
    11.         mov ebx, [ebp+arg_4]
    12.         push    esi
    13.         push    edi
    14.         mov edi, [eax+28h]
    15.         mov eax, [ebx+60h]
    16.         movzx   ecx, byte ptr [eax+1]
    17.         sub ecx, 0
    18.         mov [ebp+arg_4], edi
    19.         jz  short loc_232
    20.         dec ecx
    21.         dec ecx
    22.         mov edx, ebx
    23.         jz  short loc_1FD
    24.         sub ecx, 15h
    25.         jz  short loc_1F0
    26.         inc byte ptr [ebx+23h]
    27.         add eax, 24h ; '$'
    28.         mov [ebx+60h], eax
    29.  
    30. loc_1E1:                ; CODE XREF: KbFilter_PnP(x,x)+4Fj
    31.         mov ecx, [edi+8]
    32.         call    @IofCallDriver@8 ; IofCallDriver(x,x)
    33.         mov esi, eax
    34.         jmp loc_2B2
    35. ; ---------------------------------------------------------------------------
    36.  
    37. loc_1F0:                ; CODE XREF: KbFilter_PnP(x,x)+2Aj
    38.         mov byte ptr [edi+0Dh], 1
    39.         inc byte ptr [ebx+23h]
    40.         add dword ptr [ebx+60h], 24h ; '$'
    41.         jmp short loc_1E1
    42. ; ---------------------------------------------------------------------------
    43.  
    44. loc_1FD:                ; CODE XREF: KbFilter_PnP(x,x)+25j
    45.         dec gr
    46.         mov byte ptr [edi+0Eh], 1
    47.         and dword ptr [ebx+18h], 0
    48.         inc byte ptr [ebx+23h]
    49.         add dword ptr [ebx+60h], 24h ; '$'
    50.         mov ecx, [edi+8]
    51.         call    @IofCallDriver@8 ; IofCallDriver(x,x)
    52.         push    dword ptr [edi+8]
    53.         mov esi, eax
    54.         call    _IoDetachDevice@4 ; IoDetachDevice(x)
    55.         push    [ebp+arg_0]
    56.         call    _IoDeleteDevice@4 ; IoDeleteDevice(x)
    57.         jmp loc_2B2
    58. ; ---------------------------------------------------------------------------
    59.  
    60. loc_232:                ; CODE XREF: KbFilter_PnP(x,x)+1Fj
    61.         push    7
    62.         pop ecx
    63.         lea edx, [eax-24h]
    64.         push    0
    65.         mov esi, eax
    66.         mov edi, edx
    67.         push    0
    68.         lea eax, [ebp+var_14]
    69.         rep movsd
    70.         and byte ptr [edx+3], 0
    71.         push    eax
    72.         call    _KeInitializeEvent@12 ; KeInitializeEvent(x,x,x)
    73.         mov eax, [ebx+60h]
    74.         mov edi, [ebp+var_4]
    75.         sub eax, 24h ; '$'
    76.         lea ecx, [ebp+var_14]
    77.         mov dword ptr [eax+1Ch], offset _KbFilter_Complete@0 ; KbFilter_Complete()
    78.         mov [eax+20h], ecx
    79.         mov byte ptr [eax+3], 0E0h ; 'а'
    80.         mov ecx, [edi+8]
    81.         mov edx, ebx
    82.         call    @IofCallDriver@8 ; IofCallDriver(x,x)
    83.         mov esi, eax
    84.         cmp esi, 103h
    85.         jnz short loc_28C
    86.         xor eax, eax
    87.         push    eax
    88.         push    eax
    89.         push    eax
    90.         push    eax
    91.         lea eax, [ebp+var_14]
    92.         push    eax
    93.         call    _KeWaitForSingleObject@20 ; KeWaitForSingleObject(x,x,x,x,x)
    94.  
    95. loc_28C:                ; CODE XREF: KbFilter_PnP(x,x)+CFj
    96.         test    esi, esi
    97.         jl  short loc_2A2
    98.         cmp dword ptr [ebx+18h], 0
    99.         jl  short loc_2A2
    100.         and byte ptr [edi+0Eh], 0
    101.         and byte ptr [edi+0Dh], 0
    102.         mov byte ptr [edi+0Ch], 1
    103.  
    104. loc_2A2:                ; CODE XREF: KbFilter_PnP(x,x)+E2j
    105.                     ; KbFilter_PnP(x,x)+E8j
    106.         and dword ptr [ebx+1Ch], 0
    107.         xor dl, dl
    108.         mov ecx, ebx
    109.         mov [ebx+18h], esi
    110.         call    @IofCompleteRequest@8 ; IofCompleteRequest(x,x)
    111.  
    112. loc_2B2:                ; CODE XREF: KbFilter_PnP(x,x)+3Fj
    113.                     ; KbFilter_PnP(x,x)+81j
    114.         pop edi
    115.         mov eax, esi
    116.         pop esi
    117.         pop ebx
    118.         leave
    119.         retn    8
    а это работающая функция:
    Код (Text):
    1. KbFilter_PnP    proc near
    2. var_14= byte ptr -14h
    3. var_4= dword ptr -4
    4. arg_0= dword ptr  8
    5. arg_4= dword ptr  0Ch
    6.  
    7. push    ebp
    8. mov ebp, esp
    9. sub esp, 14h
    10. mov eax, [ebp+arg_0]
    11. push    ebx
    12. mov ebx, [ebp+arg_4]
    13. push    esi
    14. push    edi
    15. mov edi, [eax+28h]
    16. mov eax, [ebx+60h]
    17. movzx   ecx, byte ptr [eax+1]
    18. sub ecx, 0
    19. mov [ebp+var_4], edi
    20. jz  short loc_125
    21. dec ecx
    22. dec ecx
    23. mov edx, ebx
    24. jz  short loc_EE
    25. sub ecx, 15h
    26. jz  short loc_E1
    27. inc byte ptr [ebx+23h]
    28. add eax, 24h
    29. mov [ebx+60h], eax
    30.  
    31. loc_D1:
    32. mov ecx, [edi+8]
    33. call     IofCallDriver
    34. mov esi, eax
    35. jmp loc_1A9
    36.  
    37. loc_E1:
    38. mov byte ptr [edi+0Dh], 1
    39. inc byte ptr [ebx+23h]
    40. add dword ptr [ebx+60h], 24h
    41. jmp short loc_D1
    42.  
    43. loc_EE:
    44. dec gr
    45. mov byte ptr [edi+0Eh], 1
    46. and dword ptr [ebx+18h], 0
    47. inc byte ptr [ebx+23h]
    48. add dword ptr [ebx+60h], 24h
    49. mov ecx, [edi+8]
    50. call    IofCallDriver
    51. push    dword ptr [edi+8]
    52. mov esi, eax
    53. call    IoDetachDevice
    54. push    [ebp+arg_0]
    55. call    IoDeleteDevice
    56. jmp loc_1A9
    57.  
    58. loc_125:
    59. push    7
    60. pop ecx
    61. lea edx, [eax-24h]
    62. push    0
    63. mov esi, eax
    64. mov edi, edx
    65. push    0
    66. lea eax, [ebp+var_14]
    67. rep movsd
    68. and byte ptr [edx+3], 0
    69. push    eax
    70. call    KeInitializeEvent
    71. mov eax, [ebx+60h]
    72. mov edi, [ebp+var_4]
    73. sub eax, 24h
    74. lea ecx, [ebp+var_14]
    75. mov dword ptr [eax+1Ch], offset KbFilter_Complete
    76. mov [eax+20h], ecx
    77. mov byte ptr [eax+3], 0E0h
    78. mov ecx, [edi+8]
    79. mov edx, ebx
    80. call    IofCallDriver
    81. mov esi, eax
    82. cmp esi, 103h
    83. jnz short loc_182
    84. xor eax, eax
    85. push    eax
    86. push    eax
    87. push    eax
    88. push    eax
    89. lea eax, [ebp+var_14]
    90. push    eax
    91. call    KeWaitForSingleObject
    92.  
    93. loc_182:
    94. test    esi, esi
    95. jl  short loc_198
    96. cmp dword ptr [ebx+18h], 0
    97. jl  short loc_198
    98. and byte ptr [edi+0Eh], 0
    99. and byte ptr [edi+0Dh], 0
    100. mov byte ptr [edi+0Ch], 1
    101.  
    102. loc_198:
    103. and dword ptr [ebx+1Ch], 0
    104. xor dl, dl
    105. mov ecx, ebx
    106. mov [ebx+18h], esi
    107. call    IofCompleteRequest
    108.  
    109. loc_1A9:
    110. pop edi
    111. mov eax, esi
    112. pop esi
    113. pop ebx
    114. leave
    115. retn    8
    116. KbFilter_PnP    endp
    в чём разница? просто я хочу её перевести на MASM, что бы лучше её понимать. Правда, мне на этом форуме когда-то уже пытались перевести её с С http://www.wasm.ru/forum/viewtopic.php?pid=417621#p417621, но к сожалению получилась лажа(
     
  2. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Неужели нет никакой разницы? Тогда почему второй вариант функции работает, а первый нет?
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я написал так:
    Код (Text):
    1. ....................
    2.     .if [edi].MinorFunction == IRP_MN_START_DEVICE
    3. mov ebx, pDeviceObject
    4. assume ebx:ptr DEVICE_OBJECT
    5. mov ebx, [ebx].DeviceExtension
    6. assume ebx:nothing
    7. assume ebx:ptr FiDO_DEVICE_EXTENSION
    8.     IoCopyCurrentIrpStackLocationToNext esi
    9.     invoke KeInitializeEvent, addr event, NotificationEvent, FALSE
    10.  
    11.     IoSetCompletionRoutine esi, KbFilter_Complete, addr event, TRUE, TRUE, TRUE
    12. mov eax, pDeviceObject
    13. .if eax == KeyDeviceObject
    14. invoke killirp, pIrp
    15. jmp eehyu
    16. .endif
    17. mov edx, pIrp
    18.     mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    19.     mov ecx, (FiDO_DEVICE_EXTENSION ptr [eax]).TopOfStack
    20. call    IofCallDriver
    21.   mov status, eax
    22.     cmp eax, STATUS_PENDING
    23.     je WAIT_DRIVER
    24.     cmp eax, STATUS_SUCCESS
    25.     je CHK_SUCCESS
    26.     jmp EXIT_START_DEVICE_SUB
    27.        
    28. WAIT_DRIVER:
    29.     invoke KeWaitForSingleObject, addr event, Executive, KernelMode, FALSE, 0
    30.    
    31. CHK_SUCCESS:
    32.     cmp [esi].IoStatus.Status, STATUS_SUCCESS
    33.     je CHANGE_DEV_EXT
    34.     jmp EXIT_START_DEVICE_SUB
    35.    
    36. CHANGE_DEV_EXT:
    37.     mov [ebx].Started, TRUE
    38.     mov [ebx].Removed, FALSE
    39.     mov [ebx].SurpriseRemoved, FALSE
    40. assume ebx:nothing
    41. EXIT_START_DEVICE_SUB:
    42.     push status
    43.     pop [esi].IoStatus.Status
    44.     mov [esi].IoStatus.Information, 0
    45.        
    46.     invoke IoCompleteRequest, pIrp, IO_NO_INCREMENT
    47. pop esi
    48. pop edi
    49. pop ebx    
    50.     mov eax, status
    51.     ret
    с PS/2 клавой фильтр работает, а вот при подключении USB-клавы получается BSOD.
    Что ещё надо добавить в этот код?
     
  4. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я нашел ошибку, но она чуть дальше этого кода