MmCopyMemory 関数 (ntddk.h)
MmCopyMemory ルーチンは、指定された範囲の仮想メモリまたは物理メモリを呼び出し元が指定したバッファーにコピーします。
構文
NTSTATUS MmCopyMemory(
[in] PVOID TargetAddress,
[in] MM_COPY_ADDRESS SourceAddress,
[in] SIZE_T NumberOfBytes,
[in] ULONG Flags,
[out] PSIZE_T NumberOfBytesTransferred
);
パラメーター
[in] TargetAddress
呼び出し元が指定したバッファーへのポインター。 このバッファーは、非ページ メモリに存在する必要があります。
[in] SourceAddress
TargetAddress が指すバッファーにコピーするデータの仮想アドレスまたは物理アドレスを含む、値渡しされるMM_COPY_ADDRESS構造体。
[in] NumberOfBytes
SourceAddress から TargetAddress にコピーするバイト数。
[in] Flags
SourceAddress が仮想アドレスか物理アドレスかを示すフラグ。 このパラメーターには、次のフラグ ビットが定義されています。
フラグ ビット | 説明 |
---|---|
MM_COPY_MEMORY_PHYSICAL | SourceAddress は、物理アドレスを指定します。 |
MM_COPY_MEMORY_VIRTUAL | SourceAddress は仮想アドレスを指定します。 |
これら 2 つのフラグ ビットは相互に排他的です。 呼び出し元はどちらか一方を設定する必要がありますが、両方を設定する必要はありません。
[out] NumberOfBytesTransferred
SourceAddress の場所から TargetAddress のバッファーに正常にコピーされたバイト数をルーチンが書き込む場所へのポインター。
戻り値
MmCopyMemory は、範囲全体が正常にコピーされた場合にSTATUS_SUCCESSを返します。 それ以外の場合は、エラー状態が返され、呼び出し元は NumberOfBytesTransferred パラメーターが指す出力値を調べて、実際にコピーされたバイト数を確認する必要があります。
注釈
カーネル モード ドライバーは、このルーチンを呼び出して、任意の物理アドレスまたは仮想アドレスに安全にアクセスできます。
MM_COPY_MEMORY_PHYSICAL フラグが設定されている場合、 SourceAddress はオペレーティング システムの制御下にある通常のメモリを指す必要があります。 MmCopyMemory は、メモリ マップされたデバイスとファームウェア テーブルを含む I/O 領域を参照する物理アドレスのエラー状態コードを返します。 I/O 領域の物理メモリにアクセスするために、ドライバーは MmMapIoSpace ルーチンを使用できます。
MM_COPY_MEMORY_VIRTUAL フラグが設定されている場合、 SourceAddress は、システム アドレス空間内のバッファー、または現在のプロセスのユーザー アドレス空間内のバッファーを指すことができます。 呼び出し元が、指定したソース アドレスを含む割り当ての有効期間を制御しない場合、MmCopyMemory は失敗するか、不整合なデータを返す可能性がありますが、無効で、直接参照されている場合にバグ チェックをトリガーするシステム アドレスであっても、システム クラッシュは発生しません。 MmCopyMemory は、I/O 領域を参照するシステム仮想アドレスのエラー状態コードを返します。
SourceAddress で指定された仮想アドレスのメモリが常駐でない場合、MmCopyMemory はメモリを常駐にしようとします。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8.1以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | ntddk.h |
Library | Ntoskrnl.lib |
IRQL | <= APC_LEVEL |