深入淺出windows驅動開發

深入淺出windows驅動開發

《深入淺出windows驅動開發》是2011年3月電子工業出版社出版的圖書,作者是張佩、馬勇、董鑒源。

基本信息

內容簡介

本書是作者根據多年的工作學習經驗,總結的第一手驅動開發資料。本書更多的是經驗之談,一些實踐中的小發現小意外,頗為書中內容添彩。本書的特色之一,是對WDF框架做了較多的切入。

本書是作者根據多年的工作學習經驗,總結的第一手驅動開發資料。本書更多的是經驗之談,一些實踐中的小發現小意外,頗為書中內容添彩。

本書的特色之一,是對WDF框架做了較多的切入。本書第一個主要內容是(第3~7章)圍繞WDF而展開討論,側重點各有不同。第3章以框架為討論的中心;第4、5兩章以WDF框架開發USB和1394驅動;第6章講述核心C++編程,也以WDF框架為藍本;第7章講述WDF驅動的測試和調試。

第二個主要內容是關於音視頻驅動開發(第10~11章)。音視頻驅動包括AVStream架構,本書做了較詳細的闡述。第10章講述使用AVStream小連線埠架構,第11章講述ASIO音頻驅動開發。

第三個主要內容是關於設備驅動安裝(第12~14章)。第12章講系統安裝模組,從總體角度闡述系統和設備驅動如何配合完好地進行工作;第13章講述INF安裝檔案的細節,包括各個域的作用,以及諸多安裝指令的使用。第14章講如何編寫驅動安裝軟體。

剩餘的一些章節,分別是關於驅動入門(第1、2章)、Windbg調試命令(第8章)、核心同步(第9章)等內容。

本書適合一般入門級核心程式設計師,對WDF有興趣,準備開發USB或1394設備驅動者,本書尤其有用。本書對於入行較久,經驗豐富的程式設計師,也具有一定的參考價值。

媒體推薦

這本書《竹林蹊徑——深入淺出Windows驅動開發》是三位作者張佩、馬勇和董鑒源的最新力作,他們將自己在實踐中積累起來的經驗整理成冊,以期望後學者能少走彎路,縮短Windows驅動程式開發的學習之路。這本書重點介紹了KMDF、USB/1394和音頻驅動程式的開發,以及設備驅動程式的發行和安裝。建議有一定Windows驅動程式開發基礎的讀者看一看這本書,尤其是,如果你正打算使用KMDF,或者正在從事與USB/1394或音頻驅動程式相關的編程工作,那么,這本書便是一份寶貴的實踐指導了。

——潘愛民 《Windows核心原理與實現》作者

很高興看到又有一本原刨的驅動開發書籍即將出版,儘管這方面的書已經有一些,但還有很多主題未被覆蓋到,這本書比較詳細地討論了使用C++開發驅動、音頻驅動、核心流等其他書籍很少涉及的話題,填補了這些方面的空白,特此推薦!

——張銀奎《軟體調試》作者

張佩是我在“驅動開發”這個圈子裡的好朋友,他也是我知道國內做WDF驅動程式最早的程式設計師之一,我們經常討論驅動開發的知識。Windows驅動開發屬於底層開發,所以變化一直都不太大。然而從WDM框架到WDF框架是變化最“激烈”的一次。現在知名廠商的驅動程式都從WDM框架遷移到WDF框架下。這本書應該是國內第一本詳細介紹WDF框架的書籍,當我第一次讀完初稿後的確有醍醐灌頂的快樂。希望這本書能帶領更多的驅動程式愛好者進入這個領域。

——張帆《windows驅動開發技術詳解》作者

作者簡介

張佩,1982年出生於江中小島江蘇揚中,工作後一直從事核心驅動開發。初學頗難,至今仍顯躑躅,深憾未能窺出系統全貌,而吭吭努力不斷。學習過程中,得到朋友無私幫助頗多,有所心得後,亦樂於作文、評說,以傳播給更多的愛好者——此書由此而來。目前就職於AMD上海研發中心。

馬勇,網名znsoft,驅動開發網創始人。專注於檔案系統驅動研究,擅長文檔透明加密相關技術及軟體架構設計。從事驅動開發及研發管理工作十數年,目前就職於鎧信安全實驗室。

