Windows核心函式的命名

2021-05-22 05:02:11 字數 1467 閱讀 4844

windows的核心函式在命名上有個很好的特色,就是函式名都按其所在的層次或模組加上了特定的字首。了解了這些字首,看到乙個函式名就可以大致 知道這個函式所屬的層次和模組,主要的字首有:

ex:管理層,ex是executive的開頭兩個字母。

ke:核心層,ke是kernel的開頭兩個字母。

hal:硬體抽象層,hal是hardware abstraction layer的縮寫。

ob:物件管理,ob是object的開頭兩個字母。

mm:記憶體管理,mm是memory manager的縮寫。

ps:程序(執行緒)管理,ps表示process。

se:安全管理,se是security的開頭兩個字母。

io:i/o管理。

fs:檔案系統,fs是file system的縮寫。

cc:檔案快取管理,cc表示cache。

cm:系統配置管理,cm是configuration manager的縮寫。

pp:"即插即用"管理,pp表示pnp。

rtl:執行時程式庫,rtl是runtime library的縮寫。

不過並非所有的函式名都帶有這樣的字首,對字首的使用也並非十分嚴格。例如,核心層函式名的字首本應是ke,但是實際上有不少核心層函式名的字首是 ki,這些函式大都是與中斷有關的比較底層的函式。

有時候還在函式名的字首後面加上小寫字母f,表示這個函式是快速呼叫函式。例如:

ntkernelapi long_ptr fastcall obfdereferenceobject(in pvoid object);

這裡的型別說明fastcall向編譯工具表明這是個快速呼叫函式,函式名字首後面加上f則使人一看見函式名就知道這是個快速呼叫函式。一般的函式 呼叫是通過堆疊傳遞引數的,而快速呼叫函式則通過ecx等暫存器傳遞引數,因為避免了幾個堆疊操作而使效率有所提高。當然,這裡的說明fastcall是 必需的,否則編譯工具不知道應該通過暫存器傳遞引數,而在函式名中加上f則只是為了增加程式的可讀性。

上面所說的是c語言程式中的函式名,如果是在組合語言中,則需要在函式名前面再加上字首"_",並加上表示引數個數的字尾。例如,函式名 rtlzeromemory()出現在匯程式設計序中就是_rtlzero memory@8 。 為什麼是@8呢?這是因為這個函式有兩個引數,一共是8個位元組。之所以如此,是因為gcc在編譯c語言程式而生成彙編**時就會作這樣的轉換。

如果是快速呼叫函式,則又與普通的函式名有所不同。例如kflowerirql()是個快速呼叫函式,這個函式名出現在匯程式設計序中時則變成 @kflowerirql@4。這裡的字首@表示這是快速呼叫函式,字尾的@4則表示這個函式帶有4個位元組的引數,即乙個引數。當然,這是通過暫存器(因 為只有乙個引數,所以是ecx)傳遞的引數,而不是通過堆疊傳遞的引數。

按理說,kflowerirql()是核心層的函式,又是快速呼叫,因而其函式名的字首應該是kef,但是實際用的卻是kf,所以這些字首的使用並 不嚴格。讀者也許懷疑,是否reactos的人不守規矩?其實不然,因為在別的資料中也看到過這個函式名。

Windows核心函式的命名

windows核心情景分析 採用開源 reactos 上 下冊 本書通過分析reactos的源 介紹了windows核心各個方面的結構 功能 演算法與具體實現。本小節為大家介紹windows核心函式的命名。ad 1.5 windows核心函式的命名 windows的核心函式在命名上有個很好的特色,就...

Windows核心函式的命名

windows核心情景分析 採用開源 reactos 上 下冊 本書通過分析reactos的源 介紹了windows核心各個方面的結構 功能 演算法與具體實現。本小節為大家介紹windows核心函式的命名。ad 1.5 windows核心函式的命名 windows的核心函式在命名上有個很好的特色,就...

windows 核心函式字首解析

1.對於ring3 api主要由 kernel32.dll,user32.dll等dll匯出函式,2.對於核心函式,由ntoskrnl.exe匯出。可以直接用ida載入,在export欄中察看 可使用搜尋欄搜尋函式 注意 文件化 在export顯示的函式,說明函式已匯出,在wdk文件中,可查詢到的函...