首页
社区
课程
招聘
[求助]关于IoAllocateMdl()函数的疑惑
发表于: 2009-6-14 14:05 10863

[求助]关于IoAllocateMdl()函数的疑惑

2009-6-14 14:05
10863
这是网址http://www.codeproject.com/KB/system/NoDeleteDelay.aspx
大概意思是删除文件和文件夹时,经常等待那么几秒后有可能会出现个对话框说不能删除吗?它做的就是改写shell32.dll的代码使之不等那么几秒马上就出来对话框。看了之后有很多问题不是很明白。望哪位帮帮我啊。我下面加了点注释,不知道理解的对不。哪位好心人帮忙纠正。这都是在DriverEntry()函数里的。原理是一些KnownDLL的所有DLL,系统都会为它们建立一个Section object。之后哪个进程建立时就会映射到本进程中。下面的代码先根据对象 名字得到句柄,然后映射到本进程也就是System进程中,返回shell32.dll的基址(注意它在用户空间),
RtlInitUnicodeString(&us, L"\\KnownDlls\\shell32.dll");
InitializeObjectAttributes(&oa, &us, OBJ_KERNEL_HANDLE, NULL, NULL);
status = ZwOpenSection(&hSection, SECTION_MAP_READ, &oa);//在system进程的句柄表中加入一项HANDLE_TABLE_ENTRY结构,并且返回节对象的句柄

// Get a pointer to the section
status = ZwMapViewOfSection(
hSection,
NtCurrentProcess(),
&pSection,
0,
0,
0,
&viewSize,
ViewShare,
0,
PAGE_READWRITE
);//映射到system进程的用户虚拟地址空间来(注意返回pSection是shell32.dll的映射基址)在我的系统是7D590000
pWordToChange = (PULONG)(pSection + pCurrentPatchInfo->offset);//这是我们要Patch的地址(也是在用户空间)

// Create a Memory Descriptor List (MDL) for the virtual address at "pWordToChange"
pCurrentPatchInfo->pMdl = IoAllocateMdl(pWordToChange, sizeof(ULONG), FALSE, FALSE, NULL);//这个函数真正的是干什么用的?我这样理解的,建立一个MDL,描述pWordToChange开始的4个字节。

// Lock the pages in memory and get a pointer to the "pWordToChange" in its
// kernel-memory-mapped location
MmProbeAndLockPages(pCurrentPatchInfo->pMdl, KernelMode, IoReadAccess);//这个函数也不懂,是不是把system进程的虚拟地址从pWordToChange—pWordToChange+4到的这段虚拟地址所对应的物理页锁进内存,防止Swap Out。(也就是KnownDlls\\shell32.dll节对象真正的物理页)。
pCurrentPatchInfo->pMapped = (PULONG)MmGetSystemAddressForMdlSafe(pCurrentPatchInfo->pMdl, NormalPagePriority);//得到系统地址,并且它是在系统空间中,这个地址是不是最后根据页表也映射到了KnownDlls\\shell32.dll节对象真正的物理页。因此我们根据这个地址改写了shell32.dll的内容。改写的是真正的物理页。之后如果有进程要用shell32.dll。系统再映射它。(注意此时映射的也就是刚刚改写的物理页了)(不是很懂啊。这是我的想法,不知道对不。哪位帮忙啊)
// Here's where we actually do the patching
for (pCurrentPatchInfo = offsets; pCurrentPatchInfo->offset != 0; pCurrentPatchInfo++)
{
// Do the patch
*pCurrentPatchInfo->pMapped = newBytes;

DbgPrint(
"Offset %08X at VA %08X changed to %08X\n",
pCurrentPatchInfo->offset,
pCurrentPatchInfo->pMapped,
*pCurrentPatchInfo->pMapped
);

// If we're unloading (i.e. DoPatch(FALSE)), we'll unmap and unlock the memory
if (!isLoading)
{
MmUnmapLockedPages(pCurrentPatchInfo->pMapped, pCurrentPatchInfo->pMdl);
MmUnlockPages(pCurrentPatchInfo->pMdl);
IoFreeMdl(pCurrentPatchInfo->pMdl);
}
}
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 252
活跃值: (13)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
麻烦版主看下啊。我是用word编辑了,怎么还没有对齐啊。教一下我要怎么弄啊。
2009-6-14 14:07
0
雪    币: 8026
活跃值: (2511)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这是网址http://www.codeproject.com/KB/system/NoDeleteDelay.aspx
大概意思是删除文件和文件夹时,经常等待那么几秒后有可能会出现个对话框说不能删除吗?它做的就是改写shell32.dll的代码使之不等那么几秒马上就出来对话框。看了之后有很多问题不是很明白。望哪位帮帮我啊。我下面加了点注释,不知道理解的对不。哪位好心人帮忙纠正。这都是在DriverEntry()函数里的。原理是一些KnownDLL的所有DLL,系统都会为它们建立一个Section object。之后哪个进程建立时就会映射到本进程中。下面的代码先根据对象 名字得到句柄,然后映射到本进程也就是System进程中,返回shell32.dll的基址(注意它在用户空间),
RtlInitUnicodeString(&us, L"\\KnownDlls\\shell32.dll");
InitializeObjectAttributes(&oa, &us, OBJ_KERNEL_HANDLE, NULL, NULL);
status = ZwOpenSection(&hSection, SECTION_MAP_READ, &oa);//在system进程的句柄表中加入一项HANDLE_TABLE_ENTRY结构,并且返回节对象的句柄