董鑒源,C/C++、彙編程式設計師。1986年生於山東。大學畢業後從事各類系統軟體的開發設計工作。目前在濟南從事Windows核心方面的開發工作。愛好讀書、文學、圍棋和武術等,對編寫作業系統尤為痴有幸參與本書部分基礎章節的編寫。

推薦序一

我一直認為,編寫程式是一件很奇妙的事情,它可以帶來創造和控制的欲望。每當我閱讀或者編寫一段代碼時,腦子裡自然地就會想像這段代碼怎樣完成預定的邏輯。當面對一個不熟悉的開發環境,或者一個新的基礎平台時,首先要清楚這個環境或者平台是如何工作的,以及提供了哪些功能。代碼本身可能非常複雜,甚至奧妙無窮,但通常情況下,真正優美的高質量代碼往往是簡單的、易於理解的。對於代碼編寫者或者維護者來說,真正見功夫的地方不在於代碼本身,而在於對下層開發平台的理解和駕馭能力,可能這就是俗稱的“內功”。

這個觀點既適用於套用軟體程式設計師,也適用於系統軟體程式設計師。對於套用軟體程式設計師,低層的套用開發平台是支撐套用開發的基礎,譬如,基於Windows SDK來開發Windows應用程式。那么,程式設計師有必要理解Windows SDK中的基本要素,諸如訊息分發機制、各種圖形功能等。在這種情況下,閱讀一些典型的例子程式代碼往往能起到快速引領入門的效果。同樣地,C/C++程式設計師如果局限於C/C++語言本身,很難編寫出高質量的實用程式。他們不僅要掌握C/C++運行庫中函式和類型的用法,甚至還要理解這些函式和類型的實現機理。即使原始碼層面上的庫,例如STL(C++的標準模板庫),也需要理解其代碼實現才能靈活自如地用好這些庫(比如STL中的各種容器數據結構、疊代器或算法)。

那么,對於系統軟體程式設計師,“內功”是什麼呢?系統軟體是指作業系統本身或者依附於作業系統上為套用軟體提供服務的軟體。系統軟體可能有機會跟硬體直接打交道,這賦予了程式設計師更強的控制能力,他們有機會介入作業系統的行為邏輯,甚至改變作業系統的行為特性。但隨之而來的是對系統軟體代碼的更高要求。現代作業系統為套用軟體提供了很強的容錯能力,應用程式的失敗通常不會波及到作業系統自身的穩定性,但作業系統對系統軟體的容錯能力卻比較有限,畢竟系統軟體運行起來之後可能被融入到作業系統的執行邏輯中成為作業系統的一部分。因此,理解和掌握作業系統的運行機製成為系統程式設計師編寫出正確、高效的系統軟體的基本前提。所謂“內功”,便著落在此。

在Windows平台上開發軟體,編寫Windows核心驅動程式是最為考驗程式設計師“內功”的。核心驅動程式的代碼量通常不大,但驅動程式框架中的任何一個函式,甚至這些函式中任何一行代碼背後都可能蘊含著複雜的邏輯,或者隱式的要求和假設。即使驅動程式編寫者在純粹自行定義的函式中,也必須謹慎地關注一些與環境有關的因素,譬如代碼是否可被中斷、是否可重入,或者所引用的記憶體是否被交換到外存。另一方面,套用軟體開發中的很多概念,比如地址空間、記憶體管理、異常處理和多執行緒並發等,在驅動程式開發中可能需要有不同的理解方法。此外,常用的C運行庫函式基本上不再適合於驅動程式了,驅動程式編寫者必須面對一個全新的底層環境和支持平台。因此,要編寫可正確運行的驅動程式,程式設計師不僅要清楚地理解驅動程式所針對的目標設備或功能(可能包括硬體設備的各種特性),還要掌握Windows核心是如何與驅動程式打交道的,以及核心中諸多管理和運行機制,尤其是記憶體管理、執行緒調度和並發控制。

