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
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