共用方式為


USB 裝置描述元

裝置描述項包含 USB 裝置整體的相關信息。 本主題描述 USB_DEVICE_DESCRIPTOR 結構,並包含用戶端驅動程式如何傳送 get-descriptor 要求以取得裝置描述元的資訊。

每個通用序列總線 (USB) 裝置都必須能夠提供包含裝置相關信息的單一裝置描述元。 USB_DEVICE_DESCRIPTOR 結構描述裝置描述項。 Windows 會使用該資訊來衍生各種資訊集。 例如, idVendoridProduct 字段分別指定廠商和產品識別碼。 Windows 會使用這些域值來建構裝置 的硬體標識碼 。 若要檢視特定裝置的硬體標識碼,請開啟 裝置管理員 並檢視裝置屬性。 在 [ 詳細數據] 索引 標籤中, [硬體 標識符] 屬性值會指出 Windows 產生的硬體標識碼 (“USB\XXX”) 。 bcdUSB 欄位指出裝置符合的 USB 規格版本。 例如,0x0200表示裝置是根據USB 2.0規格所設計。 bcdDevice 值表示裝置定義的修訂編號。 USB 驅動程式堆疊會使用 bcdDevice 以及 idVendoridProduct 來產生裝置的硬體和相容標識碼。 您可以在 裝置管理員 中檢視這些識別碼。 裝置描述項也會指出裝置支援的組態總數。

當裝置以高速容量連線到主計算機時,裝置可能會在其裝置描述符中報告不同的資訊,而不是以完整速度容量連線時。 裝置不得在連線存留期間變更裝置描述符中包含的資訊,包括在電源狀態變更期間。

主機會透過控制傳輸取得裝置描述項。 在傳輸中,要求類型為 GET DESCRIPTOR,而收件者是裝置。 用戶端驅動程式可以透過下列兩種方式之一起始傳輸:使用架構 USB 目標裝置物件,或使用要求資訊傳送 URB。

取得裝置描述元

Windows 驅動程式架構 (WDF) 用戶端驅動程式只能在建立架構 USB 目標裝置物件之後取得裝置描述元。

KMDF 驅動程式必須呼叫 WdfUsbTargetDeviceCreate,以取得 USB 目標裝置物件的 WDFUSBDEVICE 句柄。 一般而言,用戶端驅動程式會在驅動程式的 EvtDevicePrepareHardware 回呼實作中呼叫 WdfUsbTargetDeviceCreate。 之後,客戶端驅動程序必須呼叫 WdfUsbTargetDeviceGetDeviceDescriptor 方法。 呼叫完成之後,會在呼叫端配置的 USB_DEVICE_DESCRIPTOR 結構中收到裝置描述元。

UMDF 驅動程式必須查詢 IWDFUsbTargetDevice 指標的架構裝置對象,然後呼叫 IWDFUsbTargetDevice::RetrieveDescriptor 方法,並將USB_DEVICE_DESCRIPTOR_TYPE指定為描述元類型。

主機也可以藉由傳送 URB 來取得裝置描述元。 這個方法僅適用於內核模式驅動程式。 不過,除非驅動程式是以 Windows 驅動程式模型為基礎, (WDM) ,否則客戶端驅動程式絕對不需要傳送此類型的要求 URB。 這類驅動程式必須配置 URB 結構,然後呼叫 UsbBuildGetDescriptorRequest 宏,以指定要求的 URB 格式。 然後,驅動程式可以將 URB 提交至 USB 驅動程式堆疊,以傳送要求。 如需詳細資訊,請參閱 如何提交 URB

此程式代碼範例顯示UsbBuildGetDescriptorRequest呼叫,其會將 pURB 指向的緩衝區格式化為適當的 URB:

UsbBuildGetDescriptorRequest(
    pURB,                                                 // Points to the URB to be formatted
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_DEVICE_DESCRIPTOR_TYPE,
    0,                                                    // Not used for device descriptors
    0,                                                    // Not used for device descriptors
    pDescriptor,                                          // Points to a USB_DEVICE_DESCRIPTOR structure
    NULL,
    sizeof(USB_DEVICE_DESCRIPTOR),
    NULL
);

範例裝置描述元

此範例顯示 USB 網路攝影機裝置的裝置描述元, (請參閱 USB 裝置設定) ,方法是使用 USBView 應用程式取得:

Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0xEF
bDeviceSubClass:      0x02
bDeviceProtocol:      0x01
bMaxPacketSize0:      0x40 (64)
idVendor:           0x045E (Microsoft Corporation)
idProduct:          0x0728
bcdDevice:          0x0100
iManufacturer:        0x01
0x0409: "Microsoft"
iProduct:             0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber:        0x00
bNumConfigurations:   0x01

在上述範例中,您會看到裝置已根據USB規格2.0版進行開發。 請注意 bDeviceClass、bDeviceSubClassbDeviceProtocol 值。 這些值表示裝置包含一或多個USB介面關聯描述元,可用來將每個函式的多個介面分組。 如需詳細資訊,請參閱 USB介面關聯描述元

接下來,請參閱 bMaxPacketSize0 的值。 這個值表示預設端點的封包大小上限。 此範例裝置可以透過預設端點傳輸最多64個字節的數據。

一般而言,若要設定裝置,用戶端驅動程式會在取得裝置描述元之後,取得裝置中支援設定的相關信息。 若要判斷裝置支援的組態數目,請檢查傳回結構的 bNumConfigurations 成員。 此裝置支援一個設定。 若要取得 USB 設定的相關信息,驅動程式必須取得 USB 組態描述元