CopyToUserFromUser 関数は、ユーザー モード メモリからユーザー モード メモリにデータを安全にコピーします。
Syntax
VOID CopyToUserFromUser(
volatile VOID *Destination,
volatile const VOID *Source,
SIZE_T Length
);
Parameters
Destination
[out]データがコピーされるユーザー モードのメモリ位置へのポインター。
Source
[in]データのコピー元となるユーザー モードのメモリ位置へのポインター。
Length
[in]コピーするバイト数。
戻り値
None
Remarks
この関数は、ユーザー モードのメモリ位置間でデータを安全にコピーする方法を提供します。 これにより、カーネル モード コードがユーザー モードの場所間のデータ転送を容易にする必要がある場合に、異なるユーザー モード バッファー間で柔軟なメモリ操作が可能になります。
この関数には、次のプロパティがあります。
この関数は、 memory_order_relaxedセマンティクスを使用して揮発性コピーを実行します。
関数はコンパイラ組み込み関数として認識されないため、コンパイラは呼び出しを最適化しません (呼び出しを完全に最適化したり、同等の命令シーケンスに置き換えたりすることはありません)。
呼び出しが返されると、データは ソース から 宛先にコピーされます。 この関数の Source と Destination へのメモリ アクセスは、関数内でのみ実行されます (たとえば、コンパイラはこの関数からメモリ アクセスを移動できません)。
この関数は、プラットフォームで許可されている場合に、アライメントされていないメモリ アクセスを実行する可能性があります。
この関数は、コピー操作の一環としてメモリの場所に複数回アクセスする場合があります。
コピー元とコピー先が互いに重なる場合、この関数はコピー操作をサポートしません。
この関数は、コピー操作が失敗した場合 (アドレスが有効なユーザー モード アドレスではない場合やアクセスできない場合など) に構造化例外を発生させます。
固定サイズの構造体をコピーする場合は、代わりに WriteStructToUser を使用して、間違ったサイズを渡すリスクを回避する必要があります。
この関数はコンパイラによって最適化されることも、関数が呼び出される前または関数が戻った後に (ソース コードが明示的にこれらのアクセスを実行しない限り) このメモリ位置への追加のアクセスを作成することもありません。
この関数は、最新バージョンだけでなく、すべてのバージョンの Windows で動作します。 usermode_accessors.h ヘッダーから関数宣言を取得するには、最新の WDK を使用する必要があります。 また、最新の WDK のライブラリ (umaccess.lib) も必要です。 ただし、結果として得られるドライバーは、古いバージョンの Windows では正常に動作します。
Requirements
Requirement | Value |
---|---|
サポートされる最小クライアント | 「解説」を参照してください |
Header | usermode_accessors.h |
Library | umaccess.lib |
IRQL | APC_LEVEL以下 |