TAPE_PROCESS_COMMAND_ROUTINE fungsi panggilan balik (minitape.h)

TAPE_PROCESS_COMMAND_ROUTINE menangani aspek khusus perangkat dari permintaan IOCTL.

Sintaks

TAPE_PROCESS_COMMAND_ROUTINE TapeProcessCommandRoutine;

TAPE_STATUS TapeProcessCommandRoutine(
  [in, out]      PVOID MinitapeExtension,
  [in, out]      PVOID CommandExtension,
  [in, out]      PVOID CommandParameters,
  [in, out]      PSCSI_REQUEST_BLOCK Srb,
  [in]           ULONG CallNumber,
  [in, optional] TAPE_STATUS StatusOfLastCommand,
  [in, out]      PULONG RetryFlags
)
{...}

Parameter

[in, out] MinitapeExtension

Arahkan ke ekstensi minitape khusus driver. Ini ADALAH NULL jika driver miniclass tidak meminta ekstensi minitape saat diinisialisasi.

[in, out] CommandExtension

Arahkan ke ekstensi perintah. Ini ADALAH NULL jika driver miniclass tidak meminta ekstensi perintah ketika diinisialisasi.

[in, out] CommandParameters

Penunjuk ke buffer yang dialokasikan oleh pemanggil yang berisi struktur TAPE_CREATE_PARTITION .

[in, out] Srb

Pointer ke SRB yang dialokasikan dan sebagian diisi oleh driver kelas tape. TAPE_PROCESS_COMMAND_ROUTINE harus mengisi CDB di SRB.

  • Cdb - Pointer ke SCSI CDB untuk perintah . Bersihkan CDB dengan TapeClassZeroMemory sebelum mengisinya.
  • CdbLength - Menentukan jumlah byte dalam CDB.
TAPE_PROCESS_COMMAND_ROUTINE mungkin juga mengisi anggota berikut di SRB:
  • DataBuffer - Penunjuk ke buffer data yang akan ditransfer. Gunakan TapeClassAllocateSrbBuffer untuk mengalokasikan DataBuffer dengan panjang yang lebih besar dari atau sama dengan DataTransferLength.
  • DataTransferLength - Menentukan jumlah byte yang akan ditransfer dalam SRB. Anggota ini ditetapkan oleh TapeClassAllocateSrbBuffer.
  • TimeOutValue - Menentukan nilai waktu habis untuk perintah ini, menggantikan nilai batas waktu default dari ekstensi perangkat driver kelas pita.
  • SrbFlags - Menentukan bendera untuk perintah ini. Driver miniclass pita harus mengatur SRB_FLAGS_DATA_OUT jika SRB mengirim data ke drive pita. Anggota ini bisa menjadi nol jika SRB meminta data dari drive pita atau jika tidak ada data yang ditransfer oleh perintah.

[in] CallNumber

Menentukan berapa kali TAPE_PROCESS_COMMAND_ROUTINE dipanggil untuk memproses perintah pita tertentu. CallNumber adalah nol saat pertama kali rutinitas ini dipanggil dan bertahap untuk setiap panggilan berikutnya sampai driver miniclass mengembalikan nilai TAPE_STATUS yang menunjukkan perintah selesai.

[in, optional] StatusOfLastCommand

Menentukan status perintah terakhir. Dalam panggilan pertama ke TAPE_PROCESS_COMMAND_ROUTINE untuk memproses permintaan tertentu, StatusOfLastCommand TAPE_STATUS_SUCCESS. Dalam panggilan berikutnya, StatusOfLastCommand TAPE_STATUS_SUCCESS atau status kesalahan jika terjadi kesalahan dan driver miniclass pita yang diatur RETURN_ERRORS di RetryFlags pada panggilan sebelumnya.

[in, out] RetryFlags

Penunjuk ke variabel yang menentukan tindakan apa yang harus dilakukan driver kelas pita saat perangkat pita melaporkan kesalahan.

Kata berurutan rendah menentukan jumlah percobaan ulang yang akan dilakukan jika terjadi kegagalan perintah SCSI. Defaultnya adalah nol (tidak ada percobaan ulang).

