HW_STARTIO回呼函式 (storport.h)

Storport 驅動程式會針對每個傳入 I/O 要求呼叫 HwStorStartIo 例程一次。

語法

HW_STARTIO HwStartio;

BOOLEAN HwStartio(
  PVOID DeviceExtension,
  PSCSI_REQUEST_BLOCK Srb
)
{...}

參數

DeviceExtension

迷你埠驅動程式每個 HBA 儲存區域的指標。

Srb

要啟動之 SCSI 要求區塊的指標。

傳回值

如果成功起始要求,HwStorStartIo 會傳回 TRUE。 否則會傳回 FALSE

備註

HwStorStartIo 會起始 I/O 作業。 StorPort 的設計目的是使用 HwStorBuildIo 中備妥的迷你埠私人數據,並儲存在 DeviceExtensionSrb-SrbExtension> 中。 因為 HwStorBuildIo 是在沒有微調鎖定的情況下呼叫,所以在 HwStorBuildIo 中盡可能準備數據,即可達到最佳的驅動程式效能。

Storport 會以下列方式呼叫 HwStorStartIo

  • 針對記憶體非虛擬迷你埠驅動程式,根據PORT_CONFIGURATION_INFORMATION中設定的 SynchronizationModel 值,Storport 一律會使用相同的 IRQL 呼叫 HwStorStartIo,並使用內部微調鎖定來確保 I/O 要求會循序起始。 IRQL DISPATCH_LEVEL (全双工模式) 或 DIRQL (半雙工模式) 。

    在半雙工模式中處理 I/O 時, HwStorStartIo 例程不需要取得自己的微調鎖定。 此外,HwStorStartIo 例程中不允許使用 StorPortAllocatePool 和透過 StorPortAcquireSpinLock 進行相互排除的記憶體配置。 在全雙工模式中, StorPortAllocatePoolStorPortAcquireSpinLock 可用於 HwStorStartIo 例程。

    如果非虛擬迷你埠支援 StorPortInitializePerfOpts (STOR_PERF_CONCURRENT_CHANNELS) 所設定的並行通道優化,則可能會同時呼叫 HwStorStartIo 。 在此情況下,迷你埠必須確保任何共用資源都受到鎖定保護。 透過此效能優化,Storport 不會在呼叫 HwStorStartIo 之前取得 StartIo 鎖定,而且迷你埠必須視需要提供自己的鎖定。

  • 針對記憶體虛擬迷你埠驅動程式,Storport 會在任何 IRQL <= DISPATCH_LEVEL 呼叫 HwStorStartIo,而且不會使用內部微調鎖定。 HwStorStartIo 例程可以藉由呼叫 StorPortAcquireSpinLock 來取得自己的微調鎖定。 此外,記憶體虛擬迷你埠驅動程式的 HwStorStartIo 例程中允許呼叫 StorPortAllocatePool

收到 SCSI 狀態時,預期會完成 SRB。 當 Storport 驅動程式使用 RequestCompleteNotificationType 呼叫 StorPortNotification 來完成 SRB 時,SRB 預期會在 Srb 的 SrbStatus 字段中傳回下列其中一個值:

  • SRB_STATUS_SUCCESS

    • 指出已傳送 Srb,且可能傳回數據) 的 SCSI 狀態 (。
    • Storport 會將數據和狀態傳回給呼叫端。
    • 迷你埠動作是無的,除非使用 StorPortNotification for RequestComplete 來完成要求,可能是來自 HwStorDpcRoutine
  • SRB_STATUS_BUSY

    • 表示傳送 Srb (時發生暫時性問題,例如適配卡緩存器或緩衝區忙碌) 。
    • Storport 會捨棄 Srb-SrbExtension> 指向的原始 Srb 延伸模組,並發出新的延伸模組。 Storport 會在後續對 HwStorBuildIoHwStorStartIo 的呼叫中傳送具有新發行 Srb 延伸模組的原始 Srb。 原始 Srb 延伸模組中的所有數據都會遺失。
    • 迷你埠不應該更新 Srb 的 DataTransferLength
    • 因為發出新的 Srb 擴充功能,所以迷你埠必須確定它永遠不會在 SCSI 交易中間發出SRB_STATUS_BUSY。 交易啟動之後,必須完成或取消交易。 交易期間的硬體忙碌狀態必須由迷你埠驅動程序處理。

HwStorStartIo 名稱是一個佔位符,用來描述HW_INITIALIZATION_DATA結構的 HwStartIo 成員中設定的迷你埠例程。 此結構會傳入 StorPortInitializeHwInitializationData 參數。 此例程的實際原型定義於 Storport.h 中,如下所示:

typedef
BOOLEAN
(*PHW_STARTIO) (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );

從 Windows 8 開始,Srb 參數可以指向 SCSI_REQUEST_BLOCKSTORAGE_REQUEST_BLOCK。 如果 Srb函式欄位中的函式識別碼SRB_FUNCTION_STORAGE_REQUEST_BLOCK,則 SRB 是STORAGE_REQUEST_BLOCK要求結構。

範例

若要定義 HwStorStartIo 回呼例程,您必須先提供 靜態驅動程式驗證程式 (SDV) 和其他驗證工具所需的函式宣告,如下列程式代碼範例所示:

若要定義 HwStorStartIo 回呼函式,您必須先提供函式宣告來識別您要定義的回呼函式類型。 Windows 提供一組驅動程式的回呼函式類型。 使用回呼函式類型宣告函式有助於 驅動程式的程式代碼分析靜態驅動程式驗證器 (SDV) ,以及其他驗證工具尋找錯誤,而且這是撰寫 Windows 操作系統驅動程式的需求。

例如,若要定義名為 MyHwStartIoHwStorStartIo 回呼例程,請使用 HW_STARTIO 類型並實作回呼例程,如下所示:

HW_STARTIO MyHwStartIo

BOOLEAN
MyHwStartIo (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );
  {
      ...
  }

HW_STARTIO函式類型定義於 Storport.h 頭檔中。 若要在執行程式代碼分析工具時更精確地識別錯誤,請務必將 新增至函式 _Use_decl_annotations_ annotation 定義。 可確保 _Use_decl_annotations_ annotation 會使用頭檔中套用至 HW_STARTIO 函式類型的註釋。 如需函數宣告需求的詳細資訊,請參閱 使用 Storport 驅動程式的函式角色類型宣告函式。 如需 的相關信息 _Use_decl_annotations_,請參閱 標註函式行為

規格需求

需求
目標平台 Universal
標頭 storport.h (包含 Storport.h)
IRQL DISPATCH_LEVEL (请参阅一节。)

另請參閱

HwStorBuildIo

SCSI_REQUEST_BLOCK

STORAGE_REQUEST_BLOCK

StorPortInitialize