Драйвер нескольких устройств? (KMDF / ФРЖ) - PullRequest
0 голосов
/ 15 сентября 2011

Я только что написал драйвер KMDF USB. Теперь я хочу подключить несколько (до четырех) устройств к ПК. С чего мне начать? Я заметил, что когда я подключаю второе устройство к ПК, оно использует тот же экземпляр драйвера, что и для первого подключенного устройства. EvtDeviceAdd (...) запускается один раз для каждого устройства, и поскольку у меня нет какой-либо обработки для нескольких устройств, все становится странным ... Сейчас мой EvtDeviceAdd выглядит следующим образом:

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

С чего мне начать? Есть ли хорошие примеры?

1 Ответ

0 голосов
/ 23 октября 2012

В памяти только один экземпляр драйвера для всех подключенных устройств (это одноэлементный). Вызовы ОС драйверу сопровождаются соответствующим контекстом устройства, и с этого момента устройства не должны мешать друг другу. Проблемы начинаются, если используются непостоянные глобальные / статические переменные. Поскольку пространство ядра является общим, такие переменные будут фактически общими и доступными для всех подключенных устройств. По этой причине глобальные / статические данные не должны быть привязаны к конкретному устройству и должны быть защищены, так как это общий ресурс. В WDK есть несколько примеров, демонстрирующих драйверы для нескольких устройств.

...