Kata urutan tinggi berisi bendera yang menentukan bagaimana driver kelas pita harus mengembalikan kontrol jika terjadi kesalahan:

  • Jika RETURN_ERRORS dan IGNORE_ERRORS jelas (default) driver kelas pita mengembalikan status kegagalan ke pemohon asli.
  • Jika driver miniclass diatur RETURN_ERRORS, driver kelas pita memanggil TAPE_PROCESS_COMMAND_ROUTINE dengan StatusOfLastCommand diatur ke status kegagalan.
  • Jika driver miniclass diatur IGNORE_ERRORS, driver kelas pita mengonversi status kegagalan menjadi sukses dan memanggil TAPE_PROCESS_COMMAND_ROUTINE dengan StatusOfLastCommand diatur ke sukses.

Nilai kembali

Menampilkan kode Deskripsi
TAPE_STATUS_SEND_SRB_AND_CALLBACK
Menunjukkan ke driver kelas kaset bahwa SRB telah diisi dan siap untuk dikirim ke perangkat target. Secara default, driver kelas pita memanggil TAPE_PROCESS_COMMAND_ROUTINE lagi hanya jika SRB berhasil. Driver miniclass dapat memodifikasi perilaku default dengan mengatur RetryFlags sebelum kembali dari TAPE_PROCESS_COMMAND_ROUTINE.
TAPE_STATUS_CALLBACK
Mengarahkan driver kelas pita untuk menambah CallNumber dan memanggil TAPE_PROCESS_COMMAND_ROUTINE lagi tanpa mengirim SRB ke perangkat pita.
TAPE_STATUS_CHECK_TEST_UNIT_READY
Mengarahkan driver kelas kaset untuk mengisi SRB untuk perintah TEST UNIT READY dan mengirim SRB ke perangkat.
TAPE_STATUS_XXX
Kode pengembalian lainnya menunjukkan kepada driver kelas pita bahwa perintah selesai dan menunjukkan keberhasilan, kegagalan, atau peringatan. Kemungkinan nilai pengembalian penyelesaian untuk rutinitas ini meliputi, tetapi tidak terbatas pada:
TAPE_STATUS_SUCCESS
TAPE_STATUS_INSUFFICIENT_RESOURCES
TAPE_STATUS_INVALID_DEVICE_REQUEST
TAPE_STATUS_INVALID_PARAMETER
TAPE_STATUS_IO_DEVICE_ERROR
TAPE_STATUS_MEDIA_WRITE_PROTECTED
TAPE_STATUS_NOT_IMPLEMENTED

Keterangan

Fungsi berikut dapat ditetapkan ke tempat penampung panggilan balik ini:

CreatePartition

CreatePartition menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_CREATE_PARTITION . Rutinitas ini diperlukan. CreatePartition membuat partisi pada pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas pita. Membuat partisi biasanya memerlukan serangkaian SRB untuk menyelesaikan operasi. Setelah CreatePartition mengisi SRB tertentu dan kembali, driver kelas pita mengirim SRB ke perangkat target dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil TapeMiniCreatePartition lagi.

CreatePartition harus mengisi anggota berikut di SRB sebelum kembali ke driver kelas tape:

Jika driver miniclass pita menyimpan informasi partisi di ekstensi minitape, CreatePartition memperbarui ekstensi sebelum kembali ke driver kelas pita dengan TAPE_STATUS_SUCCESS.

Menghapus

Menghapus menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_ERASE . Rutinitas ini diperlukan. Menghapus penghapusan pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas kaset. Menghapus pita biasanya memerlukan satu SRB untuk menyelesaikan operasi. Setelah Hapus isi SRB dan kembali, driver kelas pita mengirim SRB ke perangkat dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil Hapus lagi. Hapus kemudian mengembalikan TAPE_STATUS_SUCCESS.

GetDriveParameters

