竹林蹊徑 深入淺出Windows驅動開發

2021-08-25 16:15:27 字數 3578 閱讀 6120

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

這個觀點既適用於應用軟體程式設計師,也適用於系統軟體程式設計師。對於應用軟體程式設計師,低層的應用開發平台是支撐應用開發的基礎,譬如,基於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或音訊驅動程式相關的程式設計工作,那麼,這本書便是乙份寶貴的實踐指導了。

潘愛民2023年12月5日於北京西二旗

驅網核心技術叢書

竹林蹊徑:深入淺出windows驅動開發

張佩馬勇董鑑源編著

isbn 978-7-121-12555-3

20112月出版

定價:69.00

16

532

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

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

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

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

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

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...

深入淺出ShellExecute

深入淺出shellexecute譯者 徐景周 原作 nishant s q 如何開啟乙個應用程式?shellexecute this m hwnd,open calc.exe sw show 或shellexecute this m hwnd,open notepad.exe c mylog.log...