IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)
IOCTL_SCSI_PASS_THROUGH_EX控件程式代碼要求是IOCTL_SCSI_PASS_THROUGH要求的擴充版本。 此要求支援雙向數據傳輸,並允許命令數據區塊 (CDB) > 16 個字節。
允許應用程式將幾乎任何 SCSI 命令傳送至目標裝置,但有下列限制:
- 不允許多重目標命令,例如 COPY。
- 如果裝置目標類型的類別驅動程式存在,則必須將要求傳送至該類別驅動程式。 因此,只有在沒有連線到該 LU 之裝置類型的類別驅動程式時,應用程式才能將此要求直接傳送至目標邏輯單元 (LU) 。 系統埠驅動程式不會在處理傳遞要求之前,先檢查裝置是否已由類別驅動程式宣告。 因此,如果應用程式略過已宣告裝置的類別驅動程式,並將該裝置的傳遞要求直接傳送至埠驅動程式,則類別驅動程式與應用程式之間可能會發生裝置控制衝突。 如果傳遞要求傳送至配接器裝置物件,而且其源自使用者模式,並以類別驅動程式所宣告的 LU 為目標,Storport 會失敗,且要求STATUS_INVALID_DEVICE_REQUEST。 如果要求傳送至 LU 裝置物件、源自核心模式,或以未重載的 LU 為目標,則會傳遞至迷你埠驅動程式。
- 如果 CDB 可能需要基礎迷你埠驅動程式直接存取記憶體,則無法使用此要求。 如果呼叫端的CDB可能需要直接存取記憶體,請改用 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX 。
- 應用程式不得嘗試以異步方式傳送傳遞要求。 所有傳遞要求都必須是同步的。
- 應用程式不需要系統管理許可權,就能將傳遞要求傳送至裝置,但它們必須具有裝置的讀取/寫入存取權。
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 CDB,其必須由呼叫端初始化,但路徑、目標標識元和邏輯單元號碼除外, (LUN) 填入埠驅動程式。 針對數據輸出命令,要傳輸的數據會包含在SCSI_PASS_THROUGH_EX結構中 DataInBuffer 的Irp-AssociatedIrp.SystemBuffer> 緩衝區中。 不過,如果呼叫端要求要求要求要求感知數據,則呼叫端必須緊接 在SCSI_PASS_THROUGH_EX之後配置額外的記憶體。
輸入緩衝區長度
Parameters.DeviceIoControl.InputBufferLength 會指出 Irp->AssociatedIrp.SystemBuffer 緩衝區的大小,其大小必須至少 ( (SCSI_PASS_THROUGH_EX) ) + 。 SCSI_PASS_THROUGH_EX 結構的大小會根據 DataInTransferLength 中指定的值而有所不同。輸出緩衝區
埠驅動程式會傳回任何要求感知數據,以及從裝置傳輸到 Irp-AssociatedIrp.SystemBuffer> 緩衝區的任何數據。 SCSI_PASS_THROUGH_EX結構中的 SenseInfoLength 和 DataOutTransferLength 會更新,以指出傳輸的數據量。
輸出緩衝區長度
SCSI_PASS_THROUGH_EX結構中的 SenseInfoLength 和 DataOutTransferLength 會更新,以指出傳輸的數據量。
狀態區塊
[資訊] 位元位會設定為 Irp-AssociatedIrp.SystemBuffer> 輸出緩衝區中傳回的位元組數目。 [狀態] 欄位會設定為 [STATUS_SUCCESS],或者如果SCSI_PASS_THROUGH_EX中的輸入Length 值未正確設定,則可能會STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER。
備註
若要發出 IOCTL_SCSI_PASS_THROUGH_EX 要求,基礎儲存裝置必須支持擴充的SRB。 這表示支援的 SRB 類型 SRB_TYPE_STORAGE_REQUEST_BLOCK。 應用程式可以使用 PropertyStandardQuery 的查詢類型以及 StorageDeviceProperty 的屬性類型,透過IOCTL_STORAGE_QUERY_PROPERTY要求來查詢 SRB 支援。 STORAGE_ADAPTER_DESCRIPTIOR 結構中傳回的 SrbType 成員會指出SRB_TYPE_SCSI_REQUEST_BLOCK或SRB_TYPE_STORAGE_REQUEST_BLOCK。
規格需求
需求 | 值 |
---|---|
標頭 | ntddscsi.h (包含 Ntddscsi.h) |