IOCTL_SCSI_PASS_THROUGH_DIRECT IOCTL (ntddscsi)

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

  • 不允許使用使用多目標命令(例如 COPY)。
  • 不支援雙向資料傳輸作業。
  • 如果裝置的目標型別類別驅動程式存在,則必須將要求傳送至該類別驅動程式。 因此,只有當連接到該 LU 的裝置類型沒有類別驅動程式時,應用程式才能將此要求直接傳送給目標邏輯單元的系統埠驅動程式。
  • 如果輸入 CDB 可能需要基礎微型埠驅動程式直接存取記憶體,則 必須 提出此要求。
呼叫端應用程式會建立 SCSI 命令描述元區塊,其中可能會包含要求感知資料的要求(如果檢查條件發生的話)。 如果 CDB 要求資料傳輸作業,則呼叫端必須設定介面卡裝置對齊的緩衝區,而這也就是可讓微型埠驅動程式直接傳送資料的來源。 這項要求通常用來將大量資料傳輸 (>16K) 。

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

儲存體類別驅動程式會將次要 IRP 號碼設定為 IRP_MN_SCSI_CLASS,以表示要求已被儲存類別驅動程式處理。

注意 SCSI 埠驅動程式和 SCSI 微型埠驅動程式模型可能會在未來變更或無法使用。 相反地,我們建議使用 storport 驅動程式storport 微型埠 驅動程式模型。

主要程式碼

IRP_MJ_DEVICE_CONTROL

輸入緩衝區

此結構包括 SCSI CDB,必須由呼叫端初始化,除了路徑、目標識別碼和 LUN (由埠驅動程式填入)之外。 若為數據輸出命令,要傳送的資料必須在介面卡裝置對齊的緩衝區中。 SCSI_PASS_THROUGH_DIRECTDataBuffer成員是與此介面卡裝置對齊的緩衝區的指標。 如果呼叫端要求要求感知資料,呼叫端必須在 SCSI_PASS_THROUGH_DIRECT 結構之後,配置額外的儲存體。

輸入緩衝區長度

DeviceIoControl. InputBufferLength指出>AssociatedIrp. SystemBuffer的緩衝區大小(以位元組為單位),其必須至少 (意義的資料大小 + ,sizeof (SCSI_PASS_THROUGH_DIRECT) ) 。 SCSI_PASS_THROUGH_DIRECT結構的大小是固定的。

輸出緩衝區

埠驅動程式會將任何要求感知資料和 SCSI_PASS_THROUGH_DIRECT 結構傳回至 Irp->AssociatedIrp. SystemBuffer的緩衝區。

輸出緩衝區長度

SenseInfoLengthDataTransferLength 會更新以指出傳輸的資料量。 埠驅動程式會傳回從裝置傳輸到所提供快取對齊緩衝區的任何資料( DataBuffer )。

狀態欄塊

[ 資訊 ] 欄位會設定為在 Irp->AssociatedIrp SystemBuffer的輸出緩衝區中傳回的位元組數目。 [狀態] 欄位設定為 [ STATUS_SUCCESS],或者如果SCSI_PASS_THROUGH_DIRECT中的輸入長度值設定不正確,或在DataBuffer中指定的緩衝區未適當對齊裝置,則可能會STATUS_BUFFER_TOO_SMALLSTATUS_INVALID_PARAMETER

備註

若為數據傳輸作業,則需要具有符合介面卡裝置之對齊的緩衝區。 應用程式可以使用PropertyStandardQuery的查詢類型和StorageAdapterProperty的屬性識別碼發出IOCTL_STORAGE_QUERY_PROPERTY控制項程式碼要求,以取得裝置對齊遮罩。 對齊遮罩會在所傳回STORAGE_ADAPTER_DESCRIPTOR結構的AlignmentMask成員中找到。 驅動程式也可以使用介面卡DeviceObjectAlignmentMask成員中的值。

在下列範例函式中,緩衝區是以裝置對齊的資料傳輸緩衝區來準備。

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)

另請參閱

IOCTL_SCSI_PASS_THROUGH

IOCTL_STORAGE_QUERY_PROPERTY

SCSI_PASS_THROUGH_DIRECT