Есть ли у когото откомпилированный драйвер эмулятора клавиатуры?

Тема в разделе "WASM.BEGINNERS", создана пользователем Albond, 30 апр 2009.

  1. Albond

    Albond New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2009
    Сообщения:
    2
    Очень нужен эмулятор нажатия клавишь клавиатуры через драйвер. Думал смогу вспомнить как там драйвера делать, но прошло много времени когда последний раз этой темы касалася. Сижу на 2008 и попробывал пару семплов запустить. Все при выгрузки закончились BSOD. Сама программа как вы понимаете не большая. Выглядит где-то так основной код:

    Код (Text):
    1. void KeyScanCode(char key) {
    2.   _asm {
    3.       pusha
    4.       cli
    5.       mov dl, key
    6.  
    7.       mov ecx,10000h
    8.  
    9. WaitWhlFull:
    10.       in al, 64h
    11.       test al, 1
    12.       loopnz WaitWhlFull
    13.  
    14.       mov ecx,10000h
    15.  
    16. TstCmdPortLp1:
    17.       in al, 64h
    18.       test al, 2
    19.       loopnz TstCmdPortLp1
    20.  
    21.       mov al, 0d2h
    22.       out 64h, al
    23.  
    24.       mov ecx,10000h
    25.  
    26. TstCmdPortLp2:
    27.       in al, 64h
    28.       test al, 2
    29.       loopnz TstCmdPortLp2
    30.  
    31.       mov al, dl
    32.       out 60h, al
    33.  
    34.       sti
    35.       popa
    36.   }
    37. }
    У драйвера нужно две управляющие функции: клавиша нажата и отжата. Ну и по буферу передавать сканкод клавиши.

    Если у кого есть готовый sys файл был бы очень рад. Если есть исходник готовый к компиляции то тоже буду рад, а то на форуме все не законченные варианты.
     
  2. Albond

    Albond New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2009
    Сообщения:
    2
    Ну ладно отвечу сам )) Вообщем кое как доделал. По поводу того как я на функцию проверяю попрошу без коментов. Делал быстро.



    Код (Text):
    1. extern "C" {
    2. #include <ntddk.h>
    3. #include <ntifs.h>
    4.             }
    5.  
    6. #define IOCTL_IO_CONTROL  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
    7. #define IOCTL2_IO_CONTROL  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
    8. #define NT_DEVICE_NAME          L"\\Device\\AlbondKeyBoard"
    9. #define NT_D_LINK_NAME          L"\\DosDevices\\AlbondKeyBoard"
    10.  
    11.  
    12. typedef struct _IO_STRUCT_DRIVER {
    13.     ULONG inc;
    14.     ULONG dec;
    15. } IO_STRUCT_DRIVER, *PIO_STRUCT_DRIVER;
    16.  
    17.  
    18.  
    19.  
    20. PDEVICE_OBJECT    pDeviceObject = NULL;
    21. UNICODE_STRING    ntDeviceName;
    22. UNICODE_STRING    g_usSymbolicLinkName;
    23.  
    24. void KeyScanCode(char key) {
    25.   _asm {
    26.       pusha
    27.       cli
    28.       mov dl, key
    29.  
    30.       mov ecx,10000h
    31.  
    32. WaitWhlFull:
    33.       in al, 64h
    34.       test al, 1
    35.       loopnz WaitWhlFull
    36.  
    37.       mov ecx,10000h
    38.  
    39. TstCmdPortLp1:
    40.       in al, 64h
    41.       test al, 2
    42.       loopnz TstCmdPortLp1
    43.  
    44.       mov al, 0d2h
    45.       out 64h, al
    46.  
    47.       mov ecx,10000h
    48.  
    49. TstCmdPortLp2:
    50.       in al, 64h
    51.       test al, 2
    52.       loopnz TstCmdPortLp2
    53.  
    54.       mov al, dl
    55.       out 60h, al
    56.  
    57.       sti
    58.       popa
    59.   }
    60. }
    61.  
    62. void KeyEmulate(char key) {
    63.   KeyScanCode(key);
    64.   KeyScanCode(key|0x80);
    65. }
    66.  
    67. NTSTATUS DispatchControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
    68. {
    69.  
    70.   _IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation(Irp);
    71.   NTSTATUS status = STATUS_SUCCESS;
    72.   ULONG dwBytesReturned = 0;
    73.  
    74.  DbgPrint("In IO Control.");
    75.  
    76.  if ((IoGetCurrentIrpStackLocation(Irp)->Parameters.DeviceIoControl.IoControlCode==0x222000) && (stack->Parameters.DeviceIoControl.InputBufferLength == sizeof(char)))
    77.  {
    78.    DbgPrint("Irp->IoControlCode==0x800");
    79.    char st = *((PCHAR)Irp->AssociatedIrp.SystemBuffer);
    80.    KeyScanCode(st);
    81.  }
    82.  
    83.  if ((IoGetCurrentIrpStackLocation(Irp)->Parameters.DeviceIoControl.IoControlCode==0x222004) && (stack->Parameters.DeviceIoControl.InputBufferLength == sizeof(char)))
    84.  {
    85.    DbgPrint("Irp->IoControlCode==0x801");
    86.    char st = *((PCHAR)Irp->AssociatedIrp.SystemBuffer);
    87.    KeyScanCode(st|0x80);
    88.  }
    89.  
    90.  DbgPrint("Irp->IoControlCode==%x",IoGetCurrentIrpStackLocation(Irp)->Parameters.DeviceIoControl.IoControlCode);
    91.  
    92.      Irp->IoStatus.Status = status;
    93.      Irp->IoStatus.Information = 0;
    94.  
    95.      IoCompleteRequest(Irp,IO_NO_INCREMENT);
    96.      return status;
    97.  
    98. }
    99.  
    100.  
    101. NTSTATUS DrCreatClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
    102. {
    103.  
    104.   Irp->IoStatus.Status = STATUS_SUCCESS;
    105.   Irp->IoStatus.Information = 0;
    106.   IoCompleteRequest(Irp,IO_NO_INCREMENT);
    107.   return Irp->IoStatus.Status;
    108.  
    109. }
    110.  
    111.  
    112.  
    113. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    114. {
    115.  
    116.   IoDeleteSymbolicLink(&g_usSymbolicLinkName);
    117.  
    118.   IoDeleteDevice(pDeviceObject);
    119. }
    120.  
    121.  
    122. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    123.  
    124. {
    125.  
    126.   NTSTATUS status;
    127.  
    128.  
    129.   RtlInitUnicodeString(&ntDeviceName,NT_DEVICE_NAME);
    130.   RtlInitUnicodeString(&g_usSymbolicLinkName,NT_D_LINK_NAME);
    131.  
    132.  
    133.   status = IoCreateDevice(DriverObject,0,&ntDeviceName, FILE_DEVICE_UNKNOWN,0,TRUE, &pDeviceObject);
    134.   if (status==STATUS_SUCCESS)
    135.    status = IoCreateSymbolicLink(&g_usSymbolicLinkName, &ntDeviceName);
    136.      if (status==STATUS_SUCCESS)
    137.      {
    138.         DbgPrint("DrCreatClose - IRP_MJ_CREATE");
    139.       DriverObject->MajorFunction[IRP_MJ_CREATE]         = DrCreatClose;
    140.       DbgPrint("DrCreatClose - IRP_MJ_CLOSE");
    141.       DriverObject->MajorFunction[IRP_MJ_PNP]          = DrCreatClose;
    142.       DbgPrint("DriverUnload");
    143.       DriverObject->DriverUnload                         = DriverUnload;
    144.       DbgPrint("DispatchControl - IRP_MJ_DEVICE_CONTROL");
    145.       DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl;
    146.      }
    147.  
    148. return STATUS_SUCCESS;
    149. }
     
  3. Andrej

    Andrej New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2010
    Сообщения:
    4
    Взаимно ;)
    "Если у кого есть готовый sys файл был бы очень рад. Если есть исходник готовый к компиляции то тоже буду рад, а то на форуме все не законченные варианты."