IOCTL_SCSI_PASS_THROUGH IOCTL(ntddscsi.h)

애플리케이션에서 다음과 같은 제한 사항으로 거의 모든 SCSI 명령을 대상 디바이스에 보낼 수 있습니다.

  • COPY와 같은 다중 대상 명령은 허용되지 않습니다.
  • 양방향 데이터 전송 작업은 지원되지 않습니다.
  • 대상 유형의 디바이스에 대한 클래스 드라이버가 있는 경우 해당 클래스 드라이버로 요청을 보내야 합니다. 따라서 애플리케이션은 해당 LU에 연결된 디바이스 유형에 대한 클래스 드라이버가 없는 경우에만 이 요청을 LU(대상 논리 단위)에 대한 시스템 포트 드라이버로 직접 보낼 수 있습니다. 시스템 포트 드라이버는 통과 요청을 처리하기 전에 클래스 드라이버가 디바이스를 요청했는지 여부를 확인할 검사 없습니다. 따라서 애플리케이션이 디바이스를 요청한 클래스 드라이버를 우회하고 해당 디바이스에 대한 통과 요청을 포트 드라이버에 직접 보내는 경우 클래스 드라이버와 애플리케이션 간에 디바이스 제어 충돌이 발생할 수 있습니다. 통과 요청이 어댑터 디바이스 개체로 전송되고 사용자 모드에서 시작되고 클래스 드라이버에서 클레임하는 LU를 대상으로 하는 경우 Storport는 STATUS_INVALID_DEVICE_REQUEST 요청을 실패합니다. 요청이 LU 디바이스 개체로 전송되거나 커널 모드에서 시작되거나 클레임되지 않은 LU를 대상으로 하는 경우 미니포트 드라이버에 전달됩니다.
  • CDB에서 기본 미니포트 드라이버가 메모리에 직접 액세스하도록 요구할 수 있는 경우에는 이 요청을 사용할 수 없습니다. 호출자의 CDB에서 메모리에 직접 액세스해야 하는 경우 대신 IOCTL_SCSI_PASS_THROUGH_DIRECT 사용합니다.
  • 애플리케이션은 통과 요청을 비동기적으로 보내려고 시도해서는 안 됩니다. 모든 통과 요청은 동기적이어야 합니다.
  • 애플리케이션은 디바이스에 통과 요청을 보내는 데 관리자 권한이 필요하지 않지만 디바이스에 대한 읽기/쓰기 권한이 있어야 합니다.
호출 애플리케이션은 SCSI 명령 설명자 블록을 만듭니다. SCSI 명령 설명자 블록은 CHECK 조건이 발생하는 경우 요청 감지 데이터에 대한 요청을 포함할 수 있습니다.

IOCTL_SCSI_PASS_THROUGH 버퍼링된 디바이스 제어 요청입니다. 시스템 메모리에서 버퍼링을 무시하려면 호출자는 IOCTL_SCSI_PASS_THROUGH_DIRECT 사용해야 합니다. IOCTL_SCSI_PASS_THROUGH_DIRECT 요청을 처리할 때 시스템은 사용자 메모리의 버퍼를 잠그고 디바이스는 이 메모리에 직접 액세스합니다.

이 요청은 일반적으로 소량의 데이터(<16K)를 전송하는 데 사용됩니다.

애플리케이션은 IRP_MJ_DEVICE_CONTROL 요청을 통해 이 요청을 보낼 수 있습니다.

스토리지 클래스 드라이버는 요청이 스토리지 클래스 드라이버에 의해 처리되었음을 나타내기 위해 부 IRP 번호를 IRP_MN_SCSI_CLASS 설정합니다.

참고 SCSI 포트 드라이버 및 SCSI 미니포트 드라이버 모델은 나중에 변경되거나 사용할 수 없습니다. 대신 Storport 드라이버Storport 미니포트 드라이버 모델을 사용하는 것이 좋습니다.
 

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

이 구조체에는 포트 드라이버에 의해 채워진 경로, 대상 ID 및 LUN(논리 단위 번호)을 제외하고 호출자가 초기화해야 하는 SCSI CDB가 포함됩니다. 데이터 출력 명령의 경우 전송할 데이터는 SCSI_PASS_THROUGH 구조의 DataBufferOffset에 있는 Irp-AssociatedIrp.SystemBuffer>의 버퍼에 포함됩니다. 그러나 호출자가 요청 감지 데이터를 요청하는 경우 호출자는 SCSI_PASS_THROUGH 바로 다음에 추가 스토리지를 할당해야 합니다.

입력 버퍼 길이

Parameters.DeviceIoControl.InputBufferLengthIrp->AssociatedIrp.SystemBuffer에서 버퍼의 크기(바이트)를 나타내며, 이 크기는 적어도 (센스 데이터 크기 sizeof + (SCSI_PASS_THROUGH))이어야 합니다. SCSI_PASS_THROUGH 구조체의 크기는 DataTransferLength 사양에 따라 달라집니다.

출력 버퍼

포트 드라이버는 Irp-AssociatedIrp.SystemBuffer>에서 디바이스에서 버퍼로 전송된 모든 요청 감지 데이터와 데이터를 반환합니다.

출력 버퍼 길이

SCSI_PASS_THROUGH 구조의 SenseInfoLengthDataTransferLength는 전송되는 데이터의 양을 나타내도록 업데이트됩니다.

상태 블록

정보 필드는 Irp-AssociatedIrp.SystemBuffer>의 출력 버퍼에 반환된 바이트 수로 설정됩니다. 상태 필드는 STATUS_SUCCESS 설정되거나 SCSI_PASS_THROUGH 입력 길이 값이 잘못 설정된 경우 STATUS_BUFFER_TOO_SMALL 또는 STATUS_INVALID_PARAMETER 수 있습니다.

요구 사항

요구 사항
헤더 ntddscsi.h(Ntddscsi.h 포함)

추가 정보

SCSI_PASS_THROUGH