● VirtualQueryEx 函數windows
功能:檢索在指定進程的虛擬地址空間內的一系列頁面的信息。緩存
函數參數函數
參數1:hProcess [in]
進程句柄
參數2:lpAddress [in, optional]
查詢虛擬內存地址
參數3:lpBuffer [out]
MEMORY_BASIC_INFORMATION 結構體指針
參數4:dwLength [in]
結構體指針的大小
返回值:
函數寫入lpBuffer的字節數,若是不等於sizeof(MEMORY_BASIC_INFORMATION)表示失敗。
MEMORY_BASIC_INFORMATION 結構體
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress; // 區域基地址。
PVOID AllocationBase; // 分配基地址。
DWORD AllocationProtect; // 區域被初次保留時賦予的保護屬性。
SIZE_T RegionSize; // 區域大小(以字節爲計量單位)。
DWORD State; // 狀態(MEM_FREE、MEM_RESERVE或 MEM_COMMIT)。
DWORD Protect; // 保護屬性。
DWORD Type; // 類型。
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;spa
BaseAddress 與lpAddress參數的值相同
AllocationBase 指明用VirtualAlloc函數分配內存區域的基地址。lpAddress在該區域以內
AllocationProtect 指明該地址空間區域被初次保留時賦予該區域的保護屬性。
PAGE_READONLY 只讀屬性
PAGE_READWRITE 容許讀寫
PAGE_EXECUTE_READ 容許執行和讀取。
PAGE_EXECUTE_READWRITE 容許讀寫和執行代碼。
PAGE_EXECUTE_WRITECOPY 對於該地址空間的區域,無論執行什麼操做,都不會引起訪問違規
PAGE_GUARD 在頁面上寫入一個字節時使應用程序收到一個通知(經過一個異常條件)
PAGE_NOACCESS 禁止一切訪問
PAGE_NOCACHE 停用已提交頁面的高速緩存。通常狀況下最好不要使用該標誌,由於它主要是供須要處理內存緩衝區的硬件設備驅動程序的開發人員使用的
RegionSize 用於指明內存塊從基地址即BaseAddress開始的全部頁面的大小
State 用於指明全部相鄰頁面的狀態。
MEM_FREE 空閒狀態
MEM_RESERVE 指明頁面被保留
Protect 用於指明全部相鄰頁面
Type 用於指明支持全部相鄰頁面的物理存儲器的類型(MEM_IMAGE,MEM_MAPPED或MEM_PRIVATE)
MEM_IMAGE 指明該區域的虛擬地址原先受內存映射的映像文件(如.exe或DLL文件)的支持
MEM_MAPPED 該區域的虛擬地址原先是受內存映射的數據文件的支持,但也許再也不受數據文件的支持
MEM_PRIVATE 指明該內存區域是私有的。不被其餘進程共享指針
1 #define UNICODE 2 #include <stdio.h> 3 #include <windows.h> 4 #include <process.h> 5 6 int main() 7 { 8 DWORD hProcessID = GetCurrentProcessId(); 9 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, hProcessID); 10 MEMORY_BASIC_INFORMATION mbi; 11 if( sizeof(mbi) == VirtualQueryEx(hProcess, 0x0, &mbi, sizeof(mbi))) 12 { 13 printf("BaseAddr:0x%X Size:%d State:%d",(UINT)mbi.BaseAddress, mbi.RegionSize, mbi.State); 14 } 15 return 0; 16 }
1 #define UNICODE 2 #include <stdio.h> 3 #include <windows.h> 4 #include <process.h> 5 6 int main() 7 { 8 DWORD hProcessID = GetCurrentProcessId(); 9 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, hProcessID); 10 MEMORY_BASIC_INFORMATION mbi; 11 12 DWORD dwAddr = 0x0; 13 while( sizeof(mbi) == VirtualQueryEx(hProcess, (LPVOID)dwAddr, &mbi, sizeof(mbi))) 14 { 15 printf("BaseAddr:0x%X Size:%d State:%d\n",(UINT)mbi.BaseAddress, mbi.RegionSize, mbi.State); 16 dwAddr += (DWORD)mbi.RegionSize; 17 } 18 return 0; 19 }