共用方式為


配置和建置 URI

USB 用戶端驅動程式可以使用 Windows 驅動程式模型 (WDM) 驅動程式例程來設定和格式化 URB,再將要求傳送至 Microsoft 提供的 USB 驅動程式堆疊。

用戶端驅動程式會使用 URB 封裝 USB 驅動程式堆疊中較低驅動程式所需的所有資訊,以處理要求。 在 Windows 作業系統中,URB 結構會 描述 URB

Microsoft 提供 USB 用戶端驅動程式例程連結庫。 透過使用這些例程,USB 用戶端驅動程式可以建置特定指定作業的 URB 要求,並將其轉送到 USB 堆疊。 如果您想要的話,您可以設計用戶端驅動程式來呼叫支援作業的連結庫例程,而不是建置您自己的 URB 要求。

Windows 7 和更早版本中的 URB 配置

若要使用適用於 Windows 7 和舊版 Windows 的 Windows 驅動程式套件 (WDK) 中包含的例程來傳送 USB 要求,用戶端驅動程式通常會配置並填入 URB 結構、將 URB 結構與新的 IRP 產生關聯,並將 IRP 傳送至 USB 驅動程式堆疊。

針對特定類型的要求,Microsoft 會提供協助程式例程(由 Usbd.sys 匯出),以配置和格式化 URB 結構。 例如,USBD_CreateConfigurationRequestEx例程會配置 URB 結構的記憶體、格式化 SELECT 設定要求的 URB,並將 URB 結構的位址傳回給用戶端驅動程式。 不過,協助程式例程無法用於所有類型的要求。

Microsoft 也提供針對某些類型要求格式化 URB 的宏。 針對這些宏,客戶端驅動程序必須呼叫 ExAllocatePoolWithTag 或配置堆疊上的 結構,以配置 URB 結構。 例如,在用戶端驅動程式配置 URB 之後,驅動程式可以呼叫 UsbBuildSelectConfigurationRequest 來格式化選取組態要求的 URB,或清除組態。

對於其他要求,客戶端驅動程式必須根據要求類型來設定 URB 結構的各種成員,以手動配置和格式化 URB

當 USB 要求完成時,用戶端驅動程式必須釋放 URB 結構。 如果在堆疊上配置 URB,當 URB 超出範圍時,就會釋放 URB。 如果 URB 配置於非分頁集區中,用戶端驅動程式必須呼叫 ExFreePool 以釋放 URB。

Windows 8 中的 URB 配置

適用於 Windows 8 的 WDK 提供新的靜態庫 Usbdex.lib,其會導出配置、格式化和發行 URB 的例程。 此外,還有一種將 URB 與 IRP 產生關聯的新方式。 以 Windows Vista 和更新版本的 Windows 為目標的用戶端驅動程式可以呼叫新的例程。

在 Windows Vista 和更新版本上執行的用戶端驅動程式必須使用新的例程,讓基礎 USB 驅動程式堆疊可以利用某些效能和可靠性改善。 這些改進適用於 Windows 8 中引進的新 USB 驅動程式堆疊,以支援 USB 3.0 裝置和主機控制器。 針對USB 2.0主機控制器,Windows 會載入不支援改善的舊版驅動程式堆疊。 不論基礎驅動程式堆疊的版本或主機控制器支援的通訊協定版本為何,您都必須一律呼叫新的 URB 例程。

呼叫任何新的例程之前,請確定您有USBD句柄,以便向USB驅動程式堆疊註冊客戶端驅動程式。 若要取得 USBD 句柄,請呼叫 USBD_CreateHandle

下列例程適用於 Windows 8 的 WDK 提供。 這些例程是在 Usbdlib.h 中定義的。

