эмуляция нажатия клавиш

Тема в разделе "WASM.NT.KERNEL", создана пользователем leo456546, 19 мар 2009.

  1. leo456546

    leo456546 New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2009
    Сообщения:
    2
    задача: эмуляция нажатия клавиш через порты контроллера 8042
    Как писать в порты разобрался, нашел описание http://heim.ifi.uio.no/~stanisls/helppc/8042.html

    Подскажите в какой последовательности в какой порт что писать чтобы эмулировать нажатие клавиш.
     
  2. akim_

    akim_ New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    6
    Код (Text):
    1. typedef struct {
    2.     unsigned short  IDTLimit;
    3.     unsigned short  LowIDTBase;
    4.     unsigned short  HiIDTBase;
    5. } IDTINFO;          // Содержание регистра IDTR
    6.  
    7. typedef struct {
    8.     unsigned short  LowOffset;
    9.     unsigned short  selector;
    10.     unsigned char   unused_lo;
    11.     unsigned char   unused_hi:4;
    12.     unsigned char   DPL:4;
    13.     unsigned short  HiOffset;
    14. } IDTENTRY;         // Запись в таблице IDT
    15.  
    16. unsigned long OldInt;
    17. IDTENTRY *idt_entry;
    18. IDTINFO idt_info;
    19.  
    20. _asm {
    21.         sidt    idt_info;
    22.     }
    23.  
    24. idt_entry = (IDTENTRY*) ((long)(((unsigned short)idt_info.LowIDTBase) | ((unsigned long)((unsigned short)idt_info.HiIDTBase)) << 16));
    25.  
    26. OldInt = ((long)(((unsigned short)idt_entry[0x93].LowOffset) | ((unsigned long)((unsigned short)idt_entry[0x93].HiOffset)) << 16));
    С помощью этого кода можно найти адрес прерывания от клавитуры (OldInt).

    Далее нужно записать в буфер клавиатуры сканкод и передать управление обработчику прерывания.
     
  3. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    если не ошибаюсь, запись во внутренний буфер клавы осущ-ся командой D2h в порт 64h, а затем запись собстно сканкода в порт 60h.
     
  4. leo456546

    leo456546 New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2009
    Сообщения:
    2
    спасибо
     
  5. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Вот фрагмент драйвера пищущего в порт ps/2:
    Код (Text):
    1. const ULONG IBUFFER_FULL = 0x02;
    2. const PUCHAR KBD_PORT_60 = (PUCHAR)0x60;
    3. const PUCHAR KBD_PORT_64 = (PUCHAR)0x64;
    4.  
    5. ULONG wait_kbd()
    6. {
    7.     UCHAR chr;
    8.     ULONG i;
    9.     for (i = 0; i < 100; i ++) // do at most 1000 iterations
    10.     {      
    11.         chr = READ_PORT_UCHAR(KBD_PORT_64);
    12.         if (! (chr & 0x02)) break;
    13.         KeStallExecutionProcessor(50);
    14.     }
    15.     return i != 100;
    16. }
    17.  
    18. NTSTATUS device_io(PDEVICE_OBJECT device_object, PIRP irp)
    19. {
    20.     __try
    21.     {          
    22.         PUCHAR buf = irp->AssociatedIrp.SystemBuffer;
    23.         ULONG i;
    24.         for (i = 0; buf[i]; i ++)
    25.         {
    26.             WRITE_PORT_UCHAR(KBD_PORT_64, 0xD2);
    27.             wait_kbd();            
    28.             WRITE_PORT_UCHAR(KBD_PORT_60, buf[i]);
    29.             wait_kbd();
    30.         }
    31.     }
    32.     __except(EXCEPTION_EXECUTE_HANDLER)
    33.     {
    34.         DbgPrint("memory access error");
    35.     }
    36.     IoCompleteRequest(irp, IO_NO_INCREMENT);
    37.     return STATUS_SUCCESS;
    38. }
     
  6. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Все так, только надо вроде еще вычитать из буфера быйты подтверждения ACK(0xFA), если опять чего не забыл)))
     
  7. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    А данный способ будет палица фаерволами?