ProbeForWrite 함수(wdm.h)

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

구문

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

매개 변수

[in, out] Address

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

[in] Length

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

[in] Alignment

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

반환 값

없음

설명

지정된 메모리 범위가 유효한 사용자 모드 주소 범위가 아니거나 쓸 수 없는 경우(액세스 권한 없음, 읽기 전용 등) ProbeForWrite 는 STATUS_ACCESS_VIOLATION 예외를 발생합니다. 주소 범위의 시작이 맞춤으로 지정된 바이트 경계에 맞지 않으면 ProbeForWrite 는 STATUS_DATATYPE_MISALIGNMENT 예외를 발생합니다.

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

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

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

Irp->RequestorModeKernelMode = 인 경우 Irp->AssociatedIrp.SystemBufferIrp->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