struktur SCSI_REQUEST_BLOCK (srb.h)
Struktur SCSI_REQUEST_BLOCK dikaitkan dengan fungsi SRB.
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 .
Sintaks
typedef struct _SCSI_REQUEST_BLOCK {
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR QueueTag;
UCHAR QueueAction;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
union {
ULONG InternalStatus;
ULONG QueueSortKey;
ULONG LinkTimeoutValue;
};
ULONG Reserved;
UCHAR Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
Anggota
Length
Menentukan ukuran dalam byte struktur ini.
Function
Menentukan operasi yang akan dilakukan, yang bisa menjadi salah satu nilai berikut:
Nilai | Operasi |
---|---|
SRB_FUNCTION_EXECUTE_SCSI (0x00) | Permintaan I/O perangkat SCSI harus dijalankan pada unit logis target. |
SRB_FUNCTION_ABORT_COMMAND (0x10) | Pesan SCSIMESS_ABORT harus dikirim untuk membatalkan permintaan yang ditunjukkan oleh anggota NextSrb . Jika ini adalah permintaan antrean yang diberi tag, pesan SCSIMESS_ABORT_WITH_TAG harus digunakan sebagai gantinya. Jika permintaan yang ditunjukkan telah selesai, permintaan ini harus diselesaikan secara normal. Hanya anggota Fungsi SRB, PathId, TargetId, Lun, dan NextSrb yang valid. |
SRB_FUNCTION_RESET_DEVICE (0x13) | Driver ScsiPort tidak lagi mengirim SRB ini ke miniports-nya. Hanya driver miniport Storport yang menggunakan SRB ini. Pengontrol target SCSI harus diatur ulang menggunakan pesan SCSIMESS_BUS_DEVICE_RESET. Driver miniport harus menyelesaikan permintaan aktif untuk pengontrol target. Hanya anggota Fungsi SRB, TargetId, dan PathId yang valid. |
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) | Unit logis harus diatur ulang, jika memungkinkan. Driver miniport HBA harus menyelesaikan permintaan aktif untuk unit logis. Hanya anggota Fungsi, PathId, TargetId, dan Lun dari SRB yang valid. Storport mendukung jenis reset ini, tetapi port SCSI tidak. |
SRB_FUNCTION_RESET_BUS (0x12) | Bus SCSI harus diatur ulang menggunakan pesan SCSIMESS_BUS_DEVICE_RESET. Driver miniport menerima permintaan ini hanya jika permintaan tertentu telah kehabisan waktu dan permintaan berikutnya untuk membatalkan permintaan waktu habis juga telah kehabisan waktu. Hanya fungsi SRB dan anggota PathId yang valid. |
SRB_FUNCTION_TERMINATE_IO (0x14) | Pesan SCSIMESS_TERMINATE_IO_PROCESS harus dikirim untuk membatalkan permintaan yang ditunjukkan oleh anggota NextSrb . Jika permintaan yang ditunjukkan telah selesai, permintaan ini harus diselesaikan secara normal. Hanya anggota Fungsi SRB, PathId, TargetId, Lun, dan NextSrb yang valid. |
SRB_FUNCTION_RELEASE_RECOVERY (0x11) | Pesan SCSIMESS_RELEASE_RECOVERY harus dikirim ke pengontrol target. Hanya anggota Fungsi SRB, PathId, TargetId, dan Lun yang valid. |
SRB_FUNCTION_RECEIVE_EVENT (0x03) | HBA harus siap untuk menerima pemberitahuan peristiwa asinkron dari target yang ditangani. Anggota SRB DataBuffer menunjukkan di mana data harus ditempatkan. |
SRB_FUNCTION_SHUTDOWN (0x07) | Sistem sedang dimatikan. Permintaan ini dikirim ke driver miniport hanya jika mengatur CachesData ke TRUE di PORT_CONFIGURATION_INFORMATION untuk HBA. Driver miniport seperti itu dapat menerima beberapa pemberitahuan ini sebelum semua aktivitas sistem benar-benar berhenti. Namun, pemberitahuan matikan terakhir akan terjadi setelah I/O mulai terakhir. Hanya anggota Fungsi SRB, PathId, TargetId , dan Lun yang valid. |
SRB_FUNCTION_FLUSH (0x08) | Driver miniport harus membersihkan data cache apa pun untuk perangkat target. Permintaan ini dikirim ke driver miniport hanya jika mengatur CachesData ke TRUE di PORT_CONFIGURATION_INFORMATION untuk HBA. Hanya anggota Fungsi SRB, PathId, TargetId , dan Lun yang valid. |
SRB_FUNCTION_IO_CONTROL (0x02) | Permintaan ini adalah permintaan kontrol I/O, yang berasal dari aplikasi mode pengguna dengan HBA khusus. SRB DataBuffer menunjuk ke header SRB_IO_CONTROL diikuti oleh area data. Nilai dalam DataBuffer dapat digunakan oleh driver, terlepas dari nilai MapBuffers. Hanya anggota Fungsi SRB, SrbFlags, TimeOutValue, DataBuffer, dan DataTransferLength yang valid, bersama dengan anggota SrbExtension jika driver miniport meminta ekstensi SRB saat diinisialisasi. Jika driver miniport mengontrol HBA khusus aplikasi sehingga mendukung permintaan ini, driver miniport harus menjalankan permintaan dan memberi tahu driver port khusus OS ketika SRB telah selesai, menggunakan mekanisme panggilan normal ke ScsiPortNotification dengan RequestComplete dan NextRequest. |
SRB_FUNCTION_LOCK_QUEUE (0x18) | Menahan permintaan yang diantrekan oleh driver port untuk unit logis tertentu, biasanya saat permintaan daya sedang diproses. Hanya anggota SRB Length, Function, SrbFlags, dan OriginalRequest yang valid. Ketika antrean dikunci, hanya permintaan dengan SrbFlags ORed dengan SRB_FLAGS_BYPASS_LOCKED_QUEUE yang akan diproses. Driver miniport SCSI tidak memproses permintaan SRB_FUNCTION_LOCK_QUEUE. |
SRB_FUNCTION_UNLOCK_QUEUE (0x19) | Merilis antrean driver port untuk unit logis yang sebelumnya dikunci dengan SRB_FUNCTION_LOCK_QUEUE. SrbFlags dari permintaan buka kunci harus ORed dengan SRB_FLAGS_BYPASS_LOCKED_QUEUE. Hanya anggota SRB Length, Function, SrbFlags, dan OriginalRequest yang valid. Driver miniport SCSI tidak memproses permintaan SRB_FUNCTION_UNLOCK_QUEUE. |
SRB_FUNCTION_UNLOCK_QUEUE (0x19) | Merilis antrean driver port untuk unit logis yang sebelumnya dikunci dengan SRB_FUNCTION_LOCK_QUEUE. SrbFlags dari permintaan buka kunci harus ORed dengan SRB_FLAGS_BYPASS_LOCKED_QUEUE. Hanya anggota SRB Length, Function, SrbFlags, dan OriginalRequest yang valid. Driver miniport SCSI tidak memproses permintaan SRB_FUNCTION_UNLOCK_QUEUE. |
SRB_FUNCTION_DUMP_POINTERS (0x26) | Permintaan dengan fungsi ini dikirim ke driver miniport Storport yang digunakan untuk mengontrol disk yang menyimpan data crash dump. Permintaan ini mengumpulkan informasi yang diperlukan dari driver miniport untuk mendukung crash dump dan hibernasi. Lihat struktur MINIPORT_DUMP_POINTERS . Driver miniport fisik harus mengatur bendera STOR_FEATURE_DUMP_POINTERS di anggota FeatureSupportdari HW_INITIALIZATION_DATA untuk menerima permintaan dengan fungsi ini. |
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) | Permintaan dengan fungsi ini dikirim ke driver miniport Storport untuk merilis sumber daya apa pun yang dialokasikan selama permintaan sebelumnya untuk SRB_FUNCTION_DUMP_POINTERS. |
SrbStatus
Mengembalikan status permintaan yang telah selesai. Anggota ini harus ditetapkan oleh driver miniport sebelum memberi tahu driver khusus OS bahwa permintaan telah selesai dengan memanggil ScsiPortNotification dengan RequestComplete. Nilai anggota ini bisa menjadi salah satu dari berikut ini:
Nilai | Makna |
---|---|
SRB_STATUS_PENDING | Menunjukkan permintaan sedang berlangsung. Driver port khusus OS menginisialisasi SrbStatus ke nilai ini. |
SRB_STATUS_SUCCESS | Menunjukkan bahwa permintaan berhasil diselesaikan. |
SRB_STATUS_ABORTED | Menunjukkan permintaan dibatalkan seperti yang diarahkan oleh driver port. Driver miniport menetapkan status ini di NextSrb untuk permintaan SRB_FUNCTION_ABORT_COMMAND yang berhasil. |
SRB_STATUS_ABORT_FAILED | Menunjukkan upaya untuk membatalkan permintaan gagal. Kembalikan status ini untuk permintaan SRB_FUNCTION_ABORT_COMMAND ketika permintaan yang ditentukan tidak dapat ditemukan. |
SRB_STATUS_ERROR | Menunjukkan permintaan selesai dengan kesalahan dalam status bus SCSI. |
SRB_STATUS_BUSY | Menunjukkan driver miniport atau perangkat target tidak dapat menerima permintaan saat ini. Driver port khusus OS akan mengirimkan ulang permintaan nanti. |
SRB_STATUS_INTERNAL_ERROR | Menunjukkan bahwa driver Port SCSI tidak dapat mengirimkan permintaan ke driver miniport atau perangkat target. Dalam kasus seperti itu, status dicatat di InternalStatus. |
SRB_STATUS_INVALID_REQUEST | Menunjukkan driver miniport tidak mendukung permintaan yang diberikan. |
SRB_STATUS_NO_DEVICE | Menunjukkan perangkat tidak merespons. |
SRB_STATUS_TIMEOUT | Menunjukkan waktu permintaan habis. |
SRB_STATUS_SELECTION_TIMEOUT | Menunjukkan waktu pemilihan perangkat SCSI habis. |
SRB_STATUS_COMMAND_TIMEOUT | Menunjukkan target tidak menyelesaikan perintah dalam batas waktu. |
SRB_STATUS_MESSAGE_REJECTED | Menunjukkan target menolak pesan. Ini biasanya dikembalikan hanya untuk permintaan jenis pesan seperti SRB_FUNCTION_TERMINATE_IO. |
SRB_STATUS_BUS_RESET | Menunjukkan reset bus terjadi saat permintaan ini sedang dijalankan. |
SRB_STATUS_PARITY_ERROR | Menunjukkan kesalahan paritas yang terjadi pada bus SCSI dan bahwa percobaan kembali gagal. |
SRB_STATUS_REQUEST_SENSE_FAILED | Menunjukkan perintah request-sense gagal. Ini dikembalikan hanya jika HBA melakukan pengertian permintaan otomatis dan driver miniport mengatur AutoRequestSense ke TRUE di PORT_CONFIGURATION_INFORMATION untuk HBA ini. |
SRB_STATUS_NO_HBA | Menunjukkan HBA tidak merespons. |
SRB_STATUS_DATA_OVERRUN | Menunjukkan bahwa terjadi kesalahan overrun atau underrun data. Driver miniport juga harus memperbarui anggota DataTransferLength SRB untuk menunjukkan berapa banyak data yang sebenarnya ditransfer jika underrun terjadi. |
SRB_STATUS_UNEXPECTED_BUS_FREE | Menunjukkan target terputus secara tak terduga. |
SRB_STATUS_PHASE_SEQUENCE_FAILURE | Menunjukkan HBA mendeteksi kesalahan kegagalan urutan fase ilegal. |
SRB_STATUS_REQUEST_FLUSHED | Menunjukkan permintaan status dihentikan. |
SRB_STATUS_BAD_FUNCTION | Menunjukkan kode Fungsi SRB tidak didukung. |
SRB_STATUS_INVALID_PATH_ID | Menunjukkan PathId yang ditentukan dalam SRB tidak ada. |
SRB_STATUS_INVALID_TARGET_ID | Menunjukkan nilai TargetID dalam SRB tidak valid. |
SRB_STATUS_INVALID_LUN | Menunjukkan nilai Lun dalam SRB tidak valid. |
SRB_STATUS_ERROR_RECOVERY | Menunjukkan permintaan selesai dengan kesalahan dalam status bus SCSI dan bahwa pesan SCSI INITIATE RECOVERY diterima. |
SRB_STATUS_AUTOSENSE_VALID | Menunjukkan informasi yang dikembalikan dalam SenseInfoBuffer valid. |
SRB_STATUS_QUEUE_FROZEN | Driver miniport tidak boleh mengatur anggota SrbStatus ke nilai ini. Driver port Windows dapat mengatur nilai ini untuk menginformasikan driver kelas penyimpanan bahwa antrean permintaannya untuk periferal tertentu telah dibekukan. |
ScsiStatus
Mengembalikan status SCSI yang dikembalikan oleh HBA atau perangkat target. Jika statusnya bukan BERHASIL, driver miniport harus mengatur anggota SrbStatus ke SRB_STATUS_ERROR.
PathId
Menunjukkan port atau bus SCSI untuk permintaan tersebut. Nilai ini berbasis nol.
TargetId
Menunjukkan pengontrol target atau perangkat di bus.
Lun
Menunjukkan nomor unit logis perangkat.
QueueTag
Berisi nilai queue-tag yang ditetapkan oleh driver port khusus OS. Jika anggota ini digunakan untuk antrean bertag, HBA mendukung antrean permintaan internal ke LUs dan driver miniport mengatur TaggedQueueing ke TRUE di PORT_CONFIGURATION_INFORMATION untuk HBA ini.
QueueAction
Menunjukkan pesan antrean bertag yang akan digunakan saat bendera SRB_FLAGS_QUEUE_ACTION_ENABLE diatur. Nilainya bisa menjadi salah satu dari yang berikut: SRB_SIMPLE_TAG_REQUEST, SRB_HEAD_OF_QUEUE_TAG_REQUEST, atau SRB_ORDERED_QUEUE_TAG_REQUEST, seperti yang didefinisikan sesuai dengan spesifikasi SCSI.
CdbLength
Menunjukkan ukuran dalam byte blok deskriptor perintah SCSI-2 atau yang lebih baru.
SenseInfoBufferLength
Menunjukkan ukuran dalam byte buffer request-sense. Jika underrun terjadi, driver miniport harus memperbarui anggota ini ke jumlah byte yang benar-benar ditransfer.
SrbFlags
Menunjukkan berbagai parameter dan opsi tentang permintaan. SrbFlags bersifat baca-saja, kecuali ketika SRB_FLAGS_UNSPECIFIED_DIRECTION diatur dan driver miniport adaptor DMA bawahan diperlukan untuk memperbarui SRB_FLAGS_DATA_IN atau SRB_FLAGS_DATA_OUT. Anggota ini dapat mengatur satu atau beberapa bendera berikut:
Bendera | Makna |
---|---|
SRB_FLAGS_QUEUE_ACTION_ENABLE | Menunjukkan tindakan tagged-queue yang akan diaktifkan. |
SRB_FLAGS_DISABLE_AUTOSENSE | Menunjukkan bahwa informasi yang masuk akal permintaan tidak boleh dikembalikan. |
SRB_FLAGS_DATA_IN | Menunjukkan data akan ditransfer dari perangkat ke sistem. |
SRB_FLAGS_DATA_OUT | Menunjukkan data akan ditransfer dari sistem ke perangkat. |
SRB_FLAGS_UNSPECIFIED_DIRECTION | Didefinisikan untuk kompatibilitas mundur dengan antarmuka ASPI/CAM SCSI, bendera ini menunjukkan bahwa arah transfer bisa menjadi salah satu dari yang sebelumnya karena kedua bendera sebelumnya diatur. Jika bendera ini diatur, driver miniport harus menentukan arah transfer dengan memeriksa fase data untuk target pada bus SCSI. Jika HBA-nya adalah perangkat DMA subordinat, driver miniport tersebut harus memperbarui SRB_FLAGS_DATA_OUT atau SRB_FLAGS_DATA_IN ke nilai yang benar sebelum memanggil ScsiPortIoMapTransfer. |
SRB_FLAGS_NO_DATA_TRANSFER | Menunjukkan tidak ada transfer data dengan permintaan ini. Jika ini diatur, bendera SRB_FLAGS_DATA_OUT, SRB_FLAGS_DATA_IN, dan SRB_FLAGS_UNSPECIFIED_DIRECTION jelas. |
SRB_FLAGS_DISABLE_SYNCH_TRANSFER | Menunjukkan HBA, jika memungkinkan, harus melakukan I/O asinkron untuk permintaan transfer ini. Jika I/O sinkron dinegosiasikan sebelumnya, HBA harus bernegosiasi ulang untuk I/O asinkron sebelum melakukan transfer. |
SRB_FLAGS_DISABLE_DISCONNECT | Menunjukkan HBA tidak boleh mengizinkan target terputus dari bus SCSI selama pemrosesan permintaan ini. |
SRB_FLAGS_BYPASS_FROZEN_QUEUE | Tidak relevan dengan driver miniport. |
SRB_FLAGS_NO_QUEUE_FREEZE | Tidak relevan dengan driver miniport. |
SRB_FLAGS_IS_ACTIVE | Tidak relevan dengan driver miniport. |
SRB_FLAGS_ALLOCATED_FROM_ZONE | Tidak relevan dengan driver miniport dan kedaluwarsa ke driver kelas Windows saat ini. Untuk driver kelas warisan Windows, ini menunjukkan apakah SRB dialokasikan dari buffer zona. Jika bendera ini diatur, driver kelas harus memanggil ExInterlockedFreeToZone untuk merilis SRB; jika tidak, itu harus memanggil ExFreePool. Driver kelas baru harus menggunakan daftar lookaside daripada buffer zona. |
SRB_FLAGS_SGLIST_FROM_POOL | Tidak relevan dengan pengemudi miniport. Untuk driver kelas Windows, ini menunjukkan bahwa memori untuk daftar sebar/kumpulkan dialokasikan dari kumpulan yang tidak disebarkan. Jika bendera ini diatur, driver kelas harus memanggil ExFreePool untuk merilis memori setelah SRB selesai. |
SRB_FLAGS_BYPASS_LOCKED_QUEUE | Tidak relevan dengan pengemudi miniport. Untuk driver port, bendera ini menunjukkan bahwa permintaan harus diproses apakah antrean unit logis dikunci. Driver tingkat yang lebih tinggi harus mengatur bendera ini untuk mengirim permintaan SRB_FUNCTION_UNLOCK_QUEUE. |
SRB_FLAGS_NO_KEEP_AWAKE | Tidak relevan dengan pengemudi miniport. Driver kelas Windows menggunakan bendera ini untuk menunjukkan kepada pengandar port untuk melaporkan idle daripada menyalakan perangkat untuk menangani permintaan ini. |
SRB_FLAGS_FREE_SENSE_BUFFER | Menunjukkan bahwa port atau driver miniport telah mengalokasikan buffer untuk data yang masuk akal. Ini memberi tahu driver kelas bahwa ia harus membebaskan buffer data sense setelah mengekstrak data. |
DataTransferLength
Menunjukkan ukuran dalam byte buffer data. Jika underrun terjadi, driver miniport harus memperbarui anggota ini ke jumlah byte yang benar-benar ditransfer.
TimeOutValue
Menunjukkan interval dalam hitungan detik yang dapat dijalankan permintaan sebelum driver port khusus OS mungkin menganggapnya kehabisan waktu. Driver miniport tidak diperlukan untuk permintaan waktu karena driver port sudah melakukannya.
DataBuffer
Menunjuk ke buffer data. Driver miniport tidak boleh menggunakan nilai ini sebagai penunjuk data kecuali driver miniport mengatur MapBuffers ke TRUE di PORT_CONFIGURATION_INFORMATION untuk HBA. Namun, dalam kasus permintaan SRB_FUNCTION_IO_CONTROL, driver miniport dapat menggunakan nilai ini sebagai penunjuk data terlepas dari nilai MapBuffers.
SenseInfoBuffer
Menunjuk ke buffer request-sense. Driver miniport tidak diperlukan untuk memberikan data request-sense setelah CHECK CONDITION.
NextSrb
Menunjukkan SCSI_REQUEST_BLOCK yang berlaku untuk permintaan ini. Hanya sebagian kecil permintaan yang menggunakan SRB kedua, misalnya SRB_FUNCTION_ABORT_COMMAND.
OriginalRequest
Menunjuk ke IRP untuk permintaan ini. Anggota ini tidak relevan dengan pengemudi miniport
SrbExtension
Menunjuk ke ekstensi Srb. Driver miniport tidak boleh menggunakan anggota ini jika mengatur SrbExtensionSize ke nol dalam SCSI_HW_INITIALIZATION_DATA. Memori di SrbExtension tidak diinisialisasi oleh driver port khusus OS, dan data yang ditentukan driver miniport dapat diakses langsung oleh HBA. Alamat fisik yang sesuai dapat diperoleh dengan memanggil ScsiPortGetPhysicalAddress dengan pointer SrbExtension .
InternalStatus
Digunakan oleh driver Port SCSI, bukan SrbStatus, untuk melaporkan status permintaan yang selesai setiap kali permintaan tidak dapat dikirimkan ke driver miniport. Dalam kasus seperti itu, SrbStatus diatur ke SRB_STATUS_INTERNAL_ERROR. Anggota ini digunakan secara eksklusif untuk komunikasi antara Port SCSI dan driver kelas dan tidak boleh digunakan oleh driver miniport.
QueueSortKey
Menentukan offset dari awal media atau nol, tergantung pada jenis perangkat target.
LinkTimeoutValue
Tautkan nilai batas waktu.
Reserved
Dicadangkan.
Cdb[16]
Menentukan blok deskriptor perintah SCSI-2 atau yang lebih baru untuk dikirim ke perangkat target.
Keterangan
Kelas penyimpanan Windows dan driver filter dapat mengirim SRB dengan nilai Fungsi berikut ke driver port sistem:
- SRB_FUNCTION_CLAIM_DEVICE untuk menunjukkan bahwa driver kelas mendukung periferal yang diidentifikasi di SRB oleh anggota PathId, TargetId, dan Lun .
- SRB_ATTACH_DEVICE untuk menunjukkan bahwa driver filter, berlapis di atas driver kelas, ingin permintaan periferal tertentu dirutekan terlebih dahulu ke driver filter.
- SRB_FUNCTION_RELEASE_DEVICE untuk menunjukkan bahwa driver kelas merilis klaimnya pada periferal tertentu.
- SRB_FUNCTION_FLUSH_QUEUE untuk meminta pembatalan permintaan apa pun yang saat ini diantrekan di driver port ke periferal tertentu.
- SRB_FUNCTION_RELEASE_QUEUE untuk meminta agar driver port merilis antrean permintaan yang dibekukan ke periferal tertentu.
SRB_FUNCTION_XXXX sebelumnya tidak pernah diatur dalam SRB yang dikirim ke driver miniport SCSI. SRB_FUNCTION_REMOVE_DEVICE didefinisikan untuk digunakan dalam versi sistem yang akan datang. Ini juga, tidak pernah diatur dalam SRB yang dikirim ke driver miniport SCSI. SRB_FUNCTION_WMI_REQUEST hanya valid dalam SCSI_WMI_REQUEST_BLOCK. Kelas penyimpanan atau driver filter menggunakan ini untuk mengirim permintaan WMI ke driver port.
Persyaratan
Persyaratan | Nilai |
---|---|
Header | srb.h (termasuk Srb.h, Minitape.h, Storport.h) |