實作 Storport 虛擬迷你埠驅動程式
此頁面提供 Storport 虛擬迷你埠驅動程式 (VMiniport) 的高階實作資訊。 VMiniport 介面定義於 storport.h 中。
設計考慮對各種 VMiniports 而言是唯一的,因此此處不包含實作細節。
VMiniport 介面
本節列出 VMiniport 實作/使用的更醒目函式、回呼和結構。 需要某些函式和回呼;選擇性回呼對 VMiniport 的設計而言是唯一的。
DriverEntry,這是操作系統在載入 VMiniport 之後呼叫的第一個例程。 需要此例程。
HW_INITIALIZATION_DATA,這是 VMiniport 在 初始化期間傳遞至 Storport 的 Vminiport 配置和初始化結構。 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 這是虛擬適配卡。
將 HwBuildIo 設定為 NULL。
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 (標準或擴充 S) RB 來描述 I/O 要求。
不同於實體迷你埠驅動程式,Storport 在呼叫 HwStartIo 之前,不會在 Vminiport 中呼叫 HwBuildIo。
呼叫 HwStartIo 之前,不會保留任何鎖定。 透過虛擬迷你埠介面公開的每個邏輯單元的預設佇列深度為 250。