Freigeben über


IOCTL_SCSISCAN_CMD IOCTL (scsiscan.h)

Erstellt einen benutzerdefinierten SCSI-Steuerelementdeskriptorblock (CDB) und sendet ihn an den Kernelmodus-Standbildtreiber für SCSI-Busse.

Hauptcode

IRP_MJ_DEVICE_CONTROL

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

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously