다음을 통해 공유


가상 및 실제 메모리

엔진은 대상의 가상 및 물리적 메모리를 읽고 쓰기 위한 다양한 메서드를 제공합니다.

가상 메모리

대상의 가상 메모리에 위치를 지정할 때 대상의 가상 주소 공간이 사용됩니다. 사용자 모드 디버깅에서 현재 프로세스의 가상 주소 공간입니다. 커널 모드 디버깅에서 암시적 프로세스의 가상 주소 공간입니다. 현재 및 암시적 프로세스에 대한 자세한 내용은 스레드 및 프로세스를 참조하세요.

대상의 가상 메모리는 ReadVirtual 을 사용하여 읽고 WriteVirtual을 사용하여 쓸 수 있습니다.

대상 메모리의 포인터는 편의 메서드 ReadPointersVirtualWritePointersVirtual을 사용하여 읽고 쓸 수 있습니다. 이러한 메서드는 엔진에서 사용하는 64비트 포인터와 대상에서 사용하는 네이티브 포인터 간에 자동으로 변환됩니다. 이러한 메서드는 후속 요청에 사용할 포인터(예: 문자열에 대한 포인터)가 포함된 메모리를 요청할 때 유용합니다.

SearchVirtualSearchVirtual2 메서드를 사용하여 대상의 가상 메모리에서 바이트 패턴을 검색할 수 있습니다.

FillVirtual 메서드를 사용하여 바이트 패턴을 여러 번 대상의 가상 메모리에 복사할 수 있습니다.

대상의 가상 메모리는 ReadVirtualUncachedWriteVirtualUncached 메서드를 사용하여 디버거 엔진의 가상 메모리 캐시를 우회하는 방식으로 읽고 쓸 수도 있습니다. 이러한 캐시되지 않은 버전은 캐시를 오염하거나 무효화하지 않고 메모리 매핑된 디바이스 영역과 같이 본질적으로 휘발성이 있는 가상 메모리를 읽는 데 유용합니다. 캐시되지 않은 액세스의 성능이 캐시된 액세스보다 훨씬 낮을 수 있으므로 캐시되지 않은 메모리 액세스는 필요한 경우에만 사용해야 합니다.

엔진은 대상의 가상 메모리에서 문자열을 읽는 몇 가지 편리한 메서드를 제공합니다. 대상에서 멀티바이트 문자열을 읽으려면 ReadMultiByteStringVirtualReadMultiByteStringVirtualWide를 사용합니다. 대상에서 유니코드 문자열을 읽으려면 ReadUnicodeStringVirtualReadUnicodeStringVirtualWide를 사용합니다.

메모리 위치에 대한 정보를 찾으려면 GetOffsetInformation을 사용합니다. 대상의 모든 가상 주소 공간에 유효한 메모리가 포함되지는 않습니다. 지역 내에서 유효한 메모리를 찾으려면 GetValidRegionVirtual을 사용합니다. 대상에서 유효한 메모리를 수동으로 검색할 때 GetNextDifferentlyValidOffsetVirtual 메서드는 유효성이 변경될 수 있는 다음 위치를 찾습니다.

실제 메모리

실제 메모리는 커널 모드 디버깅에서만 직접 액세스할 수 있습니다.

대상의 실제 메모리는 ReadPhysicalReadPhysical2를 사용하여 읽고 WritePhysical 및 WritePhysical2 를 사용하여 작성할 수 있습니다.

FillPhysical 메서드를 사용하여 바이트 패턴을 여러 번 대상의 실제 메모리에 복사할 수 있습니다.

대상의 가상 주소 공간에 있는 주소는 VirtualToPhysical 메서드를 사용하여 대상의 실제 주소로 변환할 수 있습니다. 가상 주소를 실제 주소로 변환하는 데 사용되는 시스템의 페이징 구조는 GetVirtualTranslationPhysicalOffsets를 사용하여 찾을 수 있습니다.

이벤트

대상의 가상 또는 물리적 메모리가 변경되면 IDebugEventCallbacks::ChangeDebuggeeState 콜백 메서드가 호출됩니다.