IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)
Memungkinkan aplikasi mengirim hampir semua perintah ATA ke perangkat target, dengan batasan berikut:
- Jika driver kelas untuk jenis target perangkat ada, aplikasi harus mengirim permintaan ke driver kelas. Dengan demikian, aplikasi dapat mengirim permintaan ini langsung ke driver port sistem untuk unit logis target (LU) hanya jika tidak ada driver kelas untuk jenis perangkat yang terhubung ke LU tersebut. Driver port sistem tidak memeriksa untuk menentukan apakah perangkat telah diklaim oleh driver kelas sebelum memproses permintaan pass-through. Oleh karena itu, jika aplikasi melewati driver kelas yang telah mengklaim perangkat dan mengirim permintaan pass-through untuk perangkat tersebut langsung ke driver port, konflik untuk kontrol perangkat dapat terjadi antara driver kelas dan aplikasi.
- Permintaan ini tidak dapat digunakan jika perintah memerlukan driver yang mendasar untuk mengakses memori secara langsung. Jika perintah penelepon mungkin memerlukan akses langsung ke memori, gunakan IOCTL_ATA_PASS_THROUGH_DIRECT sebagai gantinya.
- Aplikasi tidak boleh mencoba mengirim permintaan pass-through secara asinkron. Semua permintaan pass-through harus sinkron.
- Aplikasi tidak memerlukan hak administratif untuk mengirim permintaan pass-through ke perangkat, tetapi mereka harus memiliki akses baca/tulis ke perangkat.
Kode utama
Buffer input
Buffer di Irp-AssociatedIrp.SystemBuffer> harus berisi struktur ATA_PASS_THROUGH_EX, yang mencakup sekumpulan register input file tugas yang menunjukkan jenis perintah yang akan dilakukan dan parameternya. Pemanggil harus menginisialisasi semua anggota struktur ini kecuali PathId, TargetId, dan Lun, yang diisi driver port. Untuk perintah data-out, anggota Struktur DataBufferOffset harus menunjuk ke buffer yang selaras dengan cache yang berisi data yang akan ditulis.
Panjang buffer input
Parameters.DeviceIoControl.InputBufferLength menunjukkan ukuran dalam byte buffer di Irp->AssociatedIrp.SystemBuffer. Jika perintah ATA yang disematkan adalah operasi tulis, ukuran buffer input harus berupa jumlah sizeof(ATA_PASS_THROUGH_EX) dan nilai di anggota DataTransferLengthdari ATA_PASS_THROUGH_EX. Contoh pseudocode berikut menunjukkan cara menghitung ukuran buffer:ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength
Jika perintah ATA yang disematkan adalah operasi baca atau operasi kontrol perangkat yang tidak melibatkan transfer data, InputBufferLength harus sama dengan sizeof (ATA_PASS_THROUGH_EX).
Dalam kedua kasus, jika InputBufferLength kurang dari sizeof (ATA_PASS_THROUGH_EX), driver port gagal permintaan I/O dan mengembalikan kesalahan.
Buffer output
Driver port memformat data pengembalian menggunakan struktur ATA_PASS_THROUGH_EX dan menyimpan data dalam buffer di Irp-AssociatedIrp.SystemBuffer>.
Driver port mengisi anggota CurrentTaskFile dengan nilai yang ada dalam register output perangkat pada penyelesaian perintah ATA yang disematkan. Jika perintah adalah transfer data, driver port menyimpan data yang ditransfer dalam buffer yang selaras dengan cache yang terletak di offset byte DataBufferOffset dari awal struktur. Aplikasi bertanggung jawab untuk menginterpretasikan konten register output untuk menentukan kesalahan apa, jika ada, yang dikembalikan oleh perangkat.
Panjang buffer output
Driver port memperbarui anggota DataTransferLength dari ATA_PASS_THROUGH_EX untuk menunjukkan jumlah data yang benar-benar ditransfer dari perangkat. Jika perintah ATA yang disematkan adalah operasi tulis atau operasi kontrol perangkat yang tidak mentransfer data, OutputBufferLength sama dengan sizeof(ATA_PASS_THROUGH_EX). Jika perintah ATA yang disematkan adalah operasi baca, OutputBufferLength sama dengan sizeof(ATA_PASS_THROUGH_EX) + DataTransferLength.
Blok status
Anggota Informasi diatur ke jumlah byte yang dikembalikan dalam buffer output di Irp-AssociatedIrp.SystemBuffer>. Anggota Status diatur ke STATUS_SUCCESS atau mungkin ke STATUS_BUFFER_TOO_SMALL atau STATUS_INVALID_PARAMETER jika nilai Status input dalam ATA_PASS_THROUGH_EX diatur secara tidak benar.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia dimulai dengan Windows Server 2003. |
Header | ntddscsi.h (termasuk Ntddscsi.h) |