Windows核心程式設計之:分頁記憶體與非分頁記憶體
阿新 • • 發佈:2019-01-22
Windows規定有些虛擬記憶體可以交換到檔案中,這類記憶體被稱為分頁記憶體
有些虛擬記憶體永遠不會交換到檔案中,這些記憶體叫非分頁記憶體
#define PAGEDCODE code_seg(“PAGE”);//分頁記憶體
#define LOCKEDCODE code_seg();//非分頁的
#define INITCODE code_seg(“INIT”);
#define PAGEDDATAdata_seg(“PAGE”);
#define LOCKEDDATAdata_seg();
#define INITDATAdata_seg(“INIT”);
例:
如果將某個函式載入到分頁記憶體中,可用下列的函式
#pragma PAGEDCODE
VOID Fun()
{
PAGED_CODE(); //do something
}
注意:PAGED_CODE()是DDK提供的巨集,只在check版本中生效,它會檢查這個函數是否執行在低於DISPATCH_LEVAL的中斷請求,如果等於或高於這個中斷請求級,則產生一個斷言。當程式執行在DISPATCH_LEVEL之上時(包括本層),程式只能使用非分頁記憶體,否則將導致藍屏宕機
如果將某個函式載入到非分頁記憶體中,可用下列的函式
#pragma LOCKEDCODE
VOIDFun()
{
}
某個例程需要在初始化的時候載入記憶體,然後可以從記憶體中解除安裝掉,比如
#pragma INITCODE
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING RegisterPath)
{//do something}