ProbeForRead 함수(wdm.h)

ProbeForRead 루틴은 사용자 모드 버퍼가 실제로 주소 공간의 사용자 부분에 있고 올바르게 정렬되었는지 확인합니다.

구문

void ProbeForRead(
  [in] const volatile VOID *Address,
  [in] SIZE_T              Length,
  [in] ULONG               Alignment
);

매개 변수

[in] Address

사용자 모드 버퍼의 시작을 지정합니다.

[in] Length

사용자 모드 버퍼의 길이(바이트)를 지정합니다.

[in] Alignment

사용자 모드 버퍼의 시작 부분에 필요한 맞춤(바이트)을 지정합니다.

반환 값

없음

설명

지정된 메모리 범위가 사용자 모드 주소 범위 내에 없는 경우 ProbeForRead 는 STATUS_ACCESS_VIOLATION 예외를 발생합니다. 주소 범위의 시작이 맞춤으로 지정된 바이트 경계에 정렬되지 않은 경우 ProbeForRead 는 STATUS_DATATYPE_MISALIGNMENT 예외를 발생합니다.

커널 모드 드라이버는 ProbeForRead 를 사용하여 사용자 공간에 할당된 버퍼에 대한 읽기 액세스의 유효성을 검사해야 합니다. Irp -> UserBuffer가 가리키는 사용자 버퍼의 유효성을 검사하기 위해 I/O를 METHOD_NEITHER 중에 가장 일반적으로 사용됩니다.

드라이버는 try/except 블록 내에서 ProbeForRead를 호출해야 합니다. 루틴에서 예외가 발생하면 드라이버는 적절한 오류로 IRP를 완료해야 합니다. 드라이버에서 사용자 모드 버퍼에 대한 후속 액세스는 try/except 블록 내에서 캡슐화되어야 합니다. 악의적인 애플리케이션은 언제든지( ProbeForRead 또는 ProbeForWrite를 호출한 후 또는 호출하는 동안에도) 사용자 주소 범위의 보호를 삭제, 대체 또는 변경하는 다른 스레드가 있을 수 있습니다. 자세한 내용은 예외 처리를 참조하세요.

커널 모드 주소에서는 이 루틴을 사용하지 마세요. 예외가 발생합니다.

Irp-RequestorMode>KernelMode = 인 경우 Irp-AssociatedIrp.SystemBuffer>Irp-UserBuffer> 필드에 사용자 모드 주소가 포함되지 않으며 ProbeForRead를 호출하여 두 필드가 가리키는 버퍼를 검색하면 예외가 발생합니다.

Length = 0이면 ProbeForRead에서 주소를 확인하지 않습니다. 이 경우 루틴은 잘못 정렬되었거나 유효한 사용자 주소 범위를 벗어난 주소에 대한 예외를 발생시키지 않습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm)

추가 정보

ProbeForWrite