Драйвер фильтра клавиатуры не отвечает

#keyboard #driver #wdk

#клавиатура #драйвер #wdk

Вопрос:

Я написал простой драйвер фильтра клавиатуры (MyKbdFilter), зарегистрировал его в реестре и добавил в HLM SYSTEM CurrentControlSet Control Class{4D36E96B-E325-11CE-BFC1-08002BE10318}UpperFilters MyKbdFilter. Теперь у меня есть: «kbdclass MyKbdFilter». Итак, при создании нового стека устройств для клавиатуры я получаю MyKbdFilter-> kdbclass-> kbHid-> HidUsb. Когда я подключаю клавиатуру, я вижу, что вызываются DriverEntry, AddDevice, DispatchThru и DispatchPNP. Но клавиатура не отвечает. При нажатии клавиши ни DispatchRead, ни другие функции не вызываются. Вот мой код:

 NTSTATUS DriverEntry(IN DRIVER_OBJECT* pDriverObject, IN UNICODE_STRING* pRegPath) {    
    int i;
    NTSTATUS status;


    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i  ) {
        pDriverObject->MajorFunction[i] = DispatchThru;
    }

    pDriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;

    pDriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
    pDriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPNP;

    pDriverObject->DriverUnload = UnloadDriver;

    pDriverObject->DriverExtension->AddDevice = AddDevice;

    return STATUS_SUCCESS;
}

NTSTATUS AddDevice(IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pTargetDeviceObject){
    PDEVICE_OBJECT pSourceDeviceObject, pDeviceObject;
    PDEVICE_EXTENSION pDeviceExtension;
    NTSTATUS status;

    status = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, 0, FALSE, amp;pSourceDeviceObject);

    pDeviceExtension = (PDEVICE_EXTENSION) pSourceDeviceObject->DeviceExtension;

    pDeviceObject = IoAttachDeviceToDeviceStack(pSourceDeviceObject, pTargetDeviceObject);

    pDeviceExtension->pLowerDeviceObject = pTargetDeviceObject;

    pSourceDeviceObject->Flags = pDeviceObject->Flags amp; (DO_BUFFERED_IO | DO_POWER_PAGABLE | DO_DIRECT_IO);
    pSourceDeviceObject->Flags = pDeviceObject->Flags amp;= ~DO_DEVICE_INITIALIZING;

    return status;
}

NTSTATUS DispatchThru(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) {
    IoSkipCurrentIrpStackLocation(pIrp);

    return IoCallDriver(((PDEVICE_EXTENSION) pDeviceObject->DeviceExtension)->pLowerDeviceObject ,pIrp);    
}

NTSTATUS DispatchRead(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) {
    IoSkipCurrentIrpStackLocation(pIrp);

    return IoCallDriver(((PDEVICE_EXTENSION) pDeviceObject->DeviceExtension)->pLowerDeviceObject ,pIrp);    
}
  

РЕДАКТИРОВАТЬ: я использую Windows 7.

Ответ №1:

 pDeviceObject = IoAttachDeviceToDeviceStack(pSourceDeviceObject, pTargetDeviceObject);
pDeviceExtension->pLowerDeviceObject = pTargetDeviceObject;
  

это ошибка :
необходимость по смыслу pDeviceExtension->pLowerDeviceObject = pDeviceObject;

но действительно правильный код

 IoAttachDeviceToDeviceStackSafe(pSourceDeviceObject, pTargetDeviceObject, amp;pDeviceExtension->pLowerDeviceObject);
  

это основной момент, который просто виден.

 pSourceDeviceObject->Flags = pDeviceObject->Flags amp;= ~DO_DEVICE_INITIALIZING;
  

еще одна ошибка — необходимо:

 pSourceDeviceObject->Flags amp;= ~DO_DEVICE_INITIALIZING;
  

Комментарии:

1. Спасибо! Я не знаю, почему я установил lowerdevice на более высокое значение)