當Windows核心驅動程式被載入到核心中並且啟動以後,它們變成了Windows核心的一部分,驅動程式中的接口函式在恰當的時刻被核心調用,這是Windows驅動程式的基本工作方式。Microsoft定義了WDM(Windows驅動程式模型)來規定驅動程式的結構,以及Windows核心如何與WDM驅動程式打交道。WDM不僅包括I/O管理器定義的驅動程式框架,還定義了在驅動程式中如何支持PnP(Plug and Play,即插即用)、電源管理和WMI(Windows Management Instrumentation,Windows管理規範)。因此,若要編寫一個完全支持WDM的驅動程式,也需要理解WDM中所涉及的各個核心組件。

Windows核心驅動程式與核心的緊密關聯性使得驅動程式的調試極為不方便,從某種意義上講,驅動程式的調試等同於Windows核心的調試。而且,對於某些特定的邏輯錯誤,核心調試器甚至是無能為力的。正因為這個原因,核心驅動程式的代碼儘可能精簡,從軟體設計角度而言,應最大程度地把功能代碼放到應用程式中,在驅動程式中只留下最必要的功能邏輯。這樣的設計也可以使Windows核心被不正確驅動程式代碼牽連而導致穩定性問題的幾率相對減小。

為了便於Windows驅動程式的開發,Microsoft定義了一個驅動程式框架,稱為WDF(Windows Driver Foundation),其中針對核心驅動程式的部分稱為KMDF(Kernel-Mode Driver Framework)。KMDF實際上是一個庫,它封裝了WDM中一些基本的代碼邏輯,從而使程式設計師可以更加方便地編寫出WDM驅動程式。KMDF可以部分地簡化Windows核心驅動程式的開發任務,但是本質上它並沒有降低核心驅動程式的複雜性,甚至需要程式設計師付出額外的學習努力。

總而言之,作為一名系統程式設計師,你需要洞悉目標作業系統中與你的軟體打交道的各個部件,也要非常清楚地知道你所依賴的開發工具是如何幫助你做到這一點的。系統程式設計師往往面臨著比應用程式員更長的學習曲線,但是,系統程式設計師從編寫程式中獲得的樂趣也是在套用層上難以體會得到的。我相信,當你發現自己編寫的軟體模組已經與作業系統核心融為一體時,那一刻你的感覺一定是手心裡攥著一個作業系統——作業系統盡在你的掌控中了。

這本書《竹林蹊徑——深入淺出Windows驅動開發》是三位作者張佩、馬勇和董鑒源的最新力作,他們將自己在實踐中積累起來的經驗整理成冊,以期望後學者能少走彎路,縮短Windows驅動程式開發的學習之路。這本書重點介紹了KMDF、USB/1394和音頻驅動程式的開發,以及設備驅動程式的發行和安裝。建議有一定Windows驅動程式開發基礎的讀者看一看這本書,尤其是,如果你正打算使用KMDF,或者正在從事與USB/1394或音頻驅動程式相關的編程工作,那么,這本書便是一份寶貴的實踐指導了。

潘愛民

2010年12月5日於北京西二旗

推薦序二

我認識一個共享軟體的作者,近十年來都在開發他的虛擬光碟機的軟體,不時給這個軟體添加一點新的東西。我對此覺得很奇怪,對他說,我覺得虛擬光碟機是一個很簡單的東西。用一個映象檔案容納光碟上的數據,並開發一套驅動接口讓系統以為這是一個光碟機。下載網上開源的代碼,應該不超過5000行。為什麼他要為此耗費這么多年的精力呢?

他舉了個例子說:國外知名的虛擬光碟機Daemon,它的強項在於兼容性。幾乎任何軟體都能正常使用它的虛擬光碟機,並當做真正的光碟機來訪問。而普通的開源的虛擬光碟機,就有很多不支持了。

他曾經發現一種遊戲,要求用戶插入光碟。用他自己編寫的虛擬光碟機來模擬,總是不行。同樣的映象檔案,換了Daemon就一切OK。這讓他大為詫異。碰到這樣的情況,他根本就不可能到網上去搜尋“為何我的虛擬光碟機不支持某某遊戲”這樣的傻問題,也不可能在某處找來一段代碼拷貝一番就解決。他必須找到問題的實質,才能找到對策。

花去漫長的時間,最終分析的結果是,原來因為該遊戲希望每個用戶都購買正版光碟,它就用了一種特殊的策略來分析用戶所用的是不是真實的光碟機。大家都知道硬碟的讀取速度一般都比較快,而且事實上也更加穩定。光碟機讀盤的速度比硬碟相對慢一些,而且讀取數據的速度有一定的不穩定性。比如說,數據讀取的速率可能會以某種數學模型所定義的曲線為軌跡發生波動。而這個軟體就根據這種不穩定性的匹配程度來進行檢查。如果虛擬光碟機提供的數據是不匹配這種特徵的,則它很簡單地禁止遊戲繼續運行。

而Daemon則在內部插入了這樣的模擬函式,有意對數據的讀出進行各種延時的處理,使之看上去非常像真實的光碟機讀出的數據。

總而言之,他開發的是一個逼近世界頂尖品質的好東西。當然代價是汗水與時間。

我能想像到在沒有任何公開的代碼,或者是前人的經驗指引,自己去鑽研發現並解決這些問題的困難。能在網上找到解決方案的問題必定不會是軟體技術里的關鍵問題。相反是這樣一個一個的無頭懸案,才構成了程式設計師們所謂的“核心技術”。

我和一些人的見解不同。我並不認為越底層的技術就越“核心”。總有人認為系統比軟體底層,所以程式更“核心”。而晶片比程式更底層,則晶片又更“核心”。其實矽片比晶片更底層,沙子又比矽片更底層,那是不是沙子才是最核心的技術呢?

我認為,在任何一個領域裡,能夠進行持之以恆的鑽研,當大部分人選擇放棄,而你依舊鍥而不捨地學習、研究、解決一個又一個實際問題,你就能掌握核心技術。簡言之,善於把握自己能夠掌握的知識,並不斷深化拓展知識領域,這才是真正的學習之道,也是成就個人和團隊核心技術的途徑。

我見到一些工作過多年的人,很有特點。有一種號稱對技術沒興趣,更喜歡做管理,但其實並沒有那么多做管理的機會,或者真的有機會,而做得也並不理想;有一種全憑在新手面前吹牛皮支撐老資格,實際編程依舊一塌糊塗。我從來不對別人妄加評論,但從技術學習上講,他們都算是沒到家。

《竹林蹊徑——深入淺出Windows驅動開發》終於出版了。據我了解,張佩因寫作這本書,在家伏案了半年。他是憑著極大的熱情和信念去寫作的,否則即便薪資上的損失都很值得惋惜。就本書而言,先不去考量書中內容的深淺,技術的精粗,僅就作者的誠心和寫作精神,便值得稱讚。

牛不是一天吃大的,小牛雛要不斷地吃進養料,才能變成大牛。牛人要有牛技術,牛的技術,就是核心技術。我希望這本書的每一位讀者,不管你現在或是將來,做的是套用開發還是核心編程,不管用的是C++還是Java或.NET,在工作、學習過程中都具有鍥而不捨、精益求精的精神,哪怕最菜鳥的新手,在若干年的積累和沉澱後,都能夠逐漸形成自己的核心技術。只有掌握了自己的核心技術,才能進入程式設計師的自由天地。

此文送給《竹林蹊徑——深入淺出Windows驅動開發》的讀者,是為序。

譚文

2010年12月10日

圖書目錄

向核心世界說一聲:hello,我來了。如果你是一個初學者,並對這個世界充滿好奇心,請從這一章開始,我們一起打招呼~

第1章 Hello World驅動 1

1.1 從Hello World開始 2

1.1.1 HelloDRIVER 4

1.1.2 代碼解釋 8

1.1.3 驅動程式的編譯和安裝 11

1.1.4 查看我們的驅動 14

1.2 虛擬環境 15

1.2.1 使用虛擬環境進行驅動開發 15

1.2.2 使用VMware虛擬機 15

1.2.3 目標機設定 16

1.2.4 Virtual PC虛擬機 18

1.3 小結 19

如何在規範的商業環境中,開發成功而有效的驅動軟體?驅網站長馬勇(ZnSoft)將向你娓娓道來。你會學到這些內容:建立一個簡單而有效的開發、調試環境;64位環境下的核心編程技巧;如何發布你的驅動軟體。

第2章 商業驅動開發技術 20

2.1 建立開發調試環境 21

2.1.1 SVN環境 21

2.1.2 創建工程,導入SVN 23

2.1.3 建立符號伺服器 25

2.1.4 用符號調試 27

2.2 64位驅動開發技術 34

2.2.1 64位驅動編寫技術 35

2.2.2 32位應用程式與64位驅動混合模式 36

2.3 驅動程式的發布與測試 42

2.3.1 驅動程式簽名 42

2.3.2 驅動程式測試 46

2.3.3 WHQL 49

2.4 小結 50

WDF是目前最新的驅動編程框架。當很多核心程式設計師還緊抱WDM的巨大佛腳時,千萬要記住,WDF已是大勢所趨。本章介紹了WDF最重要的幾個概念,並進行了一定程度的深度挖掘。對於WDF框架的三大核心模型:對象模型、事件模型、PNP/Power模型,本章作了重點講述。

第3章 WDF概述 51

3.1 主要特點 52

3.2 框架視圖 53

3.3 兼容性 55

3.4 對象模型 56

3.4.1 對象和句柄 59

3.4.2 引用計數 60

3.4.3 上下文空間 61

3.4.4 PME接口 67

3.4.5 DDI接口 69

3.4.6 父子關係 76

3.4.7 對象同步 77

3.5 驅動對象和設備對象 78

3.5.1 驅動對象 78

3.5.2 驅動入口DriverEntry 81

3.5.3 設備對象 84

3.5.4 創建設備對象 85

3.5.5 設備棧 86

3.6 IO模型 88

3.6.1 IO目標對象 88

3.6.2 IO目標對象的細節 90

3.6.3 安全的緩衝區 93

3.6.4 記憶體對象(一) 96

3.6.5 記憶體對象(二) 98

3.6.6 框架和IO請求 102

3.6.7 更詳細的處理流程 103

3.6.8 IO請求參數 105

3.6.9 佇列 107

3.6.10 創建IO請求 110

3.7 PNP和電源模型 112

3.8 小結 115

使用WDF框架開發USB驅動,方便且簡單。本章首先總體上從硬體和軟體兩個方面介紹USB相關知識點,包括設備的電氣特性、匯流排結構、USB驅動類型以及類驅動。編程方面,從USB設備初始化、數據操作以及設備控制等幾個方面來講解,透徹並且翔實。

第4章 WDF USB設備驅動開發 116

4.1 USB設備硬體結構 117

4.1.1 主從結構 117

4.1.2 硬體拓撲 118

4.1.3 USB中斷 119

4.2 USB軟體結構 120

4.2.1 匯流排驅動 120

4.2.2 系統類驅動 121

4.2.3 功能驅動 122

4.2.4 父驅動與混合設備 122

4.2.5 過濾驅動 125

4.2.6 USB驅動棧、設備棧 125

4.3 核心開發 127

4.3.1 設備驅動 127

4.3.2 入口函式 128

4.3.3 USB描述符 129

4.3.4 描述符介紹 130

4.3.5 匯總舉例 133

4.3.6 讀取描述符 135

4.3.7 初始化 137

4.3.8 設備初始化函式 138

4.3.9 創建設備對象 141

4.3.10 設備命名、符號連結 143

4.3.11 啟動設備 147

4.3.12 創建佇列 156

4.3.13 停止設備/反初始化 158

4.4 數據I/O操作 160

4.4.1 USB控制命令 160

4.4.2 構造並傳送控制命令 162

4.4.3 讀USB中斷連線埠 163

4.4.4 連續讀操作 165

4.4.5 數據處理函式 166

4.4.6 中斷連線埠的效率 167

4.4.7 讀/寫批量連線埠 168

4.5 設備控制 171

4.5.1 關於I/O Target對象 171

4.5.2 獲取USB版本 172

4.5.3 管道重置 174

4.5.4 設備重置 176

4.5.5 管道中止與終止 177

4.6 用戶程式 179

4.6.1 核心讀/寫 179

4.6.2 控制命令 179

4.7 小結 180