// Get a pointer to the section
status = ZwMapViewOfSection(
hSection,
NtCurrentProcess(),
&pSection,
0,
0,
0,
&viewSize,
ViewShare,
0,
PAGE_READWRITE
);//映射到system进程的用户虚拟地址空间来(注意返回pSection是shell32.dll的映射基址)在我的系统是7D590000
pWordToChange = (PULONG)(pSection + pCurrentPatchInfo->offset);//这是我们要Patch的地址(也是在用户空间)

// Create a Memory Descriptor List (MDL) for the virtual address at "pWordToChange"
pCurrentPatchInfo->pMdl = IoAllocateMdl(pWordToChange, sizeof(ULONG), FALSE, FALSE, NULL);//这个函数真正的是干什么用的?我这样理解的,建立一个MDL,描述pWordToChange开始的4个字节。

// Lock the pages in memory and get a pointer to the "pWordToChange" in its
// kernel-memory-mapped location
MmProbeAndLockPages(pCurrentPatchInfo->pMdl, KernelMode, IoReadAccess);//这个函数也不懂,是不是把system进程的虚拟地址从pWordToChange—pWordToChange+4到的这段虚拟地址所对应的物理页锁进内存,防止Swap Out。(也就是KnownDlls\\shell32.dll节对象真正的物理页)。
pCurrentPatchInfo->pMapped = (PULONG)MmGetSystemAddressForMdlSafe(pCurrentPatchInfo->pMdl, NormalPagePriority);//得到系统地址,并且它是在系统空间中,这个地址是不是最后根据页表也映射到了KnownDlls\\shell32.dll节对象真正的物理页。因此我们根据这个地址改写了shell32.dll的内容。改写的是真正的物理页。之后如果有进程要用shell32.dll。系统再映射它。(注意此时映射的也就是刚刚改写的物理页了)(不是很懂啊。这是我的想法,不知道对不。哪位帮忙啊)
// Here's where we actually do the patching
for (pCurrentPatchInfo = offsets; pCurrentPatchInfo->offset != 0; pCurrentPatchInfo++)
{
// Do the patch
*pCurrentPatchInfo->pMapped = newBytes;

DbgPrint(
"Offset %08X at VA %08X changed to %08X\n",
pCurrentPatchInfo->offset,
pCurrentPatchInfo->pMapped,
*pCurrentPatchInfo->pMapped
);

// If we're unloading (i.e. DoPatch(FALSE)), we'll unmap and unlock the memory
if (!isLoading)
{
MmUnmapLockedPages(pCurrentPatchInfo->pMapped, pCurrentPatchInfo->pMdl);
MmUnlockPages(pCurrentPatchInfo->pMdl);
IoFreeMdl(pCurrentPatchInfo->pMdl);
}
}
}
2009-6-14 17:27
0
游客
登录 | 注册 方可回帖
返回
//