Привет, хочу сделать драйвер с помощью которого пользовательское приложение сможет эмулировать нажатие кнопок клавиатуры. Подскажите какую литературу лучше всего почитать по этому вопросу. Интересует именно работа с клавиатурой из kernel mode драйвера (win2k winxp). Спасибо.
http://heim.ifi.uio.no/~stanisls/helppc/8042.html Код (Text): wait: in al, 0x64 test al, 2 jnz wait ret ... call wait mov al, 0xD2 out 0x64, al call wait mov al, 0x1E ; записываем скан код out 0x60, al
Драйвер: Код (Text): KbPs2Wait proc ; Wait until it's okay to send a command byte to the keyboard controller port. TestCmdPort: in al, 64h test al, 2 ; Check cntrlr input buffer full flag. jnz TestCmdPort ret KbPs2Wait endp KbPs2Write proc ; Save scancode mov dl, al ; Wait until the keyboard controller does not contain data before ; proceeding with shoving stuff down its throat. WaitWhileFull: in al, 64h test al, 1 jnz WaitWhileFull ; Tell the keyboard controller to take the next byte ; sent to it and return it as a scan code. call KbPs2Wait mov al, 0d2h ; Return scan code command. out 64h, al ; Send the scan code. call KbPs2Wait mov al, dl out 60h, al ret KbPs2Write endp DispatchControl proc uses esi edi pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP ; DeviceIoControl was called ; We are in user process context here local status:NTSTATUS local dwBytesReturned:DWORD and dwBytesReturned, 0 mov esi, pIrp assume esi:ptr _IRP IoGetCurrentIrpStackLocation esi mov edi, eax assume edi:ptr IO_STACK_LOCATION .if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_KB_PS2_WRITE mov edi, [esi].AssociatedIrp.SystemBuffer assume edi:ptr BYTE xor ebx, ebx xor ecx, ecx mov cl, [edi] .while( ebx < ecx ) inc ebx mov al, [edi][ebx*(sizeof BYTE)] call KbPs2Write .endw mov status, STATUS_SUCCESS .else mov status, STATUS_INVALID_DEVICE_REQUEST .endif assume edi:nothing push status pop [esi].IoStatus.Status push dwBytesReturned pop [esi].IoStatus.Information assume esi:nothing fastcall IofCompleteRequest, esi, IO_NO_INCREMENT mov eax, status ret DispatchControl endp Приложение: Код (Text): local abyScanCodes[7]:BYTE local dwBytesReturned:DWORD lea esi, abyScanCodes assume esi:ptr BYTE mov [esi][0*(sizeof BYTE)], 6 mov [esi][1*(sizeof BYTE)], 01eh mov [esi][2*(sizeof BYTE)], 09eh mov [esi][3*(sizeof BYTE)], 01eh mov [esi][4*(sizeof BYTE)], 09eh mov [esi][5*(sizeof BYTE)], 01eh mov [esi][6*(sizeof BYTE)], 09eh assume esi:nothing invoke DeviceIoControl, hDevice, IOCTL_KB_PS2_WRITE, \ addr abyScanCodes, sizeof abyScanCodes, \ NULL, 0, addr dwBytesReturned, NULL Вопрос1: Это нормальный (правильный) способ передачи параметров? Вопрос2: Если эмулировать удерживание кнопки драйвер должен хранить массив нажатых кнопок и с некоторой задержкой отправлять для каждой btnup + btndown. Но так придется создавать поток внутри драйвера (или нет)? Проще конечно отправлять эти события через пользовательское приложение (не будет ли такой метод пустой тратой ресурсов)?
Предыдущий вопрос снят Как быть с USB клавиатурой? Посоветуйте литературу о том как вообще работает система ввода в windows.