首页
社区
课程
招聘
[旧帖] [转帖]MmCreateMdl的汇编实现注释(新人转正贴) 0.00雪花
发表于: 2010-4-27 14:05 1779

[旧帖] [转帖]MmCreateMdl的汇编实现注释(新人转正贴) 0.00雪花

2010-4-27 14:05
1779
PMDL
  MmCreateMdl(
    IN PMDL  MemoryDescriptorList  OPTIONAL,
    IN PVOID  Base,
    IN SIZE_T  Length
    );
DDK公开,导出
如果参数1为空,
先调用MmSizeOfMdl()确定描述此段地址的MDL结构所需要的内存大小
再调用ExAllocatePoolWithTag()在非分布内存池中分配标识为'Mmdi'大小为MmSizeOfMdl()返回值的内存
当分配成功或参数2不为空时:
清空Next,MdlFlags,计算出此MDL结构的总大小,填写Size域,再分别填写StartVa,ByteCount,ByteOffset
返回Mdl结构的首地址
kd> dt nt!_MDL
   +0x000 Next             : Ptr32 _MDL
   +0x004 Size             : Int2B
   +0x006 MdlFlags         : Int2B
   +0x008 Process          : Ptr32 _EPROCESS
   +0x00c MappedSystemVa   : Ptr32 Void
   +0x010 StartVa          : Ptr32 Void
   +0x014 ByteCount        : Uint4B
   +0x018 ByteOffset       : Uint4B
ebp
ebp+4
ebp+8 参数1,MDL结构地址
ebp+c 参数2,起始地址
ebp+10 参数3,大小
nt!MmCreateMdl:
805057d0 8bff            mov     edi,edi
805057d2 55              push    ebp
805057d3 8bec            mov     ebp,esp
805057d5 8b4508          mov     eax,dword ptr [ebp+8] ;eax=参数1,Mdl结构地址
805057d8 85c0            test    eax,eax
805057da 56              push    esi
805057db 8b750c          mov     esi,dword ptr [ebp+0Ch];esi=地址
805057de 57              push    edi
805057df 8b7d10          mov     edi,dword ptr [ebp+10h];edi=大小
805057e2 7518            jne     nt!MmCreateMdl+0x2c (805057fc)
   ;如果给定MDL地址为0的话,
805057e4 684d6d646c      push    6C646D4Dh 'Mmdi'
805057e9 57              push    edi
805057ea 56              push    esi
805057eb e8b6ffffff      call    nt!MmSizeOfMdl (805057a6);取得需要的MDL结构的大小
805057f0 50              push    eax
805057f1 6a00            push    0
805057f3 e888f80300      call    nt!ExAllocatePoolWithTag (80545080);分配内存
805057f8 85c0            test    eax,eax
805057fa 7434            je      nt!MmCreateMdl+0x60 (80505830)
   ;如果给定的MDL地址不为空的话,或者由系统分配好了内存
805057fc 832000          and     dword ptr [eax],0 ;Next清0
805057ff 6683600600      and     word ptr [eax+6],0 ;MdlFlags清0
80505804 8bce            mov     ecx,esi  ;ecx=esi=地址
80505806 81e1ff0f0000    and     ecx,0FFFh  ;ecx=页内偏移
8050580c 8d9439ff0f0000  lea     edx,[ecx+edi+0FFFh] ;ecx=内存偏移 edi=内存大小
80505813 c1ea0c          shr     edx,0Ch  ;内存块占用的页数
80505816 8d14951c000000  lea     edx,[edx*4+1Ch] ;EDX=MDL头结构大小+后面Pages数组的大小
8050581d 81e600f0ffff    and     esi,0FFFFF000h  ;esi=页地址
80505823 66895004        mov     word ptr [eax+4],dx ;Mdl->_Size域
80505827 897010          mov     dword ptr [eax+10h],esi;Mdl->StartVa    页地址
8050582a 894818          mov     dword ptr [eax+18h],ecx;Mdl->ByteOffset 页内偏移
8050582d 897814          mov     dword ptr [eax+14h],edi;Mdl->ByteCount  内存大小
80505830 5f              pop     edi
80505831 5e              pop     esi
80505832 5d              pop     ebp
80505833 c20c00          ret     0Ch

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
先帮楼主顶一下然后慢慢看,沙发看贴相当于在天台,太阳晒着那么爽。
2010-4-27 14:54
0
游客
登录 | 注册 方可回帖
返回
//