1394俗稱火線。大夥平時最多接觸它的地方大概是核心調試時,藉助1394卡進行雙機互聯。本章首先從硬體方面介紹了1394的知識,它的匯流排結構很特別,極具可擴性,能非常方便地在各種類型的1394設備之間建立數據鏈路。核心編程方面,本章重點講解了數據通信相關知識,分為異步通信和同步通信兩種方式,頗為複雜,相對難於掌握,但套路是現成的,變化的東西不多,可以熟能生巧。本章最後介紹了1394雙機互聯的原理,有興趣的讀者可參考之。

第5章 WDF 1394驅動開發 181

5.1 1394一席談 182

5.1.1 版本情況 183

5.1.2 電源特性 183

5.1.3 1394卡 183

5.1.4 匯流排拓撲 184

5.2 傳送請求 186

5.2.1 同步方式 187

5.2.2 異步方式 189

5.2.3 對WDM的回憶 191

5.3 匯流排重置與計數 193

5.3.1 匯流排重置 193

5.3.2 設定重置回調 193

5.3.3 計數更新 194

5.4 PNP操作 195

5.5 異步通信 196

5.5.1 地址範圍 197

5.5.2 異步讀 200

5.5.3 異步寫 201

5.5.4 異步鎖請求 202

5.5.5 數據流 203

5.6 等時通信 204

5.6.1 申請頻寬 205

5.6.2 釋放頻寬 206

5.6.3 等時通道 206

5.6.4 資源句柄 207

5.6.5 緩衝區掛載 210

5.6.6 緩衝區解掛 211

5.6.7 開始傳輸 211

5.6.8 停止傳輸 212

5.6.9 其他等時操作 213

5.7 其他操作 213

5.7.1 設備配置 213

5.7.2 獲取控制器信息 214

5.7.3 速度信息 215

5.7.4 廠商自定義命令 216

5.8 安裝與測試 216

5.8.1 1394虛擬設備 216

5.8.2 創建虛擬設備 218

5.8.3 示例代碼 219

5.8.4 安裝與測試 221

5.9 小結 222

核心天生適合於C語言編程,但越來越多的核心項目,規模達到10數萬的規模。在這種情況下,人們不由地會將目光投向優雅的C++語言。總體上說,C和C++是至親好友,核心中使用C++本不應有什麼大問題,但有幾個暗礁潛伏已久,不小心的程式設計師,你可千萬不要觸礁。

第6章 核心驅動C++編程 223

6.1 驅動中的類 224

6.1.1 一個簡單的例子 224

6.1.2 new/delete 225

6.1.3 extern "C" 227

6.1.4 全局/靜態變數 228

6.1.5 棧的憂慮 230

6.2 類封裝的驅動程式 233

6.2.1 尋找合適的存儲所 233

6.2.2 類方法與事件函式 235

6.2.3 KMDF驅動實現 236

6.2.4 WDM驅動實現 237

6.3 多態 238

6.3.1 基類、子類 238

6.3.2 實現多態 239

6.3.3 測試 241

6.4 小結 241

使用WDF框架編寫的驅動程式,在測試和調試的時候,有特殊的工具。本章介紹了目前所知的三個,它們分別是:Windbg擴展調試命令、WDFTester測試工具、WDFVerifier測試工具。本章將以示例方式,介紹這些工具的使用。

第7章 WDF驅動測試 242

7.1 WDF錯誤 243

7.1.1 實例分析 245

7.1.2 USB錯誤 246

7.2 WDF擴展調試命令 247

7.3 WDFTester 254

7.3.1 WDFFiTester 254

7.3.2 使用 256

7.3.3 WDFCallTracer 260

7.4 WDFVerifier 263

7.4.1 識別KMDF驅動 263

7.4.2 使用與介紹 265

7.5 小結 266

SoftIce漸行漸遠之後,Windbg成為核心調試的第一利器。使用Windbg的最大難點是命令繁多,參數複雜。本章以總結歸納的形式,介紹了作者在工作中經常用到的幾大類調試命令,並以實例形式一一介紹。作者根據個人經驗所作的分類,未能全備,但能夠保證的是,所有實例翔實而可靠,可以作為可信的參考。

第8章 調試命令詳解 267

8.1 概述 268

8.1.1 尋求幫助 269

8.1.2 DML語言 270

8.1.3 基本信息 271

8.1.4 基本設定 272

8.1.5 格式化顯示 273

8.1.6 開始調試 273

8.2 符號與源碼 276

