Эмуляция клавиатуры

Тема в разделе "WASM.BEGINNERS", создана пользователем baga, 2 янв 2008.

  1. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    Привет, хочу сделать драйвер с помощью которого пользовательское приложение сможет эмулировать нажатие кнопок клавиатуры. Подскажите какую литературу лучше всего почитать по этому вопросу. Интересует именно работа с клавиатурой из kernel mode драйвера (win2k winxp).
    Спасибо.
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    http://heim.ifi.uio.no/~stanisls/helppc/8042.html
    Код (Text):
    1. wait:
    2.     in al, 0x64
    3.     test al, 2
    4.     jnz wait
    5.     ret
    6. ...
    7.     call wait
    8.     mov al, 0xD2
    9.     out 0x64, al
    10.     call wait
    11.     mov al, 0x1E ; записываем скан код
    12.     out 0x60, al
     
  3. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    спасибо, очень интересный сайт
     
  4. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    Драйвер:
    Код (Text):
    1. KbPs2Wait proc
    2.  
    3.     ; Wait until it's okay to send a command byte to the keyboard controller port.
    4. TestCmdPort:
    5.     in al, 64h
    6.     test al, 2 ; Check cntrlr input buffer full flag.
    7.     jnz TestCmdPort
    8.     ret
    9.  
    10. KbPs2Wait endp
    11.  
    12. KbPs2Write proc
    13.    
    14.     ; Save scancode
    15.     mov dl, al
    16.    
    17.     ; Wait until the keyboard controller does not contain data before
    18.     ; proceeding with shoving stuff down its throat.
    19. WaitWhileFull:
    20.     in al, 64h
    21.     test al, 1
    22.     jnz WaitWhileFull
    23.    
    24.     ; Tell the keyboard controller to take the next byte
    25.     ; sent to it and return it as a scan code.
    26.     call KbPs2Wait
    27.     mov al, 0d2h ; Return scan code command.
    28.     out 64h, al
    29.  
    30.     ; Send the scan code.
    31.     call KbPs2Wait
    32.     mov al, dl
    33.     out 60h, al
    34.     ret
    35.  
    36. KbPs2Write endp
    37.  
    38. DispatchControl proc uses esi edi pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    39.  
    40.     ; DeviceIoControl was called
    41.     ; We are in user process context here
    42.  
    43.     local status:NTSTATUS
    44.     local dwBytesReturned:DWORD
    45.  
    46.     and dwBytesReturned, 0
    47.  
    48.     mov esi, pIrp
    49.     assume esi:ptr _IRP
    50.  
    51.     IoGetCurrentIrpStackLocation esi
    52.     mov edi, eax
    53.     assume edi:ptr IO_STACK_LOCATION
    54.  
    55.     .if [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_KB_PS2_WRITE
    56.  
    57.             mov edi, [esi].AssociatedIrp.SystemBuffer
    58.             assume edi:ptr BYTE
    59.  
    60.             xor ebx, ebx
    61.             xor ecx, ecx
    62.             mov cl, [edi]
    63.            
    64.             .while( ebx < ecx )
    65.                 inc ebx
    66.                 mov al, [edi][ebx*(sizeof BYTE)]
    67.                 call KbPs2Write
    68.             .endw
    69.            
    70.             mov status, STATUS_SUCCESS
    71.     .else
    72.         mov status, STATUS_INVALID_DEVICE_REQUEST
    73.     .endif
    74.  
    75.     assume edi:nothing
    76.  
    77.     push status
    78.     pop [esi].IoStatus.Status
    79.  
    80.     push dwBytesReturned
    81.     pop [esi].IoStatus.Information
    82.  
    83.     assume esi:nothing
    84.  
    85.     fastcall IofCompleteRequest, esi, IO_NO_INCREMENT
    86.  
    87.     mov eax, status
    88.     ret
    89.  
    90. DispatchControl endp
    Приложение:
    Код (Text):
    1.     local abyScanCodes[7]:BYTE
    2.     local dwBytesReturned:DWORD
    3.  
    4.     lea esi, abyScanCodes
    5.     assume esi:ptr BYTE
    6.     mov [esi][0*(sizeof BYTE)], 6
    7.     mov [esi][1*(sizeof BYTE)], 01eh
    8.     mov [esi][2*(sizeof BYTE)], 09eh
    9.     mov [esi][3*(sizeof BYTE)], 01eh
    10.     mov [esi][4*(sizeof BYTE)], 09eh
    11.     mov [esi][5*(sizeof BYTE)], 01eh
    12.     mov [esi][6*(sizeof BYTE)], 09eh
    13.     assume esi:nothing
    14.  
    15.     invoke DeviceIoControl, hDevice, IOCTL_KB_PS2_WRITE, \
    16.         addr abyScanCodes, sizeof abyScanCodes, \
    17.         NULL, 0, addr dwBytesReturned, NULL
    Вопрос1: Это нормальный (правильный) способ передачи параметров?

    Вопрос2: Если эмулировать удерживание кнопки драйвер должен хранить массив нажатых кнопок и с некоторой задержкой отправлять для каждой btnup + btndown. Но так придется создавать поток внутри драйвера (или нет)? Проще конечно отправлять эти события через пользовательское приложение (не будет ли такой метод пустой тратой ресурсов)?
     
  5. baga

    baga New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    16
    Предыдущий вопрос снят :)
    Как быть с USB клавиатурой?
    Посоветуйте литературу о том как вообще работает система ввода в windows.