RtlCopyDeviceMemory 関数 (wdm.h)
RtlCopyDeviceMemory 関数では、RtlCopyVolatileMemory 動作 (たとえば、コンパイラの最適化による干渉なしにメモリをある場所から別の場所にコピーする) が提供されます。開発者は、デバイス メモリにアクセスするときにアラインメント エラーが生成されないようにする必要があります。
構文
volatile void * RtlCopyDeviceMemory(
[out] volatile void *Destination,
[in] volatile const void *Source,
[in] size_t Length
);
パラメーター
[out] Destination
コピーしたブロックの宛先の開始アドレスへのポインター。
[in] Source
コピーするメモリ ブロックの開始アドレスへのポインター。
[in] Length
コピーするメモリ ブロックのサイズ (バイト単位)。
戻り値
Destination の値を返 します。
注釈
RtlCopyDeviceMemory 関数には、次のプロパティがあります。
関数はコンパイラ組み込みとして認識されないため、コンパイラは呼び出しを最適化することはありません (完全に、または呼び出しを同等の命令シーケンスに置き換えます)。 これは、さまざまなコンパイラ最適化の対象となる RtlCopyMemory とは異なります。
呼び出しが返されると、データは Source から Destination にコピーされます。 この関数は 、Source と Destination へのメモリ アクセスを関数内でのみ実行します (たとえば、コンパイラはこの関数からメモリ アクセスを移動できません)。
この関数は、CPU がデバイス メモリ上の整列されていないメモリ アクセスをサポートしている場合にのみ、調整されていないメモリ アクセスを実行できます。 CPU が整列されていないデバイス メモリ アクセスをサポートしていない場合は、アラインされたアクセスのみが実行されます。
関数は、コピー操作の一環としてメモリの場所に複数回アクセスできます。
コピー元とコピー先が互いに重なる場合、コピー操作はサポートされません。 重複するバッファーが指定されている場合は、エラー コード FAST_FAIL_INVALID_ARGで高速に失敗します。
注意
この関数は、デバイス メモリとしてマップされたメモリにアクセスするための CPU の要件が尊重されることを保証するだけです。 特定のデバイスにアクセスするための固有の要件がある場合は、この関数を使用しないでください (代わりに、開発者は独自のアクセサー関数を実装する必要があります)。 たとえば、この関数は、生成されるメモリ アクセスのサイズについて保証しません (CPU 自体がこれらの要件を適用しない限り)。
注意
この関数は、最新バージョンだけでなく、すべてのバージョンの Windows で動作します。 wdm.h ヘッダーから関数宣言を取得するには、最新の WDK を使用する必要があります。 また、最新の WDK のライブラリ (volatileaccessk.lib) も必要です。 ただし、結果として得られるドライバーは、古いバージョンの Windows では正常に実行されます。
例
UCHAR* CopyBuffer;
// In this scenario we are copying data from 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 memcpy, RtlCopyMemory,
// and even RtlCopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlCopyDeviceMemory.
RtlCopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);
要件
要件 | 値 |
---|---|
Header | wdm.h (Wdm.h を含む) |
Library | volatileaccessk.lib (カーネル モード)、volatileaccessu.lib (ユーザー モード) |