다음을 통해 공유


IOCTL_ATA_PASS_THROUGH IOCTL(ntddscsi.h)

애플리케이션이 대상 디바이스에 거의 모든 ATA 명령을 보낼 수 있도록 허용하며, 다음과 같은 제한 사항이 있습니다.

  • 대상 디바이스 유형에 대한 클래스 드라이버가 있는 경우 애플리케이션은 클래스 드라이버에 요청을 보내야 합니다. 따라서 애플리케이션은 해당 LU에 연결된 디바이스 유형에 대한 클래스 드라이버가 없는 경우에만 이 요청을 LU(대상 논리 단위)에 대한 시스템 포트 드라이버로 직접 보낼 수 있습니다. 시스템 포트 드라이버는 통과 요청을 처리하기 전에 클래스 드라이버에서 디바이스를 클레임했는지 여부를 확인하는 데 검사 않습니다. 따라서 애플리케이션이 디바이스를 요청한 클래스 드라이버를 우회하고 해당 디바이스에 대한 통과 요청을 포트 드라이버에 직접 보내는 경우 클래스 드라이버와 애플리케이션 간에 디바이스 제어에 대한 충돌이 발생할 수 있습니다.
  • 명령에 기본 드라이버가 메모리에 직접 액세스해야 하는 경우 이 요청을 사용할 수 없습니다. 호출자의 명령에 메모리에 직접 액세스해야 하는 경우 대신 IOCTL_ATA_PASS_THROUGH_DIRECT 사용합니다.
  • 애플리케이션은 통과 요청을 비동기적으로 보내려고 시도해서는 안 됩니다. 모든 통과 요청은 동기적이어야 합니다.
  • 애플리케이션은 디바이스에 통과 요청을 보내는 데 관리자 권한이 필요하지 않지만 디바이스에 대한 읽기/쓰기 권한이 있어야 합니다.
호출 애플리케이션은 ATA_PASS_THROUGH_EX 구조에서 의도한 명령에 대한 ATA 작업 파일 레지스터 콘텐츠를 제공합니다. 시스템은 모든 데이터 전송을 이중 버퍼링합니다. 이 요청은 일반적으로 소량의 데이터(16KB 미만)를 전송하는 데 사용됩니다.

주 코드

IRP_MJ_DEVICE_CONTROL

입력 버퍼

Irp-AssociatedIrp.SystemBuffer>의 버퍼에는 수행할 명령의 종류와 해당 매개 변수를 나타내는 작업 파일 입력 레지스터 집합이 포함된 ATA_PASS_THROUGH_EX 구조가 포함되어야 합니다. 호출자는 포트 드라이버가 채우는 PathId, TargetIdLun을 제외한 이 구조체의 모든 멤버를 초기화해야 합니다. 데이터 출력 명령의 경우 구조체의 DataBufferOffset 멤버는 쓸 데이터가 포함된 캐시 정렬 버퍼를 가리킵니다.

입력 버퍼 길이

Parameters.DeviceIoControl.InputBufferLengthIrp->AssociatedIrp.SystemBuffer에서 버퍼의 크기(바이트)를 나타냅니다. 포함된 ATA 명령이 쓰기 작업인 경우 입력 버퍼의 크기는 sizeof(ATA_PASS_THROUGH_EX)의 합계와 ATA_PASS_THROUGH_EXDataTransferLength멤버의 값이어야 합니다. 다음 의사 코드 예제에서는 버퍼 크기를 계산하는 방법을 보여 줍니다.
ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength

포함된 ATA 명령이 데이터 전송을 포함하지 않는 읽기 작업 또는 디바이스 제어 작업인 경우 InputBufferLengthsizeof (ATA_PASS_THROUGH_EX)와 같아야 합니다.

두 경우 모두 InputBufferLengthsizeof (ATA_PASS_THROUGH_EX)보다 작으면 포트 드라이버가 I/O 요청에 실패하고 오류를 반환합니다.

출력 버퍼

포트 드라이버는 ATA_PASS_THROUGH_EX 구조를 사용하여 반환 데이터의 형식을 지정하고 Irp-AssociatedIrp.SystemBuffer>의 버퍼에 데이터를 저장합니다.

포트 드라이버는 포함된 ATA 명령이 완료될 때 디바이스의 출력 레지스터에 있는 값으로 CurrentTaskFile 멤버를 채웁니다. 명령이 데이터 전송인 경우 포트 드라이버는 구조의 시작 부분에서 DataBufferOffset 바이트의 오프셋에 있는 캐시 정렬 버퍼에 전송된 데이터를 저장합니다. 애플리케이션은 출력 레지스터의 내용을 해석하여 디바이스에서 반환된 오류(있는 경우)를 결정합니다.

출력 버퍼 길이

포트 드라이버는 ATA_PASS_THROUGH_EXDataTransferLength 멤버를 업데이트하여 디바이스에서 실제로 전송된 데이터의 양을 나타냅니다. 포함된 ATA 명령이 데이터를 전송하지 않는 쓰기 작업 또는 디바이스 제어 작업인 경우 OutputBufferLengthsizeof(ATA_PASS_THROUGH_EX)와 같습니다. 포함된 ATA 명령이 읽기 작업인 경우 OutputBufferLengthsizeof(ATA_PASS_THROUGH_EX) + DataTransferLength와 같습니다.

상태 블록

정보 멤버는 Irp-AssociatedIrp.SystemBuffer>의 출력 버퍼에서 반환되는 바이트 수로 설정됩니다. Status 멤버는 STATUS_SUCCESS 또는 ATA_PASS_THROUGH_EX 입력 상태 값이 잘못 설정된 경우 STATUS_BUFFER_TOO_SMALL 또는 STATUS_INVALID_PARAMETER 설정됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Server 2003부터 사용할 수 있습니다.
머리글 ntddscsi.h(Ntddscsi.h 포함)

추가 정보

ATA_PASS_THROUGH_EX

IOCTL_ATA_PASS_THROUGH_DIRECT