GetDriveParameters menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_GET_DRIVE_PARAMS . Rutinitas ini diperlukan. GetDriveParameters mendapatkan parameter tape drive dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas tape. Mendapatkan parameter drive biasanya memerlukan serangkaian SRB untuk menyelesaikan operasi. Setelah GetDriveParameters mengisi SRB tertentu dan kembali, driver kelas pita mengirim SRB ke perangkat target dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil GetDriveParameters lagi.

GetMediaParameters

GetMediaParameters menangani aspek spesifik perangkat dari permintaan IOCTL_TAPE_GET_MEDIA_PARAMS . Rutinitas ini diperlukan. GetMediaParameters mendapatkan parameter media tape dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas tape. Mendapatkan parameter media biasanya memerlukan lebih dari satu SRB untuk menyelesaikan operasi, dimulai dengan unit pengujian yang diminta driver miniclass dengan mengembalikan TAPE_STATUS_CHECK_TEST_UNIT_READY pertama kali driver kelas pita memanggil rutinitas.

Setelah GetMediaParameters mengisi SRB tertentu dan kembali, driver kelas kaset mengirim SRB ke perangkat dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil GetMediaParameters lagi.

GetMediaTypes

GetMediaTypes menangani aspek khusus perangkat dari permintaan IOCTL_STORAGE_GET_MEDIA_TYPES_EX . Rutinitas ini diperlukan. GetMediaTypes mendapatkan informasi tentang jenis media yang didukung oleh perangkat pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas pita. Mendapatkan jenis media biasanya memerlukan lebih dari satu SRB untuk menyelesaikan operasi, dimulai dengan unit pengujian yang siap yang diminta driver miniclass dengan mengembalikan TAPE_STATUS_CHECK_TEST_UNIT_READY pertama kali driver kelas pita memanggil rutinitas.

GetPosition

GetPosition menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_GET_POSITION . Rutinitas ini diperlukan. GetPosition membaca posisi pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas tape. Membaca posisi pita biasanya membutuhkan lebih dari satu SRB untuk menyelesaikan operasi, sering dimulai dengan unit pengujian yang siap yang diminta driver miniclass dengan mengembalikan TAPE_STATUS_CHECK_TEST_UNIT_READY pertama kali driver kelas pita memanggil rutinitas.

GetStatus

GetStatus menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_GET_STATUS . Rutinitas ini diperlukan. GetStatus membaca status perangkat pita, biasanya dengan mengarahkan driver kelas pita untuk mengeluarkan perintah siap unit pengujian.

Jika perangkat menunjukkan apakah drive perlu dibersihkan dalam arti data (dibandingkan dengan melaporkan kebutuhan untuk membersihkan sebagai kesalahan, yang akan ditangani driver miniclass dalam rutinitas TapeMiniTapeError ), GetStatus mengisi CDB di SRB yang diteruskan oleh driver kelas pita untuk mendapatkan data pengertian dan, jika perlu, mengembalikan TAPE_STATUS_REQUIRES_CLEANING.

Mempersiapkan

Persiapan menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_PREPARE . Rutinitas ini diperlukan. Persiapkan menyiapkan pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas pita. Jika perangkat mendukung operasi yang diminta, menyiapkan pita biasanya memerlukan satu SRB. Setelah Persiapan mengisi SRB dan mengembalikan, driver kelas pita mengirim SRB ke perangkat dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil Siapkan lagi.

SetDriveParameters

SetDriveParameters menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_SET_DRIVE_PARAMS . Rutinitas ini diperlukan. SetDriveParameters mengatur parameter untuk perangkat pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas pita. Mengatur parameter biasanya melibatkan serangkaian SRB untuk menyelesaikan operasi. Setelah SetDriveParameters mengisi SRB tertentu dan mengembalikan, driver kelas pita mengirim SRB ke perangkat dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil SetDriveParameters lagi.

SetMediaParameters

SetMediaParameters menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_SET_MEDIA_PARAMS . Rutinitas ini diperlukan. SetMediaParameters mengatur ukuran blok pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas pita. Mengatur ukuran blok biasanya memerlukan lebih dari satu SRB untuk menyelesaikan operasi, dimulai dengan unit pengujian yang siap yang diminta driver miniclass dengan mengembalikan TAPE_STATUS_CHECK_TEST_UNIT_READY pertama kali driver kelas pita memanggil rutinitas.

