2011-09-15 210 views
0

我剛剛寫了一個KMDF USB驅動程序。現在我想連接幾臺(最多四臺)設備到PC。我從哪說起呢?我注意到,當我將第二個設備連接到PC時,它使用與第一個連接設備相同的驅動程序實例。 EvtDeviceAdd(...)運行一次,每個設備,因爲我沒有幾個設備事情變得怪異任何處理......現在我EvtDeviceAdd看起來是這樣的:多設備驅動程序? (KMDF/WDF)

NTSTATUS EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) { 
    WDF_PNPPOWER_EVENT_CALLBACKS  pnpPowerCallbacks; 
    WDF_OBJECT_ATTRIBUTES    attributes; 
    NTSTATUS       status; 
    WDFDEVICE       device; 
    WDF_DEVICE_PNP_CAPABILITIES   pnpCaps; 
    WDF_IO_QUEUE_CONFIG     ioQueueConfig; 
    PDEVICE_CONTEXT      pDevContext; 
    WDFQUEUE       queue; 
    PWSTR        driverRegistryPath; 

    UNREFERENCED_PARAMETER(Driver); 
    PAGED_CODE(); 

    DbgPrint("New device was added\n"); 

    WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); 
    pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware; 
    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); 

    WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoBuffered); 

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT); 

    status = WdfDeviceCreate(&DeviceInit, &attributes, &device); 
    if (!NT_SUCCESS(status)) { 
     DbgPrint("WdfDeviceCreate failed with Status code %!STATUS!\n", status); 
     return status; 
    } 

    pDevContext = GetDeviceContext(device); 

    WDF_DEVICE_PNP_CAPABILITIES_INIT(&pnpCaps); 
    pnpCaps.SurpriseRemovalOK = WdfTrue; 

    WdfDeviceSetPnpCapabilities(device, &pnpCaps); 

    WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig, WdfIoQueueDispatchParallel); 

    ioQueueConfig.EvtIoRead = EvtIoRead; 
    ioQueueConfig.EvtIoWrite = EvtIoWrite; 
    ioQueueConfig.EvtIoDeviceControl = EvtIoDeviceControl; 
    ioQueueConfig.PowerManaged = WdfTrue; 

    status = WdfIoQueueCreate(device, &ioQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &queue); 
    if (!NT_SUCCESS(status)) { 
     DbgPrint("WdfIoQueueCreate failed %!STATUS!\n", status); 
     return status; 
    } 
    pDevContext->DeviceIOControlQueue = queue; 

    status = WdfDeviceCreateDeviceInterface(device, (LPGUID) &GUID_DEVINTERFACE_MYDEVICE, NULL); 

    if (!NT_SUCCESS(status)) { 
     DbgPrint("WdfDeviceCreateDeviceInterface failed %!STATUS!\n", status); 
     return status; 
    } 
} 

從哪裏開始?有什麼好的例子嗎?

回答

0

所有連接的設備在內存中只有一個驅動程序實例(它是一個單例)。操作系統對驅動程序的調用伴隨着相關的設備環境,從這一點來說,設備不應該干擾其他操作。如果使用非常量全局/靜態變量,則問題開始。由於內核空間是共享的,因此這些變量實際上將從所有連接的設備共享和訪問。由於這個原因,全局/靜態數據不應該是特定於設備的,因爲它是共享資源,所以應該保護它們。 WDK中有一些示例演示了多設備驅動程序。