Bagikan melalui


Rutinitas BuildRequest Driver Kelas Penyimpanan

Seperti semua driver mode kernel tingkat lebih tinggi, driver kelas penyimpanan harus mengatur lokasi tumpukan I/O IRP untuk driver yang lebih rendah berikutnya saat Menangani Permintaan ke Periferal Penyimpanan. Dalam IRP yang disiapkan driver kelas dengan SRB untuk driver port yang disediakan sistem, lokasi tumpukan I/O driver port diatur dengan yang berikut:

  • MajorFunction berisi IRP_MJ_SCSI

  • Parameters.Scsi.Srb berisi pointer ke SRB

Setiap driver kelas bertanggung jawab untuk mengalokasikan memori untuk SRB serta untuk menyiapkannya dengan CDB untuk driver port penyimpanan yang mendasar. Driver kelas dapat mengatur daftar pencarian untuk SRB-nya dengan ExInitializeNPageLookasideList atau memanggil ExAllocatePool untuk memori yang tidak di-patahkan. Lihat Menggunakan Daftar Lookaside untuk informasi selengkapnya tentang menggunakan daftar lookaside dan kumpulan yang tidak bertumpuk.

Baik itu mengalokasikan memori dari kumpulan atau dari daftar lookaside yang dibuat driver, setiap driver kelas penyimpanan bertanggung jawab untuk membebaskan memori yang dialokasikan untuk SRB. Rutinitas IoCompletion driver kelas penyimpanan, yang dijelaskan dalam Rutinitas IoCompletion Driver Kelas Penyimpanan, biasanya merilis memori yang dialokasikan untuk SRB kembali ke daftar lookaside.

Rutinitas BuildRequest driver kelas harus menetapkan nilai yang sesuai dalam anggota SRB, termasuk panjang CDB yang telah disiapkannya untuk berkomunikasi dengan perangkatnya. Untuk permintaan yang mengembalikan informasi request-sense dan/atau bahwa driver mungkin perlu mencoba kembali, ia menetapkan rutinitas IoCompletion di IRP. Untuk permintaan baca atau tulis, itu OR SrbFlags dengan arah transfer yang sesuai, masing-masing SRB_FLAGS_DATA_IN atau SRB_FLAGS_DATA_OUT.

Rutinitas BuildRequest mungkin berbagi tanggung jawab untuk menyiapkan SRB dengan sepasang rutinitas SendSrbSynchronous dan SendSrbAsynchronous . Artinya, rutinitas BuildRequest dapat mengatur anggota SRB yang biasanya disiapkan untuk semua permintaan, sementara SendSrbXxx rutin setiap mengatur nilai SRB yang hanya berkaitan dengan setiap jenis permintaan. Ketika IRP diturunkan ke driver port dari rutinitas SendSrbAsynchronous , IRP harus diatur dengan rutinitas IoCompletion yang disediakan driver.

Setelah driver kelas dimuat, ia mengatur sebagian besar SRB dengan anggota Fungsi diatur ke SRB_FUNCTION_EXECUTE_SCSI, menunjukkan permintaan I/O perangkat untuk dikirim melalui bus.

Untuk informasi selengkapnya tentang anggota SRB yang ditentukan sistem dan nilainya, lihat SCSI_REQUEST_BLOCK.

Menyiapkan SRB untuk Request Sense

Driver kelas dapat meminta agar driver port mengembalikan request-sense SCSI atau informasi yang setara ketika pengontrol target mengembalikan kondisi pemeriksaan. Untuk melakukan ini, driver kelas mengatur penunjuk SenseInfoBuffer dan SenseInfoBufferLength di SRB, sehingga driver port dapat mengembalikan informasi request-sense jika kondisi pemeriksaan terjadi. Driver port menunjukkan bahwa ia mengembalikan informasi request-sense dengan mengatur anggota SrbStatus dengan SRB_STATUS_AUTOSENSE_VALID saat mengembalikan IRP. Untuk informasi selengkapnya tentang rutinitas InterpretSenseInfo , lihat Rutinitas InterpretRequestSense Driver Kelas Penyimpanan.

Pengulangan

Driver kelas penyimpanan bertanggung jawab untuk mencoba kembali permintaan yang gagal karena kesalahan target/pengontrol, pengaturan ulang bus, atau permintaan waktu habis. Akibatnya, banyak driver kelas mempertahankan jumlah coba lagi di lokasi tumpukan I/O mereka sendiri dari IRP. Rutinitas BuildRequest driver kelas seperti itu juga dapat menginisialisasi batas coba lagi untuk permintaan tertentu sebelum mengatur rutinitas IoCompletion-nya dan mengirim IRP ke driver port. Untuk informasi selengkapnya tentang rutinitas RetryRequest , lihat Rutinitas RetryRequest Driver Storage Class Driver.