共用方式為


IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)

IOCTL_SCSI_PASS_THROUGH_EX 控制項程式代碼要求是 IOCTL_SCSI_PASS_THROUGH 要求的延伸版本。 此要求支援雙向數據傳輸,並允許命令數據區塊 (CDB) > 16 個字節。

允許應用程式使用下列限制,將幾乎所有的 SCSI 命令傳送至目標裝置:

  • 不允許多目標命令,例如 COPY。
  • 如果裝置目標類型的類別驅動程式存在,則必須將要求傳送至該類別驅動程式。 因此,只有在連線到該 LU 的裝置類型沒有類別驅動程式時,應用程式才能將此要求直接傳送至目標邏輯單元的系統埠驅動程式。 系統埠驅動程式不會檢查裝置是否已由類別驅動程式宣告,再處理傳遞要求。 因此,如果應用程式略過宣告裝置的類別驅動程式,並將該裝置的傳遞要求直接傳送至埠驅動程式,則類別驅動程式與應用程式之間可能會發生裝置控制衝突。 如果傳遞要求傳送至配接器裝置物件,而且它源自使用者模式,並以類別驅動程式所宣告的 LU 為目標,Storport 會以STATUS_INVALID_DEVICE_REQUEST失敗要求。 如果要求傳送至 LU 裝置物件、源自核心模式,或以未認領的 LU 為目標,則會傳遞至迷你埠驅動程式。
  • 如果 CDB 可能需要基礎迷你埠驅動程式直接存取記憶體,則無法使用此要求。 如果呼叫端的CDB可能需要直接存取記憶體,請改用 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX
  • 應用程式不得嘗試以異步方式傳送傳遞要求。 所有傳遞要求都必須是同步的。
  • 應用程式不需要系統管理許可權,才能將傳遞要求傳送至裝置,但必須具有裝置的讀取/寫入許可權。
呼叫的應用程式會建立 SCSI 命令描述元區塊,如果發生 CHECK CONDITION,可以包含要求感知數據的要求。

IOCTL_SCSI_PASS_THROUGH_EX 是緩衝的裝置控制要求。 若要略過系統記憶體中的緩衝處理,呼叫端應該使用 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX。 處理 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX 要求時,系統會鎖定用戶記憶體中的緩衝區,而裝置會直接存取此記憶體。

此要求通常用於傳輸少量的數據(<16K)。

應用程式可以透過 IRP_MJ_DEVICE_CONTROL 要求傳送此要求。

記憶體類別驅動程式會將次要 IRP 編號設定為 IRP_MN_SCSI_CLASS,表示記憶體類別驅動程式已處理要求。

注意 SCSI 連接埠驅動程式和 SCSI 迷你埠驅動程式模型未來可能會改變或無法使用。 相反地,我們建議使用 Storport 驅動程式Storport miniport 驅動程式模型。
 

主要程序代碼

IRP_MJ_DEVICE_CONTROL

輸入緩衝區

此結構包含 SCSI CDB,其必須由呼叫端初始化,但埠驅動程式會填入的路徑、目標標識碼和邏輯單元號碼 (LUN)。 針對數據輸出命令,要傳輸的數據會包含在 Irp->AssociatedIrp.SystemBuffer 的緩衝區中,DataInBufferOffsetSCSI_PASS_THROUGH_EX 結構中。 不過,如果呼叫端要求要求感知數據,則呼叫端必須立即配置額外的記憶體,緊接在 SCSI_PASS_THROUGH_EX之後。

輸入緩衝區長度

Parameters.DeviceIoControl.InputBufferLength 會指出 Irp->AssociatedIrp.SystemBuffer緩衝區的大小,這至少必須是 (sense data size + sizeof(SCSI_PASS_THROUGH_EX))。 SCSI_PASS_THROUGH_EX 結構的大小會根據 dataInTransferLength 中指定的值而有所不同。

輸出緩衝區

連接埠驅動程式會傳回任何要求感知數據,以及從裝置傳輸到緩衝區的任何數據,Irp->AssociatedIrp.SystemBufferSCSI_PASS_THROUGH_EX 結構中的 SenseInfoLengthDataOutTransferLength 會更新,以指出傳輸的數據量。

輸出緩衝區長度

SCSI_PASS_THROUGH_EX 結構中的 SenseInfoLengthDataOutTransferLength 會更新,以指出傳輸的數據量。

狀態區塊

Information 位元段會設定為 Irp->AssociatedIrp.SystemBuffer 輸出緩衝區中所傳回的位元組數目。 [狀態] 字段會設定為 [STATUS_SUCCESS],或可能設定為 [STATUS_BUFFER_TOO_SMALL] 或 [STATUS_INVALID_PARAMETER],如果 SCSI_PASS_THROUGH_EX 中的輸入 長度 值設定不正確。

言論

若要發出 IOCTL_SCSI_PASS_THROUGH_EX 要求,基礎存儲設備必須支援擴充的SRB。 這表示支援的 SRB 類型 SRB_TYPE_STORAGE_REQUEST_BLOCK。 應用程式可以使用 IOCTL_STORAGE_QUERY_PROPERTY 要求來查詢 SRB 支援,其查詢類型為 PropertyStandardQuery,以及 StorageDeviceProperty的屬性類型。 STORAGE_ADAPTER_DESCRIPTIOR 結構中傳回的 SrbType 成員會指出 SRB_TYPE_SCSI_REQUEST_BLOCKSRB_TYPE_STORAGE_REQUEST_BLOCK

要求

要求 價值
標頭 ntddscsi.h (包括 Ntddscsi.h)

另請參閱

SCSI_PASS_THROUGH_EX