2016-10-20 19 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: はここに私のコードで私は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

関連する問題