ProbeForWrite 함수(wdm.h)
경고
ProbeForWrite 함수는 현재 소프트웨어에서 사용하지 않는 것이 좋으며 기록 호환성을 위해서만 포함됩니다. 사용자 버퍼의 유효성을 검사할 때 대신 ProbeForRead 를 사용합니다. 자세한 내용은 비고를 참조하세요.
ProbeForWrite 루틴은 사용자 모드 버퍼가 실제로 주소 공간의 사용자 모드 부분에 있고 쓰기 가능하며 올바르게 정렬되었는지 확인합니다.
구문
void ProbeForWrite(
[in, out] volatile VOID *Address,
[in] SIZE_T Length,
[in] ULONG Alignment
);
매개 변수
[in, out] Address
사용자 모드 버퍼의 시작을 지정합니다.
[in] Length
사용자 모드 버퍼의 길이(바이트)를 지정합니다. 설명 섹션에서 추가 정보를 참조하세요.
[in] Alignment
사용자 모드 버퍼의 시작 부분에 필요한 맞춤(바이트)을 지정합니다.
반환 값
없음
설명
이 함수는 일반적으로 ProbeForWrite 호출이 실행된 후 드라이버에 전달된 버퍼에 대한 쓰기 권한을 제거하는 보호 변경을 포함하여 강력한 드라이버가 항상 사용자 모드 가상 주소 공간의 보호 변경을 처리할 준비가 되어 있어야 하므로 ProbeForRead 에 대한 실질적인 이점을 제공하지 않습니다. ProbeForWrite는 제공된 버퍼의 각 페이지에 액세스하므로 각 페이지에 액세스하는 오버헤드로 인해 성능이 저하될 수 있습니다. 특히 제공된 버퍼가 가상 주소 공간의 큰 영역을 설명하는 경우 성능이 저하될 수 있습니다. 또한 ProbeForWrite는 각 페이지에 쓰기 때문에 동일한 버퍼를 여러 개의 동시 드라이버 요청과 함께 안전하게 사용하지 못할 수 있습니다. 이러한 이유로 새 드라이버 코드는 항상 ProbeForRead 를 대신 사용해야 합니다.
다음 표에서는 각 커널 모드 버퍼 검색 루틴의 속성을 간략하게 설명합니다.
동작 | ProbeForRead | ProbeForWrite |
---|---|---|
길이가 0이 아닌 경우 버퍼가 사용자 모드 주소 공간의 지역을 설명하는지 확인합니다. | x | x |
버퍼 기본 주소 및 길이가 최대 포인터 값을 넘지 않는지 확인합니다. | x | x |
길이가 0이 아닌 경우 버퍼가 요청된 맞춤 경계에 정렬되었는지 확인합니다. | x | x |
버퍼가 처음에 쓰기 가능한지 확인합니다(사용자 모드 애플리케이션이 주소 공간을 다시 보호하면 언제든지 변경 가능) | x | |
버퍼의 각 페이지에 액세스합니다(추가 오버헤드). | x | |
버퍼의 각 페이지를 수정합니다(동일한 버퍼가 여러 드라이버 요청과 병렬로 사용되는 경우 예기치 않은 동작이 발생할 수 있음). | x |
지금까지 커널 모드 코드에 대한 읽기 전용 권한을 적용하지 않은 특정 프로세서에서는 ProbeForWrite 와 ProbeForRead 간에 의미 있는 기능적 차이가 있었습니다. 이러한 경우 운영 체제는 이전에 ProbeForWrite에 의존하여 명시적 페이징 쓰기 가능성 검사 수행했습니다. 이러한 구분은 Windows NT 4.0 이상에서 지원되는 프로세서에는 더 이상 의미가 없습니다.
레거시 설명
커널 모드 드라이버는 ProbeForWrite 를 사용하여 사용자 공간에 할당된 버퍼에 대한 쓰기 액세스의 유효성을 검사할 수 있습니다. Irp-UserBuffer>가 가리키는 사용자 버퍼의 유효성을 검사하기 위해 METHOD_NEITHER I/O 중에 가장 일반적으로 사용됩니다.
지정된 메모리 범위가 유효한 사용자 모드 주소 범위가 아니거나 쓰기가 불가능한 경우(액세스 권한 없음, 읽기 전용 등) ProbeForWrite 는 STATUS_ACCESS_VIOLATION 예외를 발생합니다. 주소 범위의 시작이 맞춤으로 지정된 바이트 경계에 정렬되지 않으면 ProbeForWrite 에서 STATUS_DATATYPE_MISALIGNMENT 예외가 발생합니다.
드라이버는 try/except 블록 내에서 ProbeForWrite를 호출해야 합니다. 루틴에서 예외가 발생하면 드라이버가 적절한 오류로 IRP를 완료해야 합니다. 드라이버가 사용자 모드 버퍼에 대한 후속 액세스도 try/except 블록 내에 캡슐화해야 합니다. 악의적인 애플리케이션에는 언제든지( ProbeForRead 또는 ProbeForWrite를 호출한 후 또는 호출하는 동안에도) 사용자 주소 범위의 보호를 삭제, 대체 또는 변경하는 다른 스레드가 있을 수 있습니다. 자세한 내용은 예외 처리를 참조하세요.
커널 모드 주소에서는 이 루틴을 사용하지 마세요. 예외가 발생합니다.
Irp-RequestorMode>KernelMode = 인 경우 Irp-AssociatedIrp.SystemBuffer> 및 Irp-UserBuffer> 필드에 사용자 모드 주소가 포함되지 않으며, ProbeForWrite를 호출하여 두 필드가 가리키는 버퍼를 검색하면 예외가 발생합니다.
Length = 0이면 ProbeForWrite에서 주소를 확인하지 않습니다. 이 경우 루틴은 잘못 정렬되었거나 유효한 사용자 주소 범위를 벗어난 주소에 대한 예외를 발생시키지 않습니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000부터 사용할 수 있습니다. |
대상 플랫폼 | 유니버설 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
DDI 규정 준수 규칙 | HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm) |