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

IRP_MJ_DEVICE_CONTROL

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

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously