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

以傳值方式傳遞 的MM_COPY_ADDRESS 結構,其中包含要複製到 TargetAddress 所指向之緩衝區之數據的虛擬位址或實體位址。

[in] NumberOfBytes

要從 SourceAddress 複製到 TargetAddress 的位元元組數目。

[in] Flags

指出 SourceAddress 是虛擬位址還是實體位址的旗標。 為此參數定義下列旗標位。

旗標位 Description
MM_COPY_MEMORY_PHYSICAL SourceAddress 會指定實體位址。
MM_COPY_MEMORY_VIRTUAL SourceAddress 會指定虛擬位址。

這兩個旗標位互斥。 呼叫端必須設定其中一個或另一個,但不能同時設定兩者。

[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 開始提供。
目標平台 Universal
標頭 ntddk.h
程式庫 Ntoskrnl.lib
IRQL <= APC_LEVEL

另請參閱

MM_COPY_ADDRESS

MmMapIoSpace