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)

Lihat juga

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification