다음을 통해 공유


IOCTL_SCSI_PASS_THROUGH_DIRECT IOCTL(ntddscsi.h)

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

  • COPY와 같은 다중 대상 명령은 허용되지 않습니다.
  • 양방향 데이터 전송 작업은 지원되지 않습니다.
  • 대상 유형의 디바이스에 대한 클래스 드라이버가 있는 경우 해당 클래스 드라이버로 요청을 보내야 합니다. 따라서 애플리케이션은 해당 LU에 연결된 디바이스 유형에 대한 클래스 드라이버가 없는 경우에만 대상 논리 단위의 시스템 포트 드라이버에 직접 이 요청을 보낼 수 있습니다.
  • 입력 CDB에서 기본 미니포트 드라이버가 메모리에 직접 액세스하도록 요구할 수 있는 경우 이 요청을 수행해야 합니다 .
호출 애플리케이션은 SCSI 명령 설명자 블록을 만듭니다. SCSI 명령 설명자 블록은 CHECK 조건이 발생하는 경우 요청 감지 데이터에 대한 요청을 포함할 수 있습니다. CDB가 데이터 전송 작업을 요청하는 경우 호출자는 미니포트 드라이버가 직접 데이터를 전송할 수 있는 어댑터 디바이스 정렬 버퍼를 설정해야 합니다. 이 요청은 일반적으로 더 많은 양의 데이터(>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_DIRECTDataBuffer 멤버는 이 어댑터 디바이스 정렬 버퍼에 대한 포인터입니다. 호출자가 요청 감지 데이터를 요청하는 경우 호출자는 SCSI_PASS_THROUGH_DIRECT 구조에 따라 추가 스토리지를 할당해야 합니다.

입력 버퍼 길이

Parameters.DeviceIoControl.InputBufferLengthIrp->AssociatedIrp.SystemBuffer에서 버퍼의 크기(바이트)를 나타내며, 이 크기는 적어도 (센스 데이터 크기 sizeof + (SCSI_PASS_THROUGH_DIRECT))이어야 합니다. SCSI_PASS_THROUGH_DIRECT 구조체의 크기가 고정되어 있습니다.

출력 버퍼

포트 드라이버는 모든 요청 감지 데이터와 SCSI_PASS_THROUGH_DIRECT 구조를 Irp-AssociatedIrp.SystemBuffer>의 버퍼에 반환합니다.

출력 버퍼 길이

SenseInfoLengthDataTransferLength 는 전송된 데이터의 양을 나타내도록 업데이트됩니다. 포트 드라이버는 DataBuffer 에서 제공된 캐시 정렬 버퍼로 디바이스에서 전송된 모든 데이터를 반환합니다.

상태 블록

정보 필드는 Irp-AssociatedIrp.SystemBuffer>의 출력 버퍼에 반환된 바이트 수로 설정됩니다. 상태 필드는 STATUS_SUCCESS 설정되거나 SCSI_PASS_THROUGH_DIRECT 입력 길이 값이 잘못 설정되었거나DataBuffer에 지정된 버퍼가 디바이스에 제대로 정렬되지 않은 경우 STATUS_BUFFER_TOO_SMALL 또는 STATUS_INVALID_PARAMETER 수 있습니다.

설명

데이터 전송 작업의 경우 어댑터 디바이스와 맞춤이 일치하는 버퍼가 필요합니다. 애플리케이션은 PropertyStandardQuery의 쿼리 형식 및 StorageAdapterProperty의 속성 ID를 사용하여 IOCTL_STORAGE_QUERY_PROPERTY 제어 코드 요청을 실행하여 디바이스 맞춤 마스크를 검색할 수 있습니다. 맞춤 마스크는 반환되는 STORAGE_ADAPTER_DESCRIPTOR 구조체의 AlignmentMask 멤버에 있습니다. 드라이버는 어댑터 DeviceObjectAlignmentMask 멤버에서 값을 사용할 수도 있습니다.

다음 예제 함수에서는 버퍼가 디바이스 정렬 데이터 전송 버퍼로 준비됩니다.

PVOID AllocateAlignedBuffer(ULONG size, ULONG AlignmentMask, PVOID *pUnAlignedBuffer)
{
    PVOID AlignedBuffer;
    ULONG_PTR FullWordMask = (ULONG_PTR)AlignmentMask;

    if (AlignmentMask == 0)
    {
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
    }
    else
    {
        // expand the size for the alignment window
        size += AlignmentMask;
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
        // adjust buffer pointer for the desired alignment
        AlignedBuffer = (PVOID)(((ULONG_PTR)AlignedBuffer + FullWordMask) & ~FullWordMask);
    }

    return AlignedBuffer;
}

요구 사항

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

추가 정보

IOCTL_SCSI_PASS_THROUGH

IOCTL_STORAGE_QUERY_PROPERTY

SCSI_PASS_THROUGH_DIRECT