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) |