Compartir a través de


IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)

Crea un bloque de descriptor de control SCSI personalizado (CDB) y lo envía al controlador de imágenes de modo kernel para buses SCSI.

Código principal

IRP_MJ_DEVICE_CONTROL

Búfer de entrada

Puntero a una estructura de SCSISCAN_CMD.

Longitud del búfer de entrada

Tamaño del búfer de entrada.

Búfer de salida

Puntero a un búfer de datos. Dependiendo del tipo de operación de E/S, este búfer puede proporcionar o recibir datos.

Longitud del búfer de salida

Tamaño del búfer de salida.

Bloque de estado

Irp->ioStatus.Status se establece en STATUS_SUCCESS si la solicitud se realiza correctamente. De lo contrario, estado a la condición de error adecuada como código NTSTATUS.

Observaciones

Cuando se llama a la función DeviceloControl con el código de control de E/S de IOCTL_SCSISCAN_CMD, el autor de la llamada debe especificar la dirección de una estructura de SCSISCAN_CMD como parámetro de lpInBuffer de la función. Esta estructura especifica el tipo de operación que se solicita. El controlador en modo kernel crea un bloque de solicitud SCSI (SRB) a partir del contenido de la estructura de SCSISCAN_CMD.

Para los comandos SCSI que implican transferencias de datos, el DeviceIoControl función lpOutBuffer debe apuntar a un búfer de datos. Para las operaciones de lectura, este búfer recibirá datos leídos del dispositivo. Para las operaciones de escritura, el búfer debe contener los datos que se van a escribir.

Para obtener más información, consulte Acceso a controladores de Kernel-Mode para dispositivos de imagen fija.

Ejemplo de código

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
      );
    }
  }
}

Requisitos

Requisito Valor
encabezado de scsiscan.h (incluya Scsiscan.h)

Consulte también

crear solicitudes IOCTL en controladores

WdfIoTargetSendInternalIoctlOthersSynchronously

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously