Windows高级编程学习笔记(一)
寫在前面的話
之前學的Windows編程都是界面啊、網絡編程啊之類的純應用層面的東西,總是感覺而自己沒有達到自己期望中的水平。什么水平呢?如果讓你編寫監控系統資源的工具,或者DLL注入相關軟件,或者底層安全軟件,可以勝任嗎?我的答案是,并不會。所以,離目標還很遠,得繼續學。
此階段學習的是Windows高級編程,期間也了解了點內核驅動開發。后者是更深層次的研究,主要研究編寫運行在ring0層的內核程序,難度更高,是達到我期望的技術水平的努力方向。現階段還是先攻克Windows高級編程,步步為營,讀書,練習,做筆記,打好基本功。
主要的參考書是:
- 《Windows高級編程指南(第三版)》, [美] Jeffrey Richter.
好,開始今天的學習。
因為第一章說的是win32與操作系統版本之間的相關事項,所以這里略過。
第二章 內核對象
1、概念
不愧是高級編程,上來就談內核。
這一章中主要說了,一些重要的系統資源,是通過內核對象來管理的。比如進程。進程也是通過內核對象來管理的,但是進程的數據、代碼是放在用戶態內存里面的。注意突出理解兩個字:管理。
根據我的理解,畫出了下面的簡單的關系示意圖。主要需要明白句柄表的工作原理,系統是怎么通過句柄表來管理系統的內核對象的。這里只說學習方向,不詳細解析了,書上都有。
2、使用
只能通過API來創建、釋放內核對象。
內核對象通過內核句柄表來管理。應用程序中的句柄是內核對象在內核句柄表中的索引(書上說在NT中是字節數,這個沒有被文檔化,所以僅做理解,實際情況大差不差)。
每個內核對象有一個使用計數,也叫引用計數。多個進程使用同一個內核對象的話,每多一個使用者,使用計數+1。當進程結束時,操作系統為進程清理相關資源,挨個釋放內核句柄表中的對象。很顯然,這樣的機制能夠保證內核對象能被正確地創建、銷毀,很好地對內核對象進行了管理。
如果需要進程間共享內核對象的話,有幾種特定的方法。內核對象被設計成只能通過特定的方法訪問,這樣做是為了安全性考慮。第一章中介紹了進程間共享內核對象的幾種方法:
- 使用繼承,需要向子進程傳遞句柄值(進程間通信),特點是句柄值是相同的。
- 使用命名的對象。特點是句柄值是獨立的。
- 使用duplicateHandle,有特定的使用情景(需要多種已知條件),并不是更簡單的方法。
先大致了解原理,用到的時候,知道找什么代碼就行了。
另外需要提到的是安全描述符。剛開始看到這個東西,不知道它是用來干嘛的,看起來很煩(不知道你面對一串不知含義的參數還有沒有看下去的欲望)。看了其他的書籍后,消化了一段時間,現在是明白了它的用處。前面提到,內核對象的訪問是很注重安全性的。使用安全描述符就是內核對象的創建者用來告訴操作系統,我創建的這個東西誰能用,能怎么用(讀寫等)。原理就是這么簡單。
本章末尾那個實例說明了,duplicateHandle可以用于進程自己給自己復制句柄,這兩個不同的句柄指向同一個內核對象。使用情景是多線程中需要使用同一個內核對象,如何正確關閉句柄。
總結
以上是生活随笔為你收集整理的Windows高级编程学习笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信信用卡新快现没有相关权益 中信新快现
- 下一篇: 我国再减持6百多亿美国国债,还持有7万多