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文件中,可查詢到的函...