IOCTL_SCSI_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)

Memungkinkan aplikasi untuk mengirim hampir semua perintah SCSI ke perangkat target, dengan batasan berikut:

  • Perintah multitarget, seperti COPY, tidak diizinkan.
  • Operasi transfer data dua arah tidak didukung.
  • Jika driver kelas untuk jenis target perangkat ada, permintaan harus dikirim ke driver kelas tersebut. Dengan demikian, aplikasi dapat mengirim permintaan ini langsung ke driver port sistem untuk unit logis target hanya jika tidak ada driver kelas untuk jenis perangkat yang terhubung ke LU tersebut.
  • Permintaan ini harus dibuat jika CDB input mungkin memerlukan driver miniport yang mendasar untuk mengakses memori secara langsung.
Aplikasi panggilan membuat blok deskriptor perintah SCSI, yang dapat menyertakan permintaan untuk data pengertian permintaan jika CHECK CONDITION terjadi. Jika CDB meminta operasi transfer data, pemanggil harus menyiapkan buffer selaras perangkat adaptor dari mana atau ke mana driver miniport dapat mentransfer data secara langsung. Permintaan ini biasanya digunakan untuk mentransfer data dalam jumlah yang lebih besar (>16K).

Aplikasi dapat mengirim permintaan ini melalui permintaan IRP_MJ_DEVICE_CONTROL .

Driver kelas penyimpanan mengatur nomor IRP kecil ke IRP_MN_SCSI_CLASS untuk menunjukkan bahwa permintaan telah diproses oleh driver kelas penyimpanan.

Catatan Driver port SCSI dan model driver miniport SCSI dapat diubah atau tidak tersedia di masa mendatang. Sebagai gantinya, sebaiknya gunakan driver Storport dan model driver miniport Storport .
 

Kode utama

IRP_MJ_DEVICE_CONTROL

Buffer input

Struktur ini mencakup SCSI CDB, yang harus diinisialisasi oleh pemanggil kecuali untuk jalur, ID target, dan LUN, yang diisi oleh driver port. Untuk perintah data-out, data yang akan ditransfer harus berada dalam buffer yang selaras dengan perangkat adaptor. Anggota DataBufferdari SCSI_PASS_THROUGH_DIRECT adalah penunjuk ke buffer selaras perangkat adaptor ini. Pemanggil harus mengalokasikan penyimpanan tambahan, mengikuti struktur SCSI_PASS_THROUGH_DIRECT , jika pemanggil meminta data request-sense.

Panjang buffer input

Parameters.DeviceIoControl.InputBufferLength menunjukkan ukuran, dalam byte, buffer di Irp->AssociatedIrp.SystemBuffer, yang harus setidaknya (ukuran data + senseof (SCSI_PASS_THROUGH_DIRECT)). Ukuran struktur SCSI_PASS_THROUGH_DIRECT diperbaiki.

Buffer output

Driver port mengembalikan data request-sense dan struktur SCSI_PASS_THROUGH_DIRECT ke buffer di Irp-AssociatedIrp.SystemBuffer>.

Panjang buffer output

SenseInfoLength dan DataTransferLength diperbarui untuk menunjukkan jumlah data yang ditransfer. Driver port mengembalikan data apa pun yang ditransfer dari perangkat ke buffer yang selaras dengan cache yang disediakan di DataBuffer .

Blok status

Bidang Informasi diatur ke jumlah byte yang dikembalikan dalam buffer output di Irp-AssociatedIrp.SystemBuffer>. Bidang Status diatur ke STATUS_SUCCESS, atau mungkin untuk STATUS_BUFFER_TOO_SMALL atau STATUS_INVALID_PARAMETER jika nilai Panjang input dalam SCSI_PASS_THROUGH_DIRECT diatur dengan tidak benar atau buffer yang ditentukan dalam DataBuffer tidak selaras dengan perangkat dengan benar.

Keterangan

Untuk operasi transfer data, diperlukan buffer dengan penyelarasan yang cocok dengan perangkat adaptor. Aplikasi dapat mengambil masker penyelarasan perangkat dengan mengeluarkan permintaan kode kontrol IOCTL_STORAGE_QUERY_PROPERTY dengan jenis kueri PropertyStandardQuery dan id properti StorageAdapterProperty. Masker perataan ditemukan di anggota AlignmentMask dari struktur STORAGE_ADAPTER_DESCRIPTOR yang dikembalikan. Driver juga dapat menggunakan nilai dalam anggota AlignmentMask dari DeviceObject adaptor.

Dalam contoh fungsi berikut, buffer disiapkan sebagai buffer transfer data yang selaras dengan perangkat.

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;
}

Persyaratan

Persyaratan Nilai
Header ntddscsi.h (termasuk Ntddscsi.h)

Lihat juga

IOCTL_SCSI_PASS_THROUGH

IOCTL_STORAGE_QUERY_PROPERTY

SCSI_PASS_THROUGH_DIRECT