FillVolatileMemory 関数
FillVolatileMemory 関数は、メモリ ブロックを指定したフィル値で埋めます。
重要
一部の情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
パラメーター
Param Destination [out]
埋めるメモリ ブロックの開始アドレスへのポインター。
Param Length [in]
埋めるメモリ ブロックのサイズ (バイト単位)。 この値は、ターゲット バッファーのサイズより小さくする必要があります。
Param Fill [in]
メモリ ブロックを埋めるバイト値。
構文
volatile void*
FillVolatileMemory (
_Out_writes_bytes_all_(Length) volatile void* Destination,
SIZE_T Length,
INT Fill
);
解説
この API は、設定操作が実行されることを開発者が確認する必要がある (つまり、コンパイラの最適化の対象ではない) 状況で FillMemory 動作を指定する (つまり、バッファーの内容を設定する) ために存在します。 この API には、次のプロパティがあります。
- API はコンパイラの組み込みとして認識されないため、コンパイラは呼び出しを最適化して削除することはありません (呼び出しを完全に最適化するか、"同等の" 一連の命令に置き換えます)。 これは、さまざまなコンパイラ最適化の対象となる FillMemory とは異なります。
- 呼び出しが返されると、バッファーは目的の値で上書きされています。 この関数の "ターゲット" へのメモリ アクセスは、その関数内でのみ実行されます (つまり、コンパイラはこの関数からメモリ アクセスを移動できません)。
- プラットフォームで許可されている場合、この API は整列されていないメモリ アクセスを実行することがあります。
- この API は、操作の一環としてメモリ位置に複数回アクセスする場合があります。
Note
この関数は、最新バージョンだけではなく、すべてのバージョンの Windows で動作します。 winbase.h
ヘッダーから関数宣言を取得するには、最新の SDK を使用する必要があります。 また、最新の SDK のライブラリ (volatileaccessu.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 FillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to FillMemory.
// Instead we can call SecureZeroMemory2, ZeroVolatileMemory, or FillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that SecureZeroMemory2 performs better than the old
// SecureZeroMemory API.
FillVolatileMemory(&SensitiveData, sizeof(SensitiveData), 0);
要件
サポートされている最小のクライアント: Windows 11 Insider Preview ビルド TBD
ヘッダー: winbase.h (Winbase.h を含む)
カーネル モード ライブラリ: volatileaccessk.lib
ユーザー モード ライブラリ: volatileaccessu.lib