Получение сканкода клавиш в обработчике IRP_MJ_READ.

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

  1. serg128

    serg128 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    55
    Народ, подскажите пожалуйста:
    пишу фильтр клавиатуры, отлавливаю клавиши, мне необходим их сканкод.
    Вот обработчик нажатия клавиш:
    Код (Text):
    1. DriverObject->MajorFunction [IRP_MJ_READ] = DispatchRead;
    2. ...
    3. NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    4. {
    5.     PKEYBOARD_INPUT_DATA     KeyData;
    6.     KeyData = Irp->AssociatedIrp.SystemBuffer;
    7.     DbgPrint("Key pressed: %d", KeyData[0].MakeCode);
    8.  
    9.     IoCopyCurrentIrpStackLocationToNext(Irp);
    10.     return IoCallDriver(((PDEVICE_EXTENSION)DeviceObject->DeviceExtension)->TopOfStack, Irp);
    11. }
    И мне MakeCode постоянно возвращает 0. Как мне до сканкода добраться правильно?
     
  2. Korn

    Korn New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    4
    Код (Text):
    1. NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    2. {
    3.  
    4.     PDEVICE_EXTENSION   devExt;
    5.     PIO_STACK_LOCATION  currentIrpStack;
    6.     PIO_STACK_LOCATION  nextIrpStack;
    7.  
    8.     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    9.     currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
    10.     nextIrpStack = IoGetNextIrpStackLocation(Irp);    
    11.  
    12.     *nextIrpStack = *currentIrpStack;
    13.  
    14.     [b]IoSetCompletionRoutine( Irp, ReadComplete,DeviceObject, TRUE, TRUE, TRUE ); [/b]
    15.  
    16.     [b]return IoCallDriver( devExt->TopOfStack, Irp ); [/b]
    17.  
    18. }
    19.  
    20. NTSTATUS ReadComplete(
    21.     IN PDEVICE_OBJECT DeviceObject,
    22.     IN PIRP Irp,
    23.     IN PVOID Context
    24.     )
    25. {
    26.     PIO_STACK_LOCATION        IrpSp;
    27.     PKEYBOARD_INPUT_DATA      KeyData;
    28.  
    29.     IrpSp = IoGetCurrentIrpStackLocation( Irp );
    30.     if( NT_SUCCESS( Irp->IoStatus.Status ) ) {
    31.  
    32.         KeyData = Irp->AssociatedIrp.SystemBuffer;
    33.  
    34.         DbgPrint(("ScanCode: %x ", KeyData[i].MakeCode ));
    35.     }
    36.  
    37.     if( Irp->PendingReturned ) {
    38.  
    39.         IoMarkIrpPending( Irp );
    40.     }
    41.  
    42.     return Irp->IoStatus.Status;
    43. }
    Смотрите исходник ctrl2cap.
     
  3. serg128

    serg128 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    55
    спасибо, со сканкодами разобрался. Но перестала работать выгрузка драйвера. Как корректно завершить поток, обрабатывающий нажатия?
     
  4. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    поток только сам себя может завершить