標籤:nbsp 代碼 防止 類型 font 核心 byte void virtual
1.基本函數及其原型
PVOID ExAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes );
VOID RtlMoveMemory( IN VOID UNALIGNED *Destination, IN CONST VOID UNALIGNED *Source, IN SIZE_T Length );
VOID RtlFillMemory( IN VOID UNALIGNED *Destination, IN SIZE_T Length, IN UCHAR Fill );
VOID ExFreePool( IN PVOID P );
2.記憶體類型
PagedPool 和NonPagedPool
前者可以被置換到硬碟中,一般儲存資料, 如開啟一個大檔案, 資料結構.
後者不能被置換到硬碟中,駐留在記憶體中,一般用來儲存代碼.
如果執行代碼到PagedPool的記憶體中去了,很有可能導致藍屏
此外,在核心空間中所有記憶體都是可讀可寫可執行,故沒有類似使用者態下的VirtualProtect改變記憶體屬性的函數
但是並不意味著可以隨意執行和改寫記憶體中的代碼.要滿足2個條件: 一個是關閉記憶體防寫保護, 二個是提升IRQL層級.(防止執行出錯)
對於關閉記憶體防寫保護通過操作cr0寄存器,後者使用KeRaiseIrqlToDpcLevel 和KeLowerIrql 實現
//關閉記憶體防寫保護和提升IRQL
KIRQL irql=KeRaiseIrqlToDpcLevel();
UINT64 cr0=__readcr0();
cr0 &= 0xfffffffffffeffff;
__writecr0(cr0);
_disable();
還原:
UINT64 cr0=__readcr0();cr0 |= 0x10000;_enable();__writecr0(cr0);KeLowerIrql(irql);
未完待續.......
win64 驅動記憶體基本操作