DeviceIoControl и IOCTL_KEYBOARD_INSERT_DATA

Тема в разделе "WASM.ASSEMBLER", создана пользователем hilete, 26 сен 2008.

  1. hilete

    hilete New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    28
    перерыл сеть, поискал на форуме. кроме китайских, корейских и японских страниц ничего не нашел... что странно. даже MSDN в ответ на запрос IOCTL_KEYBOARD_INSERT_DATA ничего не находит.

    кто-нибудь пробовал посылать сканкоды подключаясь к '\Device\KeyboardClass0'?
    делаю это примерно так (Four-F, взял за основу твой KbdGarland.asm)
    Код (Text):
    1. local kid:KEYBOARD_INPUT_DATA
    2. local dwBytesReturned:DWORD
    3. ...
    4.     invoke DefineDosDevice, DDD_RAW_TARGET_PATH, $CTA0("KbdGarland"), $CTA0("\\Device\\KeyboardClass0")
    5.     .if eax != 0
    6.  
    7.         invoke CreateFile, $CTA0("\\\\.\\KbdGarland"), 0, 0, NULL, OPEN_EXISTING, 0, NULL
    8.         .if eax != INVALID_HANDLE_VALUE
    9.             mov hDevice, eax
    10.  
    11.             lea esi, kid
    12.             assume esi:ptr KEYBOARD_INPUT_DATA
    13.             mov [esi].UnitId, 0h ;код клавиатуры 0
    14.             mov [esi].MakeCode, 02h ;код кнопки '0'
    15.             mov [esi].Flags, KEY_MAKE ; key down
    16.             invoke DeviceIoControl, hDevice, IOCTL_KEYBOARD_INSERT_DATA, addr kid, sizeof kid, \
    17.                                 NULL, 0, addr dwBytesReturned, NULL
    18. ....
    19.             mov [esi].Flags, KEY_BREAK ;key up
    20.             invoke DeviceIoControl, hDevice, IOCTL_KEYBOARD_INSERT_DATA, addr kid, sizeof kid, \
    21.                                 NULL, 0, addr dwBytesReturned, NULL
    22. ...
    я вообще верно понимаю назначение IOCTL_KEYBOARD_INSERT_DATA? данный код (при правильном использовании) должен сделать что-то аналогичное SendInput и keybd_event (в части симуляции нажатия клавиш)?

    еще тут http://blog.livedoor.jp/baz_sara/archives/50276439.html увидел такое
    IOCTL_KEYBOARD_INSERT_DATA → STATUS_INVALID_DEVICE_REQUEST
    IOCTL_MOUSE_INSERT_DATA → STATUS_INVALID_DEVICE_REQUEST
    т.е. типа такие запросы к этим девайсам выдают вот такие ответы. сам пока не проверял... щас займусь. но допустим это так - в чем проблема? вернее для чего существует этот управляющий запрос в ddk, если device его не не понимает?
     
  2. hilete

    hilete New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    28
    DeviceIoControl возвращает 0 (стало быть неуспешная операция)
    GetLastError возвращает STATUS_WAIT_1 (0x00000001, по крайней мере по NTSTATUS это STATUS_WAIT_1)
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Судя по дизасму, kbdclass (XP+SP2) не понимает этого кода. Если он встречается в хидерах, то это не значит, что он поддерживается. Может планировали поддержку, потом отказались. Может когда-то была, потом убрали и т.д и т.п.

    Код (Text):
    1. PAGE:00012A44 _KeyboardClassDeviceControl@8 proc near
    2. ...
    3. PAGE:00012A9C                 mov     eax, [esi+0Ch]  ; ControlCode
    4. PAGE:00012A9F                 mov     ecx, 0B01A0h    ; IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS
    5. PAGE:00012AA4                 cmp     eax, ecx
    6. PAGE:00012AA6                 ja      loc_12B5B       ; IOCTL_HID_GET_INDEXED_STRING
    7. PAGE:00012AAC                 jz      loc_12B85
    8. PAGE:00012AB2
    9. PAGE:00012AB2                 mov     ecx, 0B0080h    ; IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION
    10. PAGE:00012AB7                 cmp     eax, ecx
    11. PAGE:00012AB9                 ja      short loc_12B2A ; IOCTL_HID_GET_DRIVER_CONFIG
    12. PAGE:00012ABB                 jz      short loc_12B18
    13. PAGE:00012ABD                 sub     eax, 0B0000h    ; IOCTL_KEYBOARD_QUERY_ATTRIBUTES
    14. PAGE:00012AC2                 jz      short loc_12B18
    15. PAGE:00012AC4                 sub     eax, 4          ; IOCTL_KEYBOARD_SET_TYPEMATIC
    16. PAGE:00012AC7                 jz      short loc_12B0C
    17. PAGE:00012AC9                 sub     eax, 4          ; IOCTL_KEYBOARD_SET_INDICATORS
    18. PAGE:00012ACC                 jz      short loc_12AF2
    19. PAGE:00012ACE                 sub     eax, 18h        ; IOCTL_KEYBOARD_QUERY_TYPEMATIC
    20. PAGE:00012AD1                 jz      short loc_12B18
    21. PAGE:00012AD3                 sub     eax, 20h        ; IOCTL_KEYBOARD_QUERY_INDICATORS
    22. PAGE:00012AD6                 jz      short loc_12B18
    23. PAGE:00012AD8 loc_12AD8:
    24. PAGE:00012AD8                 mov     esi, STATUS_INVALID_DEVICE_REQUEST
    25. ...
    26. PAGE:00012B2A ; ---------------------------------------------------------------------------
    27. PAGE:00012B2A
    28. PAGE:00012B2A loc_12B2A:
    29. PAGE:00012B2A                 cmp     eax, 0B0190h    ; IOCTL_HID_GET_DRIVER_CONFIG
    30. PAGE:00012B2F                 jb      short loc_12AD8
    31. PAGE:00012B31                 cmp     eax, 0B0194h    ; IOCTL_HID_SET_DRIVER_CONFIG
    32. PAGE:00012B36                 jbe     short loc_12B85
    33. PAGE:00012B38                 cmp     eax, 0B0196h    ; другие IOCTL_HID_XXX
    34. PAGE:00012B3D                 jbe     short loc_12AD8
    35. PAGE:00012B3F                 cmp     eax, 0B0198h
    36. PAGE:00012B44                 jbe     short loc_12B85
    37. PAGE:00012B46                 cmp     eax, 0B019Ah
    38. PAGE:00012B4B                 jz      short loc_12B85
    39. PAGE:00012B4D                 cmp     eax, 0B019Ch
    40. PAGE:00012B52                 jz      short loc_12B85
    41. PAGE:00012B54                 cmp     eax, 0B019Eh
    42. PAGE:00012B59                 jmp     short loc_12B7F
    43. PAGE:00012B5B ; ---------------------------------------------------------------------------
    44. PAGE:00012B5B
    45. PAGE:00012B5B loc_12B5B:
    46. PAGE:00012B5B                 mov     ecx, 0B01E2h    ; IOCTL_HID_GET_INDEXED_STRING
    47. PAGE:00012B60                 cmp     eax, ecx
    48. PAGE:00012B62                 ja      short loc_12BAA ; IOCTL_KEYBOARD_QUERY_IME_STATUS
    49. PAGE:00012B64                 jz      short loc_12B85
    50. PAGE:00012B66                 sub     eax, 0B01A4h    ; IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS
    51. PAGE:00012B6B                 jz      short loc_12B85
    52. PAGE:00012B6D                 sub     eax, 4          ; IOCTL_HID_GET_COLLECTION_INFORMATION
    53. PAGE:00012B70                 jz      short loc_12B85
    54. PAGE:00012B72                 sub     eax, 12h        ; IOCTL_HID_GET_MANUFACTURER_STRING
    55. PAGE:00012B75                 jz      short loc_12B85
    56. PAGE:00012B77                 sub     eax, 4          ; IOCTL_HID_GET_PRODUCT_STRING
    57. PAGE:00012B7A
    58. PAGE:00012B7A loc_12B7A:
    59. PAGE:00012B7A                 jz      short loc_12B85
    60. PAGE:00012B7C                 sub     eax, 4          ; IOCTL_GET_SYS_BUTTON_EVENT
    61. ...
    62. PAGE:00012BAA ; ---------------------------------------------------------------------------
    63. PAGE:00012BAA
    64. PAGE:00012BAA loc_12BAA:
    65. PAGE:00012BAA                 sub     eax, 0B1000h    ; IOCTL_KEYBOARD_QUERY_IME_STATUS
    66. PAGE:00012BAF                 jz      loc_12B18
    67. PAGE:00012BB5                 sub     eax, 4          ; IOCTL_KEYBOARD_SET_IME_STATUS
    68. PAGE:00012BB8                 jz      loc_12B18
    69. PAGE:00012BBE                 sub     eax, 1E313Ch    ; IOCTL_GET_SYS_BUTTON_CAPS
    70. PAGE:00012BC3                 jmp     short loc_12B7A
    71. PAGE:00012BC5 ; ---------------------------------------------------------------------------
    72. ...
    73. PAGE:00012DBC _KeyboardClassDeviceControl@8 endp
     
  4. hilete

    hilete New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    28
    большое спасибо за скорый ответ!