IOCTL_SCSI_PASS_THROUGH_DIRECT IOCTL (ntddscsi)
允許應用程式將幾乎任何 SCSI 命令傳送至目標裝置,但有下列限制:
- 不允許使用使用多目標命令(例如 COPY)。
- 不支援雙向資料傳輸作業。
- 如果裝置的目標型別類別驅動程式存在,則必須將要求傳送至該類別驅動程式。 因此,只有當連接到該 LU 的裝置類型沒有類別驅動程式時,應用程式才能將此要求直接傳送給目標邏輯單元的系統埠驅動程式。
- 如果輸入 CDB 可能需要基礎微型埠驅動程式直接存取記憶體,則 必須 提出此要求。
應用程式可以透過 IRP_MJ_DEVICE_CONTROL 要求來傳送此要求。
儲存體類別驅動程式會將次要 IRP 號碼設定為 IRP_MN_SCSI_CLASS,以表示要求已被儲存類別驅動程式處理。
主要程式碼
輸入緩衝區
此結構包括 SCSI CDB,必須由呼叫端初始化,除了路徑、目標識別碼和 LUN (由埠驅動程式填入)之外。 若為數據輸出命令,要傳送的資料必須在介面卡裝置對齊的緩衝區中。 SCSI_PASS_THROUGH_DIRECT的DataBuffer成員是與此介面卡裝置對齊的緩衝區的指標。 如果呼叫端要求要求感知資料,呼叫端必須在 SCSI_PASS_THROUGH_DIRECT 結構之後,配置額外的儲存體。
輸入緩衝區長度
DeviceIoControl. InputBufferLength指出>AssociatedIrp. SystemBuffer的緩衝區大小(以位元組為單位),其必須至少 (意義的資料大小 + ,sizeof (SCSI_PASS_THROUGH_DIRECT) ) 。 SCSI_PASS_THROUGH_DIRECT結構的大小是固定的。
輸出緩衝區
埠驅動程式會將任何要求感知資料和 SCSI_PASS_THROUGH_DIRECT 結構傳回至 Irp->AssociatedIrp. SystemBuffer的緩衝區。
輸出緩衝區長度
SenseInfoLength 和 DataTransferLength 會更新以指出傳輸的資料量。 埠驅動程式會傳回從裝置傳輸到所提供快取對齊緩衝區的任何資料( DataBuffer )。
狀態欄塊
[ 資訊 ] 欄位會設定為在 Irp->AssociatedIrp SystemBuffer的輸出緩衝區中傳回的位元組數目。 [狀態] 欄位設定為 [ STATUS_SUCCESS],或者如果SCSI_PASS_THROUGH_DIRECT中的輸入長度值設定不正確,或在DataBuffer中指定的緩衝區未適當對齊裝置,則可能會STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER 。
備註
若為數據傳輸作業,則需要具有符合介面卡裝置之對齊的緩衝區。 應用程式可以使用PropertyStandardQuery的查詢類型和StorageAdapterProperty的屬性識別碼發出IOCTL_STORAGE_QUERY_PROPERTY控制項程式碼要求,以取得裝置對齊遮罩。 對齊遮罩會在所傳回STORAGE_ADAPTER_DESCRIPTOR結構的AlignmentMask成員中找到。 驅動程式也可以使用介面卡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;
}
規格需求
| 標頭 | ntddscsi (包含 Ntddscsi) |
另請參閱
意見反應
提交並檢視相關的意見反應