1. 程式人生 > >Windows高階程式設計學習筆記(一)

Windows高階程式設計學習筆記(一)

寫在前面的話

之前學的Windows程式設計都是介面啊、網路程式設計啊之類的純應用層面的東西,總是感覺而自己沒有達到自己期望中的水平。什麼水平呢?如果讓你編寫監控系統資源的工具,或者DLL注入相關軟體,或者底層安全軟體,可以勝任嗎?我的答案是,並不會。所以,離目標還很遠,得繼續學。

此階段學習的是Windows高階程式設計,期間也瞭解了點核心驅動開發。後者是更深層次的研究,主要研究編寫執行在ring0層的核心程式,難度更高,是達到我期望的技術水平的努力方向。現階段還是先攻克Windows高階程式設計,步步為營,讀書,練習,做筆記,打好基本功。

主要的參考書是:

  • 《Windows高階程式設計指南(第三版)》, [美] Jeffrey Richter.

好,開始今天的學習。

因為第一章說的是win32與作業系統版本之間的相關事項,所以這裡略過。

第二章 核心物件

1、概念

不愧是高階程式設計,上來就談核心。
這一章中主要說了,一些重要的系統資源,是通過核心物件來管理的。比如程序。程序也是通過核心物件來管理的,但是程序的資料、程式碼是放在使用者態記憶體裡面的。注意突出理解兩個字:管理

根據我的理解,畫出了下面的簡單的關係示意圖。主要需要明白控制代碼表的工作原理,系統是怎麼通過控制代碼表來管理系統的核心物件的。這裡只說學習方向,不詳細解析了,書上都有。

這裡寫圖片描述

2、使用

只能通過API來建立、釋放核心物件。

核心物件通過核心控制代碼表來管理。應用程式中的控制代碼是核心物件在核心控制代碼表中的索引(書上說在NT中是位元組數,這個沒有被文件化,所以僅做理解,實際情況大差不差)。

每個核心物件有一個使用計數,也叫引用計數。多個程序使用同一個核心物件的話,每多一個使用者,使用計數+1。當程序結束時,作業系統為程序清理相關資源,挨個釋放核心控制代碼表中的物件。很顯然,這樣的機制能夠保證核心物件能被正確地建立、銷燬,很好地對核心物件進行了管理。

如果需要程序間共享核心物件的話,有幾種特定的方法。核心物件被設計成只能通過特定的方法訪問,這樣做是為了安全性考慮。第一章中介紹了程序間共享核心物件的幾種方法:

  • 使用繼承,需要向子程序傳遞控制代碼值(程序間通訊),特點是控制代碼值是相同的。
  • 使用命名的物件。特點是控制代碼值是獨立的。
  • 使用duplicateHandle,有特定的使用情景(需要多種已知條件),並不是更簡單的方法。

先大致瞭解原理,用到的時候,知道找什麼程式碼就行了。

另外需要提到的是安全描述符。剛開始看到這個東西,不知道它是用來幹嘛的,看起來很煩(不知道你面對一串不知含義的引數還有沒有看下去的慾望)。看了其他的書籍後,消化了一段時間,現在是明白了它的用處。前面提到,核心物件的訪問是很注重安全性的。使用安全描述符就是核心物件的建立者用來告訴作業系統,我建立的這個東西誰能用,能怎麼用(讀寫等)。原理就是這麼簡單。

本章末尾那個例項說明了,duplicateHandle可以用於程序自己給自己複製控制代碼,這兩個不同的控制代碼指向同一個核心物件。使用情景是多執行緒中需要使用同一個核心物件,如何正確關閉控制代碼。