今天寫如下代碼時,發現目標進程 QQ.exe 的內存使用量從 20 mb 一直狂升至 120mb.開始懷疑是讀取了不存在的內存失敗,但被否決了,因為一般進程的用戶區內存 90% 都是不可讀的
根據猜測,很有可能是加載的 DLL 被復制了一份,即開啟了 寫時復制 機制,但是只是讀取操作,沒有任何寫入操作呀,怎麼會引發寫時復制呢?難道是MIcrosoft的又一個 bug?
目標進程 QQ.exe 所有加載的dll的內存占用量跟多增加的這 100MB 也很吻合!
LPCSTR lpStartMemory;
BYTE lpBuf[4096];
DWord wlen;
BOOL ret;
DWord pid=GetPidByName("QQ.exe");
HANDLE hProcess=OpenProcess(PROCESS_VM_READ,FALSE,pid);
FILE* fp=fopen("QQ.dat","wb");
for(lpStartMemory=0;lpStartMemory<(LPCSTR)0x80000000;lpStartMemory+=4096)
{
ret=ReadProcessMemory(hProcess,lpStartMemory,lpBuf,4096,&wlen);
if(ret==TRUE && wlen==4096)
{
fwrite(lpBuf,1,4096,fp);
}
}
fclose(fp);
CloseHandle(hProcess);