Share via


IsBadWritePtr 함수(winbase.h)

호출 프로세스에서 지정된 메모리 범위에 대한 쓰기 권한이 있는지 확인합니다.

중요 이 함수는 사용되지 않으므로 사용하면 안 됩니다. 이름에도 불구하고 포인터가 유효하거나 가리키는 메모리가 안전하게 사용되도록 보장하지는 않습니다. 자세한 내용은 이 페이지의 설명을 참조하세요.
 

구문

BOOL IsBadWritePtr(
  [in] LPVOID   lp,
  [in] UINT_PTR ucb
);

매개 변수

[in] lp

메모리 블록의 첫 번째 바이트에 대한 포인터입니다.

[in] ucb

메모리 블록의 크기(바이트)입니다. 이 매개 변수가 0이면 반환 값은 0입니다.

반환 값

호출 프로세스에 지정된 메모리 범위의 모든 바이트에 대한 쓰기 권한이 있는 경우 반환 값은 0입니다.

호출 프로세스에 지정된 메모리 범위의 모든 바이트에 대한 쓰기 액세스 권한이 없는 경우 반환 값은 0이 아닙니다.

애플리케이션이 디버거에서 실행되고 프로세스에 지정된 메모리 범위의 모든 바이트에 대한 쓰기 액세스 권한이 없는 경우 함수는 예외를 STATUS_ACCESS_VIOLATION 첫 번째 기회를 발생시킵니다. 이 조건에 대해 중단되도록 디버거를 구성할 수 있습니다. 디버거에서 프로세스 실행을 다시 시작하면 함수는 평소와 같이 계속되며 0이 아닌 값을 반환합니다. 이 동작은 의도적으로 수행되며 디버깅 지원 역할을 합니다.

설명

이 함수는 일반적으로 타사 라이브러리에서 반환된 포인터로 작업할 때 사용되며, 타사 DLL에서 메모리 관리 동작을 확인할 수 없습니다.

프로세스의 스레드는 다른 스레드가 필요로 하는 메모리를 해제하지 않는 방식으로 협력해야 합니다. 이 함수를 사용하면 이 작업을 수행할 필요가 없습니다. 이 작업을 수행하지 않으면 애플리케이션이 예측할 수 없는 방식으로 실패할 수 있습니다.

잠재적으로 잘못된 포인터를 역참조하면 다른 스레드에서 스택 확장을 사용하지 않도록 설정할 수 있습니다. 스택 확장을 사용하지 않도록 설정한 경우 스택을 소진하는 스레드는 팝업 오류 창이나 진단 정보 없이 부모 프로세스가 즉시 종료됩니다.

호출 프로세스에 지정된 메모리 범위의 바이트 중 일부(전부는 아님)에 대한 쓰기 권한이 있는 경우 반환 값은 0이 아닙니다.

선점 멀티태스킹 환경에서는 다른 스레드가 테스트 중인 메모리에 대한 프로세스의 액세스를 변경할 수 있습니다. 함수가 프로세스에 지정된 메모리에 대한 쓰기 권한이 있음을 나타내는 경우에도 메모리에 액세스하려고 할 때 구조적 예외 처리를 사용해야 합니다. 구조적 예외 처리를 사용하면 시스템에서 액세스 위반 예외가 발생하는 경우 프로세스에 알릴 수 있으므로 프로세스에서 예외를 처리할 수 있습니다.

IsBadWritePtr 은 다중 스레드로부터 안전하지 않습니다. 여러 스레드에서 공유하는 포인터에서 제대로 사용하려면 하나의 스레드만 검사되는 메모리에 액세스할 수 있도록 하는 중요한 코드 영역 내에서 호출합니다. 중요한 섹션 또는 뮤텍스 또는 상호 잠긴 함수와 같은 운영 체제 수준 개체를 사용하여 코드의 중요한 영역을 만듭니다.

요구 사항

   
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 winbase.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

IsBadCodePtr

IsBadReadPtr

IsBadStringPtr