IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)
Erstellt einen benutzerdefinierten SCSI-Steuerelementdeskriptorblock (CDB) und sendet ihn an den Kernelmodus-Standbildtreiber für SCSI-Busse.
Hauptcode
Eingabepuffer
Zeiger auf eine SCSISCAN_CMD-Struktur .
Länge des Eingabepuffers
Größe des Eingabepuffers.
Ausgabepuffer
Zeiger auf einen Datenpuffer. Abhängig vom Typ des E/A-Vorgangs kann dieser Puffer Daten bereitstellen oder empfangen.
Länge des Ausgabepuffers
Größe des Ausgabepuffers.
Statusblock
Irp->IoStatus.Status wird auf STATUS_SUCCESS festgelegt, wenn die Anforderung erfolgreich ist. Andernfalls wird Status zur entsprechenden Fehlerbedingung als NTSTATUS-Code verwendet.
Hinweise
Wenn die DeviceloControl-Funktion mit dem IOCTL_SCSISCAN_CMD E/A-Steuerungscode aufgerufen wird, muss der Aufrufer die Adresse einer SCSISCAN_CMD-Struktur als lpInBuffer-Parameter der Funktion angeben. Diese Struktur gibt den Typ des angeforderten Vorgangs an. Der Kernelmodustreiber erstellt einen SCSI-Anforderungsblock (SRB) aus dem Inhalt der SCSISCAN_CMD-Struktur.
Bei SCSI-Befehlen, die Datenübertragungen beinhalten, muss der lpOutBuffer der DeviceIoControl-Funktion auf einen Datenpuffer verweisen. Bei Lesevorgängen empfängt dieser Puffer Daten, die vom Gerät gelesen werden. Bei Schreibvorgängen muss der Puffer die zu schreibenden Daten enthalten.
Weitere Informationen finden Sie unter Zugreifen auf Kernel-Mode Treiber für Standbildgeräte.
Codebeispiel
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
);
}
}
}
Anforderungen
Anforderung | Wert |
---|---|
Header | scsiscan.h (Scsiscan.h einschließen) |
Weitere Informationen
Erstellen von IOCTL-Anforderungen in Treibern
WdfIoTargetSendInternalIoctlOthersSynchronly