当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

xp下用户程序空间分配(8):MEM_MAPPED[VC/C++编程]

赞助商链接



  本文“xp下用户程序空间分配(8):MEM_MAPPED[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在去除前面的那些东西之后,我们的内存块里面还有一堆MEM_MAPPED的内容,就像这样的块:

基址 分配基址 分配保护 大小 状况 保护 范例
00140000 00140000 00000002

PAGE_READONLY

00001000 00001000

MEM_COMMIT

00000002

PAGE_READONLY

00040000

MEM_MAPPED

MSDN里面这样注释MEM_MAPPED这种范例:

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

很自然地我们想用GetMappedFileName来看看映射到这些 内存区域的文件名,于是发现了下面几个块的确是做了文件映射:

基址 分配基址 分配保护 大小 状况 保护 范例 映射文件
00270000 00270000 00000002

PAGE_READONLY

00016000 00001000

MEM_COMMIT

00000002

PAGE_READONLY

00040000

MEM_MAPPED

DeviceHarddiskVolume3WINDOWSsystem32unicode.nls
00290000 00290000 00000002

PAGE_READONLY

00041000 00001000

MEM_COMMIT

00000002

PAGE_READONLY

00040000

MEM_MAPPED

DeviceHarddiskVolume3WINDOWSsystem32locale.nls
002e0000 002e0000 00000002

PAGE_READONLY

00041000 00001000

MEM_COMMIT

00000002

PAGE_READONLY

00040000

MEM_MAPPED

DeviceHarddiskVolume3WINDOWSsystem32sortkey.nls
00330000 00330000 00000002

PAGE_READONLY

00006000 00001000

MEM_COMMIT

00000002

PAGE_READONLY

00040000

MEM_MAPPED

DeviceHarddiskVolume3WINDOWSsystem32sorttbls.nls
003b0000 003b0000 00000002

PAGE_READONLY

00003000 00001000

MEM_COMMIT

00000002

PAGE_READONLY

00040000

MEM_MAPPED

DeviceHarddiskVolume3WINDOWSsystem32ctype.nls

那么别的东西是那边来的?

利用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++;
……………………….
}
}
}
}


  以上是“xp下用户程序空间分配(8):MEM_MAPPED[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • xp下用户程序空间分配(1):大致框架
  • <b>xp下用户程序空间分配(2):栈</b>
  • <b>xp下用户程序空间分配(3):加载文件</b>
  • xp下用户程序空间分配(4):加载主程序
  • <b>xp下用户程序空间分配(5):加载系统DLL</b>
  • xp下用户程序空间分配(6):加载用户DLL
  • <b>xp下用户程序空间分配(7):Heap</b>
  • xp下用户程序空间分配(8):MEM_MAPPED
  • <b>xp下用户程序空间分配(9):还剩下什么?</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .