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 gli autobus 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 di 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.

Osservazioni

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 blocco di richieste SCSI (SRB) dal contenuto della struttura SCSISCAN_CMD.

Per i comandi SCSI che prevedono trasferimenti di dati, la funzione DeviceIoControllpOutBuffer 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
      );
    }
  }
}

Fabbisogno

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

Vedere anche

creazione di richieste IOCTL nei driver

WdfIoTargetSendInternalIoctlOthersSynchronously

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously