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 以降で使用できます。 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | ntddk.h |
ライブラリ | Ntoskrnl.lib |
IRQL | <= APC_LEVEL |