8.2.1 模組列表 277

8.2.2 模組信息 279

8.2.3 符號路徑 280

8.2.4 符號載入 283

8.2.5 符號搜尋 285

8.2.6 源碼命令 287

8.3 進程與執行緒 289

8.3.1 進程命令 289

8.3.2 執行緒命令 292

8.3.3 異常與事件 296

8.3.4 局部變數 300

8.3.5 顯示類型 301

8.4 斷點 301

8.4.1 軟體斷點 301

8.4.2 硬體斷點 303

8.4.3 其他操作 303

8.5 記憶體命令 304

8.5.1 查看記憶體 304

8.5.2 記憶體信息 307

8.5.3 其他命令 311

8.6 小結 312

相信大多數人在學習核心開發的時候,都問過這樣一個問題:核心驅動怎么向用戶程式傳送訊息,或者如何調用Win32函式。用戶程式和核心同步,是一個基本而重要的知識,本章介紹了三種主要的實現方式。至於核心是否可以調用Win32函式,讀一讀本章開篇的話,你就有答案了。

第9章 核心同步 313

9.1 關於核心同步 314

9.2 核心事件同步 316

9.2.1 原理 316

9.2.2 用戶程式 318

9.2.3 核心實現 319

9.3 IRP同步 320

9.3.1 用戶程式 321

9.3.2 核心實現 323

9.4 WMI同步 325

9.5 數據緩衝區同步 326

9.6 反向調用 328

9.7 小結 330

微軟最新的音視頻編程框架即AVStream框架,不管從什麼方面來說,音視頻編程都是一個很小眾的領域。AVStream框架極其複雜,個人看法是掌握的難度超過了WDF。本章介紹了AVStream框架的各種基本知識點,並以實例講解一個核心音頻過濾器在系統中是如何工作的。

第10章 音頻驅動開發 331

10.1 簡介 332

10.1.1 音頻模組架構 332

10.1.2 系統中的音頻設備 334

10.2 AVStream對象 338

10.2.1 設備對象 339

10.2.2 Filter工廠和Filter對象 340

10.2.3 Pin工廠和Pin對象 342

10.2.4 Node對象與Connection結構體 343

10.3 AVStream描述符 346

10.3.1 描述符簡介 346

10.3.2 描述符示例 347

10.3.3 分發函式表 349

10.3.4 自控表 349

10.3.5 自控表示例 351

10.4 代碼講解 355

10.4.1 入口函式 355

10.4.2 設備分發函式 357

10.4.3 Filter與Pin分發函式 358

10.4.4 創建和刪除 359

10.4.5 數據處理 360

10.4.6 數據格式 362

10.5 自控表函式 364

10.5.1 事件函式 364

10.5.2 屬性函式 366

10.5.3 方法函式 367

10.5.4 用戶接口 367

10.6 硬體操作 370

10.6.1 數據DMA 370

10.6.2 AVStream中的DMA實現 371

10.6.3 談談ISR 374

10.7 安裝與測試 376

10.7.1 安裝 376

10.7.2 測試工具 376

10.8 小結 379

ASIO音頻驅動具有兩個非常亮眼的優點:低延遲、多通道。低延遲能夠達到幾毫秒,使得最靈敏的耳朵也難也察覺;多通道則讓通常的雙聲道、6.1聲道等一齊歇菜,而可以很輕鬆地讓多達十幾、幾十個聲道同時工作,在進行高級音頻編輯時,這非常重要。

第11章 ASIO虛擬音效卡 380

11.1 引言 381

11.2 關於ASIO 383

11.3 ASIO用戶驅動 384

11.3.1 COM接口 384

11.3.2 安裝與卸載 386

11.3.3 IASIO接口 387

11.3.4 技術核心 390

11.3.5 計算延遲 392

11.4 核心驅動實現 393

11.4.1 同步 393

11.4.2 原理 393

11.4.3 實現 396

11.5 ASIO音頻軟體 396

11.6 小結 397

從本章開始的三章內容,講的都是“驅動安裝”這個話題。在本章中,介紹了系統中和驅動安裝有關的各種系統模組。讀者通過閱讀本章後,至少能夠掌握這兩個基本知識:系統如何識別一個舊設備,並為它載入合適的驅動檔案;系統如何發現一個新設備,並完成驅動安裝。

