Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
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