Setelah SetMediaParameters mengisi SRB tertentu dan mengembalikan, driver kelas pita mengirim SRB ke perangkat dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil SetMediaParameters lagi.

SetPosition

SetPosition menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_SET_POSITION . Rutinitas ini diperlukan. SetPosition mengatur posisi pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas pita. Mengatur posisi biasanya memerlukan satu SRB. Setelah SetPosition mengisi SRB dan mengembalikan, driver kelas pita mengirim SRB ke perangkat dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil SetPosition lagi. SetPosition kemudian mengembalikan TAPE_STATUS_SUCCESS.

WriteMarks

WriteMarks menangani aspek khusus perangkat dari permintaan IOCTL_TAPE_WRITE_MARKS . Rutinitas ini diperlukan. WriteMarks menulis tanda ke pita dengan mengisi CDB dalam SRB yang diteruskan oleh driver kelas pita. Tanda tulis biasanya membutuhkan satu SRB untuk menyelesaikan operasi. Setelah WriteMarks mengisi SRB dan mengembalikan, driver kelas pita mengirim SRB ke perangkat dan, tergantung pada hasil SRB dan nilai RetryFlags, memanggil WriteMarks lagi. WriteMarks kemudian mengembalikan TAPE_STATUS_SUCCESS.

PreProcessReadWrite

PreProcessReadWrite adalah rutinitas opsional dan tujuan khusus yang melakukan operasi khusus perangkat yang diperlukan sebelum operasi baca dan tulis. Sebagian besar driver miniclass pita tidak memerlukan rutinitas ini. Aktivitas rutinitas PreProcessReadWrite spesifik untuk perangkat. Rutinitas dapat menggunakan informasi yang diteruskan ke dalamnya oleh driver kelas untuk menerapkan praprosem khusus untuk baca dan tulis. Jika drive memiliki kemampuan terbatas, driver mungkin memerlukan rutinitas ini untuk mempertahankan keadaan koheren, misalnya.

Jika driver miniclass pita menetapkan titik masuk non-NULL untuk rutinitas ini dalam struktur TAPE_INIT_DATA_EX diteruskan ke TapeClassInitialize dari rutinitas DriverEntry-nya , driver kelas pita memanggilnya sebelum setiap operasi baca dan tulis pada perangkat pita. Driver kelas tidak mengharapkan informasi apa pun kembali dari rutinitas ini.

WMIOperations

WMIOperations adalah titik masuk umum untuk semua panggilan WMI dari driver kelas pita. Minidriver yang mendukung WMI harus mengatur anggota penunjuk fungsi, WMIOperations, dalam struktur TAPE_INIT_DATA_EX untuk menunjuk ke rutinitas TAPE_PROCESS_COMMAND_ROUTINE minidriver. Minidriver harus melakukan ini dalam rutinitas DriverEntry sebelum memanggil TapeClassInitialize. Jika minidriver tidak mendukung operasi WMI, itu harus mengatur bidang TapeWMIOperations ke NULL.

Driver kelas pita menetapkan nilai kepada anggota struktur TAPE_WMI_OPERATIONS, dan meneruskan struktur ini ke rutinitas WMIOperations minidriver dalam parameter CommandParameters . Seperti halnya rutinitas minidriver lainnya, WMIOperations mengisi, membuat, dan menginisialisasi blok permintaan SCSI (SRB) dan blok deskriptor perintah (CDB) yang diperlukan untuk mengimplementasikan metode WMI yang ditunjukkan, dan mengembalikan kontrol ke driver kelas pita. Driver kelas pita kemudian memanggil driver port untuk menjalankan permintaan.

Minidriver mengembalikan data WMI dalam buffer yang ditujukkan oleh anggota DataBuffer dari struktur TAPE_WMI_OPERATIONS.

Persyaratan

Persyaratan Nilai
Target Platform Desktop
Header minitape.h (termasuk Minitape.h)

Lihat juga

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory