IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)
Membuat blok deskriptor kontrol SCSI (CDB) yang disesuaikan dan mengirimkannya ke driver gambar diam mode kernel untuk bus SCSI.
Kode utama
Buffer input
Penunjuk ke struktur SCSISCAN_CMD .
Panjang buffer input
Ukuran buffer input.
Buffer output
Penunjuk ke buffer data. Bergantung pada jenis operasi I/O, buffer ini mungkin menyediakan atau menerima data.
Panjang buffer output
Ukuran buffer output.
Blok status
Irp->IoStatus.Status diatur ke STATUS_SUCCESS jika permintaan berhasil. Jika tidak, Status ke kondisi kesalahan yang sesuai sebagai kode NTSTATUS .
Keterangan
Ketika fungsi DeviceloControl dipanggil dengan kode kontrol I/O IOCTL_SCSISCAN_CMD, pemanggil harus menentukan alamat struktur SCSISCAN_CMD sebagai parameter lpInBuffer fungsi. Struktur ini menentukan jenis operasi yang diminta. Driver mode kernel membuat Blok Permintaan SCSI (SRB) dari konten struktur SCSISCAN_CMD.
Untuk perintah SCSI yang melibatkan transfer data, lpOutBuffer fungsi DeviceIoControl harus menunjuk ke buffer data. Untuk operasi baca, buffer ini akan menerima data yang dibaca dari perangkat. Untuk operasi tulis, buffer harus berisi data yang akan ditulis.
Untuk informasi selengkapnya, lihat Mengakses Driver Kernel-Mode untuk Perangkat Gambar Diam.
Contoh kode
SCSISCAN_CMD Cmd;
UCHAR SrbStatus;
// Construct the SCSISCAN_CMD structure and
// clear out the sense buffer.
memset(&Cmd, 0, sizeof(Cmd));
memset(SenseBuffer,0, sizeof(SenseBuffer));
Cmd.Size = sizeof(SCSISCAN_CMD);
Cmd.SrbFlags = SRB_FLAGS_DATA_OUT;
Cmd.CdbLength = 6;
Cmd.SenseLength = 18;
Cmd.TransferLength = len;
Cmd.pSrbStatus = &SrbStatus;
Cmd.pSenseBuffer = SenseBuffer;
Cmd.Cdb[0] = 0x0A;
Cmd.Cdb[4] = ((PFOUR_BYTE)&len) -> Byte0;
Cmd.Cdb[3] = ((PFOUR_BYTE)&len) -> Byte1;
Cmd.Cdb[2] = ((PFOUR_BYTE)&len) -> Byte2;
Cmd.Cdb[5] = 0;
DeviceIoControl(
gb_Scan_Handle,
(DWORD) IOCTL_SCSISCAN_CMD,
&Cmd,
sizeof(Cmd),
buf,
len,
amount_written_ptr,
NULL
);
if (SRB_STATUS_SUCCESS != SRB_STATUS(SrbStatus))
{
fprintf(stderr, "WriteScanner error.\n");
if (SRB_STATUS_DATA_OVERRUN == SrbStatus)
{
fprintf(stderr, "Data over/under run. This is ok.\n");
}
else if ((SenseBuffer[2] & 0xf) == SCSI_SENSE_UNIT_ATTENTION)
{
fprintf(stderr, "Unit attention. Retrying request....\n");
memset(SenseBuffer,0, sizeof(SenseBuffer));
SrbStatus = 0;
DeviceIoControl(
gb_Scan_Handle,
(DWORD) IOCTL_SCSISCAN_CMD,
&Cmd,
sizeof(Cmd),
buf,
len,
amount_written_ptr,
NULL
);
}
}
}
Persyaratan
Persyaratan | Nilai |
---|---|
Header | scsiscan.h (termasuk Scsiscan.h) |
Lihat juga
Membuat Permintaan IOCTL di Driver
WdfIoTargetSendInternalIoctlOthersSynchronously
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk