ntstatus driverentry(pdriver_object driver,punicode_string reg)
//iowriteaccess指定為寫許可權
__except (exception_execute_handler)
//4、呼叫mmmaplockedpagesspecifycache函式生成使用者模式下對應的虛擬位址,然後就能修改這個位址的內容來達到修改核心內容的目的
addrmm = mmmaplockedpagesspecifycache(mdl, kernelmode, mmcached, 0, false, normalpagepriority);//建立乙個核心模式下的虛擬記憶體對應zwquerydirectoryfile函式
dbgprint(「addrmm=%x\n」, addrmm);
addrmm = mmmaplockedpagesspecifycache(mdl, usermode, mmcached, 0, false, normalpagepriority);//建立乙個使用者模式下的虛擬記憶體對應zwquerydirectoryfile函式
dbgprint(「addrmm=%x\n」, addrmm);
*((ulong *)addrmm) = 0x90;//修改使用者模式下的虛擬位址的值達到修改核心模式下的//zwquerydirectoryfile函式前5個位元組的目的
*((ulong *)((ulong)addrmm + 1)) = 0x90909090;
rtlinitunicodestring(&func, l"kdenterdebugger");
dbgprint(「realzwquerydirectoryfile=%x\n」, *((ulong *)realzwquerydirectoryfile));//列印修改以
//後的核心zwquerydirectoryfile函式的前5個位元組的內容
// 5、呼叫mmunmaplockedpages解除對映
mmunmaplockedpages(addrmm, mdl);
// 6、mmfreepagesfrommdl釋放mdl鎖定的物理頁
mmfreepagesfrommdl(mdl);
//7、呼叫iofreemdl 釋放mdl
iofreemdl(mdl);
執行結果如下圖
Linux核心記憶體
核心空間占用4g虛擬記憶體的後1g 明確 不論在核心空間還是使用者空間,看到的位址都是虛擬位址,只是虛擬位址空間不一樣 但是cpu最終訪問的位址是虛擬位址對應的實體地址 虛擬位址轉換成對應的實體地址需要mmu 將來mmu利用頁表進行位址轉換 引申 uclinux支援不帶mmu的處理器 問 使用者空間...
linux核心記憶體分配
核心中的記憶體分配通常通過kmalloc kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配 釋放記憶體的介面。類似於標準c中的malloc free,kmalloc kfree是核心中的用於常規記憶體分配的介面。kmalloc kfree是工作在slab分配器的基礎...
linux核心記憶體管理
整個linux虛擬記憶體發布如下 3g以上是核心位址,0 3g是程序位址空間。在x86結構中,核心位址分為三種,這三種型別的區域如下 zone dma 記憶體開始的16mb zone normal 16mb 896mb zone highmem 896mb 結束 程序位址空間的3g,通過mmu,隨機...