實作 Storport 虛擬迷你埠驅動程式
此頁面提供 Storport 虛擬迷你埠驅動程式 (VMiniport) 的高階實作資訊。 VMiniport 介面定義於 storport.h 中。
設計考慮對各種 VMiniports 而言是獨一無二的,因此此處未包含實作細節。
VMiniport 介面
本節列出 VMiniport 實作/使用更突出的函式、回呼和結構。 需要某些函式和回呼;選擇性回呼對 VMiniport 的設計而言是唯一的。
DriverEntry,這是作系統在載入 VMiniport 之後呼叫的第一個例程。 這是必要例程。
HW_INITIALIZATION_DATA,這是由 VMiniport 分配和初始化的結構,VMiniport 在 初始化期間將其傳遞至 Storport,。 VMiniport 會提供此結構中其回呼函式的指標。
需要下列回呼程序:
HwResetBus。 VMiniport 開發人員可以自行定義「總線」的涵義。
HwFreeAdapterResources。 拿掉虛擬配接器時,會呼叫此例程,讓 VMiniport 可以釋放初始化期間配置的任何資源。
下列回呼例程是選擇性的,不過 VMiniport 可能必須根據其唯一架構來實作其中一些例程:
HwCleanupTracing。 當 HwInitializeTracing 指向回呼例程時,需要使用此例程;否則,此例程是選擇性的,並且對於 VMiniport 來說是獨特的。
HwProcessServiceRequest。 此例程會接收「反向回呼」IRP,當 VMiniport 更新呼叫端時,將會完成此動作(例如使用者模式應用程式或內核模式驅動程式),或要求呼叫者代表 VMiniport 執行某些動作。
HwCompleteServiceIrp。 當 HwProcessServiceRequest 指向回呼例程時,需要此例程;否則,這個例程是選擇性的,而且對 VMiniport 而言是唯一的。移除虛擬配接器時,會呼叫 HwCompleteServiceIrp,讓 VMiniport 可以完成可能擱置的任何反向回呼 IRP。
VMiniport 也必須設定 HW_INITIALIZATION_DATA 結構的下列成員:
將 HwInitializationDataSize 設定為 sizeof (HW_INITIALIZATION_DATA)。
將 AdapterInterfaceType 設定為 Internal,這表示 Storport 這是虛擬配接器。
Vminiport 驅動程序會視需要設定其他欄位。 未使用的欄位必須設定為零。
PORT_CONFIGURATION_INFORMATION,這是 Storport 分配的結構。 Storport 會初始化一些 PORT_CONFIGURATION_INFORMATION 成員,然後將其傳遞給 VMiniport 的 HwFindAdapter 回呼,VMiniport 接著會完成初始化。 由於此結構是由 Storport 預先初始化,因此 HWFindAdapter 不得將結構的數值歸零。 VMiniport 必須將 VirtualDevice 設定為 TRUE。
VMiniport 初始化
VMiniport 有三個階段的初始化。
在第一階段,VMiniport 的 DriverEntry 例程會使用一個指向已初始化之 HW_INITIALIZATION_DATA 結構的指標來呼叫 StorPortInitialize。
Storport 會呼叫 VMiniport 的 HwFindAdapter 回呼,並使用由 Storport 分配且部分初始化的 PORT_CONFIGURATION_INFORMATION 結構。 HwFindAdapter 的主要功能是完成 PORT_CONFIGURATION_INFORMATION的初始化,包括將 VirtualDevice 成員設定為 TRUE。
HwFindAdapter 成功傳回之後,Storport 會呼叫 VMiniport 的 HwInitialize 回呼,以完成 VMiniport 的初始化。
VMiniport I/O
Storport 會呼叫 VMiniport 的 HwStartIo 回呼來啟動 I/O 請求。 在 Storport 中,會分別使用 SCSI_REQUEST_BLOCK 或 STORAGE_REQUEST_BLOCK 來描述 I/O 要求(標準或擴充 SRB)。
不同於實體迷你埠驅動程式,Storport 在呼叫 HwStartIo之前,不會在 Vminiport 中呼叫 HwBuildIo。
呼叫 HwStartIo之前,不會保留任何鎖定。 透過虛擬迷你埠介面公開的每個邏輯單元的預設佇列深度為 250。