다음을 통해 공유


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

지금까지 커널 모드 코드에 대한 읽기 전용 권한을 적용하지 않은 특정 프로세서에서는 ProbeForWriteProbeForRead 간에 의미 있는 기능적 차이가 있었습니다. 이러한 경우 운영 체제는 이전에 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)

추가 정보

ProbeForRead