https://learn.microsoft.com/ko-kr/windows/win32/api/winnt/ns-winnt-memory_basic_information
아무튼, C# 에서 VirtualQuery 를 사용하기 위해서 관련 함수를 정의하고 이를 kernel32.dll DLL로부터 가져와야 한다. 실제 VirtualQuery 의 구현은 kernel32.dll에서 수행하고 있다.
그리고 그 과정에서 MEMORY_BASIC_INFORMATION 구조체를 포인터로 받는 과정이 필요하다. 다만, MEMORY_BASIC_INFORMATION 의 구조체는 winnt.h 의 헤더에 정의된 것이기 때문에 C#에서 사용하기 위해 우리가 별도로 구조체를 정의해야 한다.
https://learn.microsoft.com/ko-kr/windows/win32/api/memoryapi/nf-memoryapi-virtualquery
아무튼 요놈을 C#에서 가져다쓰기 위해, LPCVoid는 말 그대로 포인터이기 때문에 IntPtr 을 사용하면 될 것이고, dwLength의 SIZE_T 또한 Unsigned Long(8바이트)이므로
[DllImport("kernel32.dll")]
static extern int VirtualQuery(IntPtr lpAddress, out MemoryBasicInformation lpBuffer, UInt64 dwLength);
이때 C#에서 제공하는 예약어로 out 제공하는데, 포인터와 같은 정보는 out으로 내뱉어 특정 객체에 내보내도록 할 수 있다.
[BaseAddress] 0
[Size] 2147352576
[State] 65536
---------------------------
확인