程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> xp下用戶程序空間分配(8):MEM_MAPPED

xp下用戶程序空間分配(8):MEM_MAPPED

編輯:關於C++

在去除前面的那些東西之後,我們的內存塊裡面還有一堆MEM_MAPPED的內容,就像這樣的塊:

MSDN裡面這樣解釋MEM_MAPPED這種類型:

Indicates that the memory pages within the region are mapped into the view of a section.

很自然地我們想用GetMappedFileName來看看映射到這些 內存區域的文件名,於是發現了下面幾個塊的確是做了文件映射:

那麼其它東西是哪裡來的?

使用GetLastError取錯誤信息:“error: 000003ee : 文件所在 的卷已被外部改變,因此打開的文件不再有效。”,詭異得很!一怒之下使用UnmapViewOfFile將 這些內存塊給Unmap了,不幸的是程序就這樣掛掉了!

寫段代碼查詢一下當前打開的句柄,看看有沒 有file mapping的內容:

void enum_handles(HANDLE hProcess)
{
// 枚舉已經打 開的句柄,取其名稱
HMODULE hNtDll = NULL; // nt.dll句柄
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
NTQUERYOBJECT NtQueryObject = NULL;
SYSTEM_HANDLE_INFORMATION *hInfo = NULL;
int nNumHandle = 0, i;      // 句柄數 量
NTSTATUS Status;
ULONG nSize, nCount;
char cBuffer[0x40000], cInfoBuffer [0x1000];
OBJECT_ALL_INFORMATION *pInfo;
OBJECT_NAME_INFORMATION* pName;
DWORD nId = GetProcessId(hProcess);


// 取導出函數
hNtDll = GetModuleHandle( "ntdll.dll" );
ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( hNtDll, "ZwQuerySystemInformation" );
NtQueryObject = ( NTQUERYOBJECT )GetProcAddress( hNtDll, "NtQueryObject" );

// 查詢句柄信息
Status = ZwQuerySystemInformation (SystemHandleInformation,
cBuffer,
0x40000,
&nSize);

if (NT_SUCCESS(Status))
{
nNumHandle = *(PULONG)cBuffer;
hInfo = (SYSTEM_HANDLE_INFORMATION*)(cBuffer + 4);
nCount = 0;
for(i = 0; i < nNumHandle; i++)
{
if(hInfo[i].ProcessId != nId) continue;
Status = NtQueryObject(hInfo[i].Handle, ObjectAllInformation, cInfoBuffer, 0x1000, &nSize);
if(NT_SUCCESS(Status))
{
pInfo = (OBJECT_ALL_INFORMATION*)cInfoBuffer;
nCount++;
……………………….
}
}
}
}

網上有資料說NtQueryObject會讓程序掛掉,但是沒有發現有此現象,奇怪! 上面的代碼可以得到下面的句柄列表:

可以看到,系統映射過來的section對象著實不少!至於這些section對象與內存塊的對應關系,限於 水平,感覺無從下手,暫且做個記號。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved