2011-09-15 41 views
0

私はKMDF USBドライバを書いたばかりです。今では、複数のデバイス(最大4つまで)をPCに接続したいと考えています。どこから始めますか?私は、2台目のデバイスをPCに接続すると、最初に接続されたデバイスと同じドライバのインスタンスを使用することに注意しました。 EvtDeviceAdd(...)は、デバイスごとに1回実行され、私は物事がおかしくなるので、いくつかのデバイスのための任意の取り扱いを持っていないので...今私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

接続されているすべてのデバイスのメモリ内に、ドライバのインスタンスは1つだけ存在します(シングルトンです)。ドライバーへのOS呼び出しには、関連するデバイスコンテキストが伴い、その時点から、デバイスは、互いの動作を妨害すべきではありません。非定数グローバル/静的変数が使用されている場合、問題が始まります。カーネルスペースは共有されているので、このような変数は実際に共有され、接続されているすべてのデバイスからアクセス可能です。このため、グローバル/静的データはデバイス固有のものであってはならず、共有リソースなので、ガードする必要があります。 WDKには、マルチデバイスドライバのデモンストレーションのサンプルがいくつかあります。

関連する問題