IOCTL_SCSISCAN_CMD IOCTL(scsiscan.h)
사용자 지정된 SCSI 컨트롤 설명자 블록(CDB)을 만들고 SCSI 버스용 커널 모드 스틸 이미지 드라이버로 보냅니다.
주 코드
입력 버퍼
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 포함) |
추가 정보
WdfIoTargetSendInternalIoctlOthersSynchronously