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 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.
Kode utama
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk