能力值:
( LV3,RANK:30 )
2 楼
我可能想多了。UserMode就UserMode吧,在DriverEntry里好像也能用。。。
PMDL MmMapLockedPagesTwiceContiguously(PMDL BufMdl)
{
ULONG BufSize = MmGetMdlByteCount(BufMdl);
PCHAR map1 = NULL, map2 = NULL;
ULONG MaxTry = 64;
BOOLEAN found = FALSE;
PMDL NewBufMdl = NULL;
while(MaxTry--)
{
map1 = MmMapLockedPagesSpecifyCache(BufMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
map2 = MmMapLockedPagesSpecifyCache(BufMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
if(map1 && map2 && map1 + BufSize == map2)
{
found = TRUE;
break;
}
if(map1)
MmUnmapLockedPages(map1, BufMdl);
if(map2)
MmUnmapLockedPages(map2, BufMdl);
}
if(!found)
return NULL;
NewBufMdl = IoAllocateMdl(map1, BufSize * 2, FALSE, FALSE, NULL);
if(NewBufMdl)
{
MmProbeAndLockPages(NewBufMdl, UserMode, IoReadAccess);
}
if(map1)
MmUnmapLockedPages(map1, BufMdl);
if(map2)
MmUnmapLockedPages(map2, BufMdl);
return NewBufMdl;
}
最后于 2020-11-2 21:01
被MengXP编辑
,原因:
能力值:
( LV3,RANK:20 )
3 楼
直接改这线性地址的pte它不香吗
能力值:
( LV5,RANK:60 )
4 楼
用官方api有点看运气,成功率最高的方案我想到的有两种,一如楼上所说直接动页表,二是直接动protopte
能力值:
( LV3,RANK:30 )
5 楼
hhkqqs
用官方api有点看运气,成功率最高的方案我想到的有两种,一如楼上所说直接动页表,二是直接动protopte
是的,这种成不成功主要看脸,动页表肯定是最稳定的方案了,先用MmAllocateMappingAddress占坑,然后改页表就行了。
能力值:
( LV5,RANK:60 )
6 楼
MengXP
是的,这种成不成功主要看脸,动页表肯定是最稳定的方案了,先用MmAllocateMappingAddress占坑,然后改页表就行了。
不推荐直接改MmXXX内存对应的页表项,因为你要映射的2M内存在页表的布局不一定和MmXXX的一致。最好用MmXXX只申请两页的内存用于保存页表信息,把要映射的2M内存强行拆分出512个物理页填进去,再把这两页的物理页帧号填进两个连续空闲的PDE即可
能力值:
( LV2,RANK:10 )
7 楼
大佬以前是不是西邮Linux兴趣小组的