多设备驱动? (KMDF / WDF)

时间:2011-09-15 12:09:10

标签: windows driver wdf

我刚刚写了一个KMDF USB驱动程序。现在我想将几个(最多至少四个)设备连接到PC。我从哪里开始?我注意到当我将第二个设备连接到PC时,它使用与第一个连接设备完全相同的驱动程序实例。 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 :(得分:0)

所有连接设备的内存中只有一个驱动程序实例(它是一个单例)。对驱动程序的OS调用伴随有相关的设备上下文,从那时起设备不应干扰彼此的操作。如果使用非常量全局/静态变量,问题就会开始。由于内核空间是共享的,因此这些变量实际上将被共享并可从所有连接的设备访问。因此,全局/静态数据不应该是特定于设备的,因为它是共享资源,所以应该加以保护。 WDK中有一些示例演示了多设备驱动程序。