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 (ユーザー モード)

こちらもご覧ください

RtlFillMemory

RtlFillVolatileMemory