2016-10-20 10 views
0

Я написал простой драйвер фильтра клавиатуры (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, &pSourceDeviceObject); 

    pDeviceExtension = (PDEVICE_EXTENSION) pSourceDeviceObject->DeviceExtension; 

    pDeviceObject = IoAttachDeviceToDeviceStack(pSourceDeviceObject, pTargetDeviceObject); 

    pDeviceExtension->pLowerDeviceObject = pTargetDeviceObject; 

    pSourceDeviceObject->Flags = pDeviceObject->Flags & (DO_BUFFERED_IO | DO_POWER_PAGABLE | DO_DIRECT_IO); 
    pSourceDeviceObject->Flags = pDeviceObject->Flags &= ~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);  
} 

EDIT: Я использую окна 7.

ответ

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

это ошибка: потребность в ощущении pDeviceExtension->pLowerDeviceObject = pDeviceObject;

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

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

это главный пункт, который только видно.

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

еще одна ошибка - необходимость:

pSourceDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; 
+0

Спасибо! Я не знаю, почему я установил lowdevice, чтобы быть выше) – Michael

 Смежные вопросы

  • Нет связанных вопросов^_^