1. 程式人生 > >Windows核心程式設計之:分頁記憶體與非分頁記憶體

Windows核心程式設計之:分頁記憶體與非分頁記憶體

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()

{

}

某個例程需要在初始化的時候載入記憶體,然後可以從記憶體中解除安裝掉,比如

DriverEntry情況下,DriverEntry會很大,佔據很大的空間,為了節省記憶體,需要及時地從記憶體中解除安裝

#pragma INITCODE

NTSTATUS DriverEntry(

IN PDRIVER_OBJECT pDriverObject,

IN PUNICODE_STRING RegisterPath)

{//do something}