RtlFillDeviceMemory 関数 (wdm.h)
RtlFillDeviceMemory 関数は、デバイス メモリにアクセスするときにアラインメント エラーが生成されないように開発者が追加で確認する必要がある場合に、RtlFillVolatileMemory 動作 (たとえば、コンパイラの最適化による干渉なしにバッファーの内容を設定する) を提供します。
構文
volatile void * RtlFillDeviceMemory(
[out] volatile void *Destination,
[in] size_t Length,
[in] int Fill
);
パラメーター
[out] Destination
入力するメモリ ブロックの開始アドレスへのポインター。
[in] Length
埋めるメモリ ブロックのサイズ (バイト単位)。 この値は 、宛先 バッファーのサイズより小さくする必要があります。
[in] Fill
メモリ ブロックを埋めるバイト値。
戻り値
Destination の値を返 します。
注釈
関数はコンパイラの組み込みとして認識されないため、コンパイラは呼び出しを最適化することはありません (呼び出しを完全に最適化するか、同等の命令シーケンスに置き換えます)。 これは、さまざまなコンパイラ最適化の対象となる RtlFillMemory とは異なります。
呼び出しが完了すると、バッファーは目的の値で上書きされています。 この関数の Destination へのメモリ アクセスは、関数内でのみ実行されます (たとえば、コンパイラはこの関数からメモリ アクセスを移動できません)。
この関数は、CPU がデバイス メモリ上の整列されていないメモリ アクセスをサポートしている場合にのみ、調整されていないメモリ アクセスを実行できます。 CPU が整列されていないデバイス メモリ アクセスをサポートしていない場合は、アラインされたアクセスのみが実行されます。
関数は、操作の一環としてメモリの場所に複数回アクセスできます。
注意
この関数は、デバイス メモリとしてマップされたメモリにアクセスするための CPU の要件が尊重されることを保証するだけです。 特定のデバイスにアクセスするための固有の要件がある場合は、この関数を使用しないでください (代わりに、開発者は独自のアクセサー関数を実装する必要があります)。 たとえば、この関数は、生成されるメモリ アクセスのサイズについて保証しません (CPU 自体がこれらの要件を適用しない限り)。
注意
この関数は、最新バージョンだけでなく、すべてのバージョンの Windows で動作します。 wdm.h ヘッダーから関数宣言を取得するには、最新の WDK を使用する必要があります。 また、最新の WDK のライブラリ (volatileaccessk.lib) も必要です。 ただし、結果として得られるドライバーは、古いバージョンの Windows では正常に実行されます。
例
// In this scenario we are setting data on memory mapped
// as "device memory" (for example, memory not backed by RAM).
// On some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (for example, a 4-byte
// load must be 4-byte aligned). Functions like memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.
RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);
要件
要件 | 値 |
---|---|
Header | wdm.h (Wdm.h を含む) |
Library | volatileaccessk.lib (カーネル モード)、volatileaccessu.lib (ユーザー モード) |