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_ ,請參閱 標注函式行為

規格需求

   
目標平臺 環球
標頭 storport.h (包含 Storport.h)
IRQL DISPATCH_LEVEL (請參閱一節。)

另請參閱

HwStorBuildIo

SCSI_REQUEST_BLOCK

STORAGE_REQUEST_BLOCK

StorPortInitialize