2016-10-20 78 views
0

我写了一个简单的键盘过滤驱动程序(MyKbdFilter),其注册注册表,并添加到HLM \系统\ CurrentControlSet \控制\ {类4D36E96B-E325-11CE-BFC1-08002BE10318} \的UpperFilters MyKbdFilter。现在我有:“kbdclass MyKbdFilter”。所以,当为键盘构建一个新的设备堆栈时,我会得到MyKbdFilter-> kdbclass-> kbHid-> HidUsb。当我插入键盘时,我看到DriverEntry,AddDevice,DispatchThru和DispatchPNP被调用。但键盘没有响应。在关键笔划上既不调用DispatchRead也不调用其他函数。 这里是我的代码:键盘过滤驱动程序不responsing

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);  
} 

编辑:我使用Windows 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

谢谢!我不知道为什么我会设置较低的设备) – Michael

相关问题