перерыл сеть, поискал на форуме. кроме китайских, корейских и японских страниц ничего не нашел... что странно. даже MSDN в ответ на запрос IOCTL_KEYBOARD_INSERT_DATA ничего не находит. кто-нибудь пробовал посылать сканкоды подключаясь к '\Device\KeyboardClass0'? делаю это примерно так (Four-F, взял за основу твой KbdGarland.asm) Код (Text): local kid:KEYBOARD_INPUT_DATA local dwBytesReturned:DWORD ... invoke DefineDosDevice, DDD_RAW_TARGET_PATH, $CTA0("KbdGarland"), $CTA0("\\Device\\KeyboardClass0") .if eax != 0 invoke CreateFile, $CTA0("\\\\.\\KbdGarland"), 0, 0, NULL, OPEN_EXISTING, 0, NULL .if eax != INVALID_HANDLE_VALUE mov hDevice, eax lea esi, kid assume esi:ptr KEYBOARD_INPUT_DATA mov [esi].UnitId, 0h ;код клавиатуры 0 mov [esi].MakeCode, 02h ;код кнопки '0' mov [esi].Flags, KEY_MAKE ; key down invoke DeviceIoControl, hDevice, IOCTL_KEYBOARD_INSERT_DATA, addr kid, sizeof kid, \ NULL, 0, addr dwBytesReturned, NULL .... mov [esi].Flags, KEY_BREAK ;key up invoke DeviceIoControl, hDevice, IOCTL_KEYBOARD_INSERT_DATA, addr kid, sizeof kid, \ NULL, 0, addr dwBytesReturned, NULL ... я вообще верно понимаю назначение 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 его не не понимает?
DeviceIoControl возвращает 0 (стало быть неуспешная операция) GetLastError возвращает STATUS_WAIT_1 (0x00000001, по крайней мере по NTSTATUS это STATUS_WAIT_1)
Судя по дизасму, kbdclass (XP+SP2) не понимает этого кода. Если он встречается в хидерах, то это не значит, что он поддерживается. Может планировали поддержку, потом отказались. Может когда-то была, потом убрали и т.д и т.п. Код (Text): PAGE:00012A44 _KeyboardClassDeviceControl@8 proc near ... PAGE:00012A9C mov eax, [esi+0Ch] ; ControlCode PAGE:00012A9F mov ecx, 0B01A0h ; IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS PAGE:00012AA4 cmp eax, ecx PAGE:00012AA6 ja loc_12B5B ; IOCTL_HID_GET_INDEXED_STRING PAGE:00012AAC jz loc_12B85 PAGE:00012AB2 PAGE:00012AB2 mov ecx, 0B0080h ; IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION PAGE:00012AB7 cmp eax, ecx PAGE:00012AB9 ja short loc_12B2A ; IOCTL_HID_GET_DRIVER_CONFIG PAGE:00012ABB jz short loc_12B18 PAGE:00012ABD sub eax, 0B0000h ; IOCTL_KEYBOARD_QUERY_ATTRIBUTES PAGE:00012AC2 jz short loc_12B18 PAGE:00012AC4 sub eax, 4 ; IOCTL_KEYBOARD_SET_TYPEMATIC PAGE:00012AC7 jz short loc_12B0C PAGE:00012AC9 sub eax, 4 ; IOCTL_KEYBOARD_SET_INDICATORS PAGE:00012ACC jz short loc_12AF2 PAGE:00012ACE sub eax, 18h ; IOCTL_KEYBOARD_QUERY_TYPEMATIC PAGE:00012AD1 jz short loc_12B18 PAGE:00012AD3 sub eax, 20h ; IOCTL_KEYBOARD_QUERY_INDICATORS PAGE:00012AD6 jz short loc_12B18 PAGE:00012AD8 loc_12AD8: PAGE:00012AD8 mov esi, STATUS_INVALID_DEVICE_REQUEST ... PAGE:00012B2A ; --------------------------------------------------------------------------- PAGE:00012B2A PAGE:00012B2A loc_12B2A: PAGE:00012B2A cmp eax, 0B0190h ; IOCTL_HID_GET_DRIVER_CONFIG PAGE:00012B2F jb short loc_12AD8 PAGE:00012B31 cmp eax, 0B0194h ; IOCTL_HID_SET_DRIVER_CONFIG PAGE:00012B36 jbe short loc_12B85 PAGE:00012B38 cmp eax, 0B0196h ; другие IOCTL_HID_XXX PAGE:00012B3D jbe short loc_12AD8 PAGE:00012B3F cmp eax, 0B0198h PAGE:00012B44 jbe short loc_12B85 PAGE:00012B46 cmp eax, 0B019Ah PAGE:00012B4B jz short loc_12B85 PAGE:00012B4D cmp eax, 0B019Ch PAGE:00012B52 jz short loc_12B85 PAGE:00012B54 cmp eax, 0B019Eh PAGE:00012B59 jmp short loc_12B7F PAGE:00012B5B ; --------------------------------------------------------------------------- PAGE:00012B5B PAGE:00012B5B loc_12B5B: PAGE:00012B5B mov ecx, 0B01E2h ; IOCTL_HID_GET_INDEXED_STRING PAGE:00012B60 cmp eax, ecx PAGE:00012B62 ja short loc_12BAA ; IOCTL_KEYBOARD_QUERY_IME_STATUS PAGE:00012B64 jz short loc_12B85 PAGE:00012B66 sub eax, 0B01A4h ; IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS PAGE:00012B6B jz short loc_12B85 PAGE:00012B6D sub eax, 4 ; IOCTL_HID_GET_COLLECTION_INFORMATION PAGE:00012B70 jz short loc_12B85 PAGE:00012B72 sub eax, 12h ; IOCTL_HID_GET_MANUFACTURER_STRING PAGE:00012B75 jz short loc_12B85 PAGE:00012B77 sub eax, 4 ; IOCTL_HID_GET_PRODUCT_STRING PAGE:00012B7A PAGE:00012B7A loc_12B7A: PAGE:00012B7A jz short loc_12B85 PAGE:00012B7C sub eax, 4 ; IOCTL_GET_SYS_BUTTON_EVENT ... PAGE:00012BAA ; --------------------------------------------------------------------------- PAGE:00012BAA PAGE:00012BAA loc_12BAA: PAGE:00012BAA sub eax, 0B1000h ; IOCTL_KEYBOARD_QUERY_IME_STATUS PAGE:00012BAF jz loc_12B18 PAGE:00012BB5 sub eax, 4 ; IOCTL_KEYBOARD_SET_IME_STATUS PAGE:00012BB8 jz loc_12B18 PAGE:00012BBE sub eax, 1E313Ch ; IOCTL_GET_SYS_BUTTON_CAPS PAGE:00012BC3 jmp short loc_12B7A PAGE:00012BC5 ; --------------------------------------------------------------------------- ... PAGE:00012DBC _KeyboardClassDeviceControl@8 endp