IWDFUsbTargetFactory::CreateUsbTargetDevice 方法 (wudfusb.h)

[警告: UMDF 2 是最新版本的 UMDF,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 未向 UMDF 1 添加新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。 有关详细信息,请参阅使用 UMDF 入门。]

CreateUsbTargetDevice 方法创建也是 I/O 目标的 USB 设备对象。

语法

HRESULT CreateUsbTargetDevice(
  [out] IWDFUsbTargetDevice **ppDevice
);

参数

[out] ppDevice

指向缓冲区的指针,该缓冲区接收指向 USB 目标设备对象的 IWDFUsbTargetDevice 接口的指针。

返回值

CreateUsbTargetDevice 返回以下值之一:

返回代码 说明
S_OK

CreateUsbTargetDevice 已成功创建也是 I/O 目标的 USB 设备对象。

E_OUTOFMEMORY

CreateUsbTargetDevice 遇到分配失败。

Winerror.h 中定义的错误代码
此值对应于 WinUsb_Initialize 函数返回的错误代码。

注解

当驱动程序使用 接口完成时,UMDF 驱动程序应释放 CreateUsbTargetDevice 方法在 ppDevice 参数中返回的 IWDFUsbTargetDevice 接口指针。

如果需要与创建的 I/O 目标对象关联的文件对象,驱动程序应调用 IWDFIoTarget::GetTargetFile 方法。 有关此文件对象的详细信息,请参阅 通过 USB I/O 目标创建文件

注意CreateUsbTargetDevice 继承 IWDFIoTarget 接口的所有方法。
 
若要在设备堆栈中使用新创建的 USB I/O 目标对象,安装 UMDF 驱动程序的 INF 文件必须包含 UmdfDispatcher 指令,并在 DDInstall.WDF 节中将 UmdfDispatcher 设置为 WinUsb (UmdfDispatcher=WinUsb) 。 UmdfDispatcher 需要通知 UMDF 平台可以允许访问 USB I/O 目标。 有关 UmdfDispatcher 的详细信息,请参阅 指定 WDF 指令

示例

下面的代码示例演示如何在 UMDF 驱动程序的 IPnpCallbackHardware::OnPrepareHardware 方法的实现中创建和使用 USB 设备对象。

HRESULT
CUmdfHidDevice::OnPrepareHardware(
    __in IWDFDevice* WdfDevice
    )
{
    CComPtr<IWDFUsbTargetFactory> factory;
    USB_INTERFACE_DESCRIPTOR interfaceDescriptor;
    bool hidInterfaceFound = false;
    PUSB_HID_DESCRIPTOR hidDescriptor;
    NTSTATUS status;
    HRESULT hr = S_OK;
    //
    // Get the USB I/O target factory interface.
    //
    hr = WdfDevice->QueryInterface(IID_PPV_ARGS(&factory));
    //
    // Create the USB I/O target.
    //
    hr = factory->CreateUsbTargetDevice(&m_UsbTargetDevice);
    //
    // Get the configuration descriptor for the target device.
    //
    if (SUCCEEDED(hr))
    {
        hr = RetrieveConfigDescriptor(&m_ConfigDescriptor, 
                                      &m_ConfigDescriptorCb);
    }
    //
    // Iterate through the interfaces on the device and find the HID interface.
    //
    if (SUCCEEDED(hr))
    {
        CComPtr<IWDFUsbInterface> usbInterface;
        UCHAR index;
        bool found = true;
        for (index = 0; index < m_ConfigDescriptor->bNumInterfaces; index += 1)
        {
            hr = m_UsbTargetDevice->RetrieveUsbInterface(index, &usbInterface);
            if (SUCCEEDED(hr))
            {
                usbInterface->GetInterfaceDescriptor(&interfaceDescriptor);
                if (interfaceDescriptor.bInterfaceClass == 0x3)
                {
                    hidInterfaceFound = true;
                    break;
                }
            }
            else
            {
                break;
            }
        }
        if (SUCCEEDED(hr) && (hidInterfaceFound == false))
        {
            hr = E_FAIL;
        }
    }
    //
    // Get the HID descriptor associated with this interface.
    //
    if (SUCCEEDED(hr))
    {
        hr = ParseHidDescriptor(
                                m_ConfigDescriptor,
                                m_ConfigDescriptorCb,
                                interfaceDescriptor.bInterfaceNumber
                                );
    }
    //
    // Process the HID information from the device and setup 
    // the collection data structures.
    //
    if (SUCCEEDED(hr))
    {
        hr = SetupCollections();
    }
    return hr;
}

要求

要求
结束支持 在 UMDF 2.0 及更高版本中不可用。
目标平台 桌面
最低 UMDF 版本 1.5
标头 wudfusb.h (包括 Wudfusb.h)
DLL WUDFx.dll

另请参阅

IWDFIoTarget

IWDFIoTarget::GetTargetFile

IWDFUsbTargetDevice

IWDFUsbTargetFactory

WinUsb_Initialize