第12章 設備驅動安裝入門 399

12.1 基礎知識預介 400

12.1.1 設備類型 400

12.1.2 設備實例ID 401

12.1.3 驅動載入和安裝 403

12.2 安裝模組 404

12.2.1 核心PNP管理器 405

12.2.2 用戶PNP管理器 406

12.2.3 安裝接口函式(Setup API) 408

12.2.4 配置管理器接口(CfgMgr API) 410

12.2.5 類安裝器(Class Installers) 410

12.2.6 類協安裝器(Class Co-Installers) 410

12.2.7 設備協安裝器(Device Co-Installers) 411

12.2.8 驅動包(Driver Package) 412

12.2.9 驅動倉庫(Driver Store) 413

12.2.10 設備管理器(Device Manager) 414

12.2.11 安裝程式 415

12.2.12 新設備嚮導 416

12.2.13 添加硬體嚮導 416

12.2.14 驅動安裝器(Driver Installer) 416

12.3 重要問題 417

12.3.1 尋找和選擇 417

12.3.2 32位與64位系統兼容 418

12.3.3 系統重啟 419

12.4 安裝模式 420

12.4.1 示例1:客戶端模式 421

12.4.2 示例2:伺服器模式 423

12.5 安裝器編程 424

12.5.1 DIF碼 424

12.5.2 處理流程 427

12.5.3 工程示例 429

12.5.4 註冊 430

12.6 小結 431

INF檔案即驅動程式的“安裝檔案”,它包含了各種與驅動安裝有關的指令信息。通過INF檔案,系統知道如何處理驅動包中的各個檔案,並在系統註冊表中做出準確記錄。本章主要從指令和域,這兩個方面進行講解。

第13章 深入解析INF檔案 432

13.1 概述 433

13.1.1 域 433

13.1.2 指令 434

13.1.3 多系統 435

13.2 註冊表指令 436

13.2.1 縮寫根鍵 436

13.2.2 軟體鍵 437

13.2.3 硬體鍵 437

13.2.4 AddReg 438

13.2.5 DelReg 440

13.2.6 BitReg 441

13.3 檔案操作指令 441

13.3.1 CopyFiles 441

13.3.2 DelFiles 443

13.3.3 RenFiles 443

13.4 服務指令 444

13.4.1 AddService 444

13.4.2 DelService 445

13.5 基本域 446

13.5.1 版本域 446

13.5.2 檔案域 447

13.5.3 默認安裝域 451

13.5.4 控制域 454

13.5.5 字元串域 457

13.6 設備類安裝域 458

13.6.1 主域 459

13.6.2 服務子域 461

13.7 接口類安裝域 461

13.8 廠商/產品域 462

13.8.1 廠商域 463

13.8.2 產品域 464

13.9 設備安裝域 464

13.9.1 硬體子域 466

13.9.2 協安裝器子域 467

13.9.3 接口子域 468

13.9.4 廠商默認配置子域 469

13.9.5 邏輯優先配置子域 470

13.10 ChkInf介紹 471

13.11 小結 472

驅動安裝程式讓你的驅動軟體顯得更加專業,所以,放棄手動安裝驅動的做法吧,你的驅動將顯得更靚。本章的示例軟體MyDrvInst,可以作為讀者設計更漂亮的安裝軟體的開始。

第14章 設計驅動安裝程式 473

14.1 驅動包 474

14.1.1 安裝方式 474

14.1.2 安裝驅動包 475

14.1.3 卸載驅動包 476

14.2 驅動更新 477

14.2.1 設備已連線 477

14.2.2 設備未連線 478

14.2.3 枚舉系統設備 481

14.3 分析INF檔案 484

14.3.1 函式介紹 484

14.3.2 列印設備ID 486

14.4 MyDrvInst介紹 487

14.5 製作軟體安裝包 490

14.5.1 視圖介紹 490

14.5.2 我們的工程 492

14.5.3 編譯執行 493

14.6 小結 494

附錄A CY001 USB開發板 495

附錄B VisualKD + VMWare實現單機核心調試 501

相關詞條

相關搜尋

熱門詞條

聯絡我們