Condividi tramite


IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)

Crea un blocco di descrittore di controllo SCSI personalizzato (CDB) e lo invia al driver immagine in modalità kernel per i bus SCSI.

Codice principale

IRP_MJ_DEVICE_CONTROL

Buffer di input

Puntatore a una struttura SCSISCAN_CMD .

Lunghezza del buffer di input

Dimensioni del buffer di input.

Buffer di output

Puntatore a un buffer di dati. A seconda del tipo di operazione di I/O, questo buffer potrebbe fornire o ricevere dati.

Lunghezza del buffer di output

Dimensioni del buffer di output.

Blocco dello stato

Irp->IoStatus.Status è impostato su STATUS_SUCCESS se la richiesta ha esito positivo. In caso contrario, stato alla condizione di errore appropriata come codice NTSTATUS .

Commenti

Quando la funzione DeviceloControl viene chiamata con il codice di controllo I/O IOCTL_SCSISCAN_CMD, il chiamante deve specificare l'indirizzo di una struttura SCSISCAN_CMD come parametro lpInBuffer della funzione. Questa struttura specifica il tipo di operazione richiesta. Il driver in modalità kernel costruisce un SRB (SCSI Request Block) dal contenuto della struttura SCSISCAN_CMD.

Per i comandi SCSI che prevedono trasferimenti di dati, la funzione lpOutBuffer della funzione DeviceIoControl deve puntare a un buffer di dati. Per le operazioni di lettura, questo buffer riceverà i dati letti dal dispositivo. Per le operazioni di scrittura, il buffer deve contenere i dati da scrivere.

Per altre informazioni, vedere Accesso ai driver Kernel-Mode per i dispositivi ancora immagine.

Esempio di codice

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

Requisiti

Requisito Valore
Intestazione scsiscan.h (include Scsiscan.h)

Vedi anche

Creazione di richieste IOCTL nei driver

WdfIoTargetSendInternalIoctlOthersSynchronously

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously