다음을 통해 공유


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가 가상 주소인지 실제 주소인지 여부를 나타내는 플래그입니다. 이 매개 변수에 대해 다음 플래그 비트가 정의됩니다.

플래그 비트 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 시작해서 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 ntddk.h
라이브러리 Ntoskrnl.lib
IRQL <= APC_LEVEL

추가 정보

MM_COPY_ADDRESS

MmMapIoSpace