上述清單中的配置例程會傳回由USB驅動程式堆疊所配置之新 URB 結構的指標。 根據 Windows 載入的 USB 驅動程式堆疊版本而定, URB 結構可以與不透明的 URB 內容配對。 URB 內容是 URB 相關信息的區塊。 您無法檢視 URB 標頭的內容;此資訊旨在供 USB 驅動程式堆疊在內部使用,以改善 URB 追蹤和處理。 URB 內容 供 Windows 8 的 USB 驅動程式堆疊使用。 如果有 URB 內容可用,USB 驅動程式堆疊會使用它,讓 URB 處理更安全且更有效率。 例如,USB 驅動程式堆疊必須確定客戶端驅動程式不會提交 URB,然後在第一個要求完成之前嘗試重複使用相同的 URB。 若要偵測這類錯誤,USB 驅動程式堆疊會將狀態資訊儲存在URB內容中。 如果沒有狀態資訊,USB 驅動程式堆疊必須比較傳入的 URB 與目前正在進行的所有 URB。 用戶端驅動程式嘗試釋放 URB 時,USB 驅動程式堆疊也會使用狀態資訊。 在釋放 URB 之前,USB 驅動程式堆疊會驗證狀態,以確定 URB 尚未擱置。

URB 內容提供官方機制來儲存額外的 URB 資訊。 使用 URB 內容最好視需要配置額外的記憶體,或將額外的資訊儲存在 URB 結構的保留成員中。 USB 驅動程式堆疊會在非分頁集區中配置 URB 及其相關聯的 URB 內容,因此,如果需要較大的 URB 內容,則唯一必要的調整將是集區配置的大小。

URB 例程移轉

下表摘要說明 URB 例程中的變更。

使用案例 適用於 Windows 7 和更早版本的 WDK 適用於 Windows 8 和更新版本的 WDK 中提供
  以 Windows 7 和舊版作業系統為目標 以 Windows 8 和更新版本的作業系統為目標
若要建立 URB... 用戶端驅動程式會 配置 URB 結構,並根據要求來格式化結構。

用戶端驅動程式會在堆疊上配置 URB 結構,或驅動程式藉由呼叫 ExAllocatePoolWithTag 在非分頁集區中配置結構。
用戶端驅動程式會呼叫 USBD_UrbAllocate ,並接收 USB 驅動程式堆疊所配置之新 URB 結構的指標。 根據基礎 USB 驅動程式堆疊的 USBD 介面版本,URB 可能與 URB 內容相關聯。
若要為選取組態要求建立 URB... 用戶端驅動程式會 呼叫 USBD_CreateConfigurationRequestEx 例程,此例程會傳回 USB 驅動程式堆疊所建立和格式化之新 URB 的指標。 用戶端驅動程式會呼叫 USBD_SelectConfigUrbAllocateAndBuild ,並接收新的 URB 結構的指標,此結構是由 USB 驅動程式堆棧配置和格式化(針對 select-configuration request)。 根據基礎 USB 驅動程式堆疊的 USBD 介面版本,URB 可能與 URB 內容相關聯。
若要為選取介面要求建立 URB... 用戶端驅動程式會配置 URB 結構,並使用 _URB_SELECT_INTERFACE 結構來定義 USB 裝置的選取介面命令格式。 用戶端驅動程式會呼叫 USBD_SelectInterfaceUrbAllocateAndBuild ,並接收新的 URB 結構的指標,此結構是由 USB 驅動程式堆疊配置和格式化(針對 select-interface 要求)。 根據基礎 USB 驅動程式堆疊的 USBD 介面版本,URB 可能與 URB 內容相關聯。
若要將 URB 與 IRP 產生關聯... 用戶端驅動程式會呼叫 IoGetNextIrpStackLocation,以取得下一個IRP堆疊位置的指標。 然後,客戶端驅動程式會手動將堆疊位置的Parameters.Others.Argument1成員設定為URB結構的位址 用戶端驅動程式會呼叫 IoGetNextIrpStackLocation,以取得下一個IRP堆疊位置的指標。 然後,客戶端驅動程式會呼叫 USBD_AssignUrbToIoStackLocation ,以將URB與堆疊位置產生關聯。
若要發行 URB... 如果客戶端驅動程式在堆疊上配置 URB,變數會在要求完成之後超出範圍。

若要釋放客戶端驅動程式或配置於非分頁集區中USB驅動程式堆疊的URB結構,客戶端驅動程式會呼叫ExFreePool
用戶端驅動程式會呼叫 USBD_UrbFree