2011-09-15 4 views
0

방금 ​​KMDF USB 드라이버를 작성했습니다. 이제 여러 대의 장치 (최대 4 개 이상)를 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

연결된 모든 장치에 대해 드라이버의 인스턴스가 하나만 있습니다 (단 하나의 기능 임). 드라이버에 대한 OS 호출은 관련 장치 컨텍스트를 수반하며,이 시점부터 장치는 서로의 작업을 방해해서는 안됩니다. 비정상 글로벌/정적 변수가 사용되는 경우 문제가 시작됩니다. 커널 공간이 공유되므로 이러한 변수는 실제로 연결된 모든 장치에서 공유되고 액세스 할 수 있습니다. 이러한 이유 때문에 전역/정적 데이터는 장치별로 사용해서는 안되며 공유 리소스이므로 보호해야합니다. 다중 장치 드라이버를 시연하는 WDK에는 몇 가지 샘플이 있습니다.

관련 문제