IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)
IOCTL_ATA_PASS_THROUGH_DIRECT 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 hanya jika tidak ada driver kelas untuk perangkat.
Aplikasi harus menggunakan permintaan ini daripada IOCTL_ATA_PASS_THROUGH jika perintah ATA yang disematkan mungkin memerlukan driver miniport yang mendasar untuk mengakses memori secara langsung.
Jika perintah ATA meminta operasi transfer data, pemanggil harus menyiapkan buffer yang selaras dengan cache dari mana, atau ke mana, driver dapat mentransfer data secara langsung. Pemanggil harus memastikan hal-hal berikut:
- Panjang transfer data memenuhi persyaratan penyelarasan I/O perangkat; jika tidak, IOCTL ini gagal dengan STATUS_INVALID_PARAMETER.
- Panjang transfer data tidak boleh lebih besar dari panjang transfer I/O maksimum perangkat; jika tidak, diharapkan perangkat akan gagal dalam permintaan.
Permintaan IOCTL_ATA_PASS_THROUGH_DIRECT biasanya digunakan untuk mentransfer data dalam jumlah besar (lebih dari 16 KB).
Kode utama
Buffer input
Buffer di Irp-AssociatedIrp.SystemBuffer> berisi struktur ATA_PASS_THROUGH_DIRECT yang mencakup sekumpulan register input file tugas yang menunjukkan jenis perintah yang akan dilakukan. Pemanggil harus menginisialisasi semua anggota struktur ini kecuali untuk PathId, TargetId, dan Lun, yang diisi driver port. Untuk perintah data-out, anggota DataBufferdari ATA_PASS_THROUGH_DIRECT 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>. Nilai InputBufferLength diperbaiki dan tidak bergantung pada jumlah data yang ditransfer. Ini sama dengan sizeof(ATA_PASS_THROUGH_DIRECT). Jika ukuran buffer kurang dari sizeof(ATA_PASS_THROUGH_DIRECT), driver port gagal permintaan I/O dan mengembalikan kesalahan.
Buffer output
Driver port memformat data pengembalian menggunakan struktur ATA_PASS_THROUGH_DIRECT yang disimpannya di buffer di Irp-AssociatedIrp.SystemBuffer>.
Driver port menyimpan data yang ditransfer dalam buffer yang selaras dengan cache yang diarahkan oleh anggota DataBufferdari ATA_PASS_THROUGH_DIRECT.
Driver port mengisi anggota CurrentTaskFile dari ATA_PASS_THROUGH_DIRECT dengan nilai yang ada dalam register output perangkat pada penyelesaian perintah ATA. 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 struktur ATA_PASS_THROUGH_DIRECT untuk menunjukkan jumlah data yang ditransfer dari perangkat.
Buffer Input/Output
Tidak ada.
Panjang buffer Input/Output
Tidak dapat diterapkan.
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 Panjang input dalam ATA_PASS_THROUGH_DIRECT diatur secara tidak benar.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows Server 2003 |
Header | ntddscsi.h (termasuk Ntddscsi.h) |