IOCTL_SCSI_PASS_THROUGH_DIRECT_EX IOCTL (ntddscsi.h)
IOCTL_SCSI_PASS_THROUGH_DIRECT_EX 控件程式代碼要求是 IOCTL_SCSI_PASS_THROUGH_DIRECT 要求的擴充版本。 此要求支援雙向數據傳輸,並允許命令數據區塊 (CDB) > 16 個字節。
允許應用程式使用下列限制,將幾乎所有的 SCSI 命令傳送至目標裝置:
- 不允許多目標命令,例如 COPY。
- 如果裝置目標類型的類別驅動程式存在,則必須將要求傳送至該類別驅動程式。 因此,只有在連線至該 LU 的裝置類型沒有類別驅動程式時,應用程式才能將這個要求直接傳送至目標邏輯單元的系統埠驅動程式。
- 如果輸入CDB可能需要基礎迷你埠驅動程式直接存取記憶體,則必須 此要求。
應用程式可以透過 IRP_MJ_DEVICE_CONTROL 要求傳送此要求。
記憶體類別驅動程式會將次要 IRP 編號設定為 IRP_MN_SCSI_CLASS,表示記憶體類別驅動程式已處理要求。
主要程序代碼
輸入緩衝區
Parameters.DeviceIoControl.InputBufferLength 會指出 Irp->AssociatedIrp.SystemBuffer緩衝區的大小(感知數據大小 + 大小為(SCSI_PASS_THROUGH_DIRECT_EX))。 SCSI_PASS_THROUGH_DIRECT_EX 結構的大小是固定的。此結構包含 SCSI CDB,其必須由呼叫端初始化,但埠驅動程式所填入的路徑、目標標識元和 LUN 除外。 針對數據輸出命令,要傳輸的數據必須位於配接器裝置對齊的緩衝區中。 DataInBuffer 成員 SCSI_PASS_THROUGH_DIRECT_EX 是此配接器裝置對齊緩衝區的指標。 如果呼叫端要求要求要求感知數據,則呼叫端必須配置額外的記憶體,並遵循 SCSI_PASS_THROUGH_DIRECT_EX 結構。
輸入緩衝區長度
Parameters.DeviceIoControl.InputBufferLength 會指出 Irp->AssociatedIrp.SystemBuffer緩衝區的大小(感知數據大小 + 大小為(SCSI_PASS_THROUGH_DIRECT_EX))。 SCSI_PASS_THROUGH_DIRECT_EX 結構的大小是固定的。輸出緩衝區
連接埠驅動程式會將任何要求感知的數據和 SCSI_PASS_THROUGH_DIRECT_EX 結構傳回緩衝區,Irp->AssociatedIrp.SystemBuffer。
輸出緩衝區長度
SenseInfoLength 和 DataOutTransferLength 會更新,以指出傳輸的數據量。 埠驅動程式會傳回從裝置傳輸到所提供快取對齊緩衝區的任何數據,DataOutBuffer。
狀態區塊
Information 位元段會設定為 Irp->AssociatedIrp.SystemBuffer 輸出緩衝區中所傳回的位元組數目。 [狀態] 字段會設定為 [STATUS_SUCCESS],或者,如果 SCSI_PASS_THROUGH_DIRECT_EX 中的輸入 Length 值設定不正確,或 dataInBuffer 中指定的緩衝區未正確對齊,則 STATUS_BUFFER_TOO_SMALL 或 STATUS_INVALID_PARAMETER。
言論
針對數據傳輸作業,需要符合配接器裝置的對齊方式緩衝區。 應用程式可以藉由發出具有 PropertyStandardQuery 查詢類型的 IOCTL_STORAGE_QUERY_PROPERTY 控件程序代碼要求,以及 storageAdapterProperty屬性標識符,以擷取裝置對齊遮罩。 對齊遮罩位於所傳回 STORAGE_ADAPTER_DESCRIPTOR 結構的 AlignmentMask 成員中。 驅動程式也可以使用 adapter DeviceObject之 AlignmentMask 成員中的值。
在下列範例函式中,緩衝區會準備為裝置對齊的數據傳輸緩衝區。
PVOID AllocateAlignedBuffer(ULONG size, ULONG AlignmentMask, PVOID *pUnAlignedBuffer)
{
PVOID AlignedBuffer;
ULONG_PTR FullWordMask = (ULONG_PTR)AlignmentMask;
if (AlignmentMask == 0)
{
AlignedBuffer = malloc(size);
// return the original buffer to free later
*pUnAlignedBuffer = AlignedBuffer;
}
else
{
// expand the size for the alignment window
size += AlignmentMask;
AlignedBuffer = malloc(size);
// return the original buffer to free later
*pUnAlignedBuffer = AlignedBuffer;
// adjust buffer pointer for the desired alignment
AlignedBuffer = (PVOID)(((ULONG_PTR)AlignedBuffer + FullWordMask) & ~FullWordMask);
}
return AlignedBuffer;
}
若要發出 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX 要求,基礎存儲設備必須支援擴充的SRB。 這表示支援的 SRB 類型 SRB_TYPE_STORAGE_REQUEST_BLOCK。 應用程式可以使用 IOCTL_STORAGE_QUERY_PROPERTY 要求來查詢 SRB 支援,其查詢類型為 PropertyStandardQuery,以及 StorageDeviceProperty的屬性類型。 STORAGE_ADAPTER_DESCRIPTIOR 結構中傳回的 SrbType 成員會指出 SRB_TYPE_SCSI_REQUEST_BLOCK 或 SRB_TYPE_STORAGE_REQUEST_BLOCK。
要求
要求 | 價值 |
---|---|
標頭 | ntddscsi.h (包括 Ntddscsi.h) |