다음을 통해 공유


IOCTL_SCSISCAN_CMD IOCTL(scsiscan.h)

사용자 지정된 SCSI 컨트롤 설명자 블록(CDB)을 만들고 SCSI 버스용 커널 모드 스틸 이미지 드라이버로 보냅니다.

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

SCSISCAN_CMD 구조체에 대한 포인터입니다.

입력 버퍼 길이

입력 버퍼의 크기입니다.

출력 버퍼

데이터 버퍼에 대한 포인터입니다. I/O 작업의 유형에 따라 이 버퍼는 데이터를 제공하거나 받을 수 있습니다.

출력 버퍼 길이

출력 버퍼의 크기입니다.

상태 블록

Irp->요청이 성공하면 IoStatus.Status 가 STATUS_SUCCESS 설정됩니다. 그렇지 않으면 NTSTATUS 코드로 적절한 오류 조건에 대한 상태입니다.

설명

IOCTL_SCSISCAN_CMD I/O 컨트롤 코드를 사용하여 DeviceloControl 함수를 호출하는 경우 호출자는 SCSISCAN_CMD 구조체의 주소를 함수의 lpInBuffer 매개 변수로 지정해야 합니다. 이 구조체는 요청되는 작업의 유형을 지정합니다. 커널 모드 드라이버는 SCSISCAN_CMD 구조체의 내용에서 SRB(SCSI 요청 블록)를 생성합니다.

데이터 전송을 포함하는 SCSI 명령의 경우 DeviceIoControl 함수의 lpOutBuffer 는 데이터 버퍼를 가리킵니다. 읽기 작업의 경우 이 버퍼는 디바이스에서 읽은 데이터를 수신합니다. 쓰기 작업의 경우 버퍼에 쓸 데이터가 포함되어야 합니다.

자세한 내용은 스틸 이미지 디바이스용 Kernel-Mode 드라이버 액세스를 참조하세요.

코드 예제

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
      );
    }
  }
}

요구 사항

요구 사항
헤더 scsiscan.h(Scsiscan.h 포함)

추가 정보

드라이버에서 IOCTL 요청 만들기

WdfIoTargetSendInternalIoctlOthersSynchronously

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendIoctlSynchronously