다음을 통해 공유


RtlFillVolatileMemory 함수(wdm.h)

RtlFillVolatileMemory 함수는 개발자가 설정 작업이 발생하는지 확인해야 하는 상황에서 RtlFillMemory 동작(예: 버퍼 내용 설정)을 제공합니다(예: 컴파일러 최적화가 적용되지 않음).

구문

volatile void * RtlFillVolatileMemory(
  [out] volatile void *Destination,
  [in]  size_t        Length,
  [in]  int           Fill
);

매개 변수

[out] Destination

채울 메모리 블록의 시작 주소에 대한 포인터입니다.

[in] Length

채울 메모리 블록의 크기(바이트)입니다. 이 값은 대상 버퍼의 크기보다 작아야 합니다.

[in] Fill

메모리 블록을 채울 바이트 값입니다.

반환 값

Destination 값을 반환 합니다.

설명

  • 함수는 컴파일러 내장 함수로 인식되지 않으므로 컴파일러가 호출을 최적화하지 않습니다(호출을 완전히 또는 동일한 명령 시퀀스로 대체). 이는 다양한 컴파일러 최적화의 적용을 받는 RtlFillMemory 와 다릅니다.

  • 호출이 반환되면 버퍼를 원하는 값으로 덮어씁니다. 대상에 대한 이 함수 메모리 액세스는 함수 내에서만 수행됩니다(예: 컴파일러는 이 함수에서 메모리 액세스를 이동할 수 없음).

  • 플랫폼이 허용하는 경우 함수는 정렬되지 않은 메모리 액세스를 수행할 수 있습니다.

  • 함수는 작업의 일부로 메모리 위치에 두 번 이상 액세스할 수 있습니다.

참고

이 함수는 최신 버전뿐만 아니라 모든 버전의 Windows에서 작동합니다. wdm.h 헤더에서 함수 선언을 얻으려면 최신 WDK를 사용해야 합니다. 최신 WDK의 라이브러리(volatileaccessk.lib)도 필요합니다. 그러나 결과 드라이버는 이전 버전의 Windows에서 정상적으로 실행됩니다.

예제

UCHAR SensitiveData[100];

// Imagine we temporarily store some sensitive cryptographic
// material in a buffer.

StoreCryptographicKey(&SensitiveData);

DoCryptographicOperation(&SensitiveData);

// Now that we are done using the sensitive data we want to
// erase it from the stack. We cannot call RtlFillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to RtlFillMemory.
// Instead we can call RtlSecureZeroMemory2, RtlZeroVolatileMemory, or RtlFillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that RtlSecureZeroMemory2 performs better than
// RtlSecureZeroMemory function.

RtlFillVolatileMemory(&SensitiveData, sizeof(SensitiveData), 0);

요구 사항

요구 사항
헤더 wdm.h(Wdm.h 포함)
라이브러리 volatileaccessk.lib(커널 모드), volatileaccessu.lib(사용자 모드)

추가 정보

RtlFillMemory