windows學習進階

windows程序 經典書籍介紹 摘自:debugman

若干重要的Windows參考資料 要 讓Linux內核支持Windows應用程序和設備驅動,我們當然得要了解並理解Windows的各種機制和機理。本文的目的是爲大家介紹和推薦一些關於 Windows的參考資料。當然,對Linux的瞭解和理解更是必不可少,但是筆者以爲既然是行走於我們這個地界的人,對Linux想必自有一定的基礎, 所以Linux方面的參考資料這裏就不講了。 說到Windows的技術資料,微軟本身的各種SDK、DDK、以及MSDN網站上的資料當然是重要的,但是信息量太大。在筆者看來,微軟的資料數量之大 正是由於不公開源代碼。一件東西,放在透明的玻璃瓶裏,自然就不需要作太多的描述;而若封裝在一個黑盒子中,描述起來可就費勁了。微軟既不肯公開其源碼, 卻又想要別人在此基礎上開發各種第三方軟件,自然就得對其各種產品作黑盒子描述,“信息爆炸”就不可避免了。許多人見了微軟的資料就煩,是因爲這些資料只 告訴你“其然”而不告訴你“其所以然”。也有許多人很喜歡微軟的資料,是因爲這些資料就像使用手冊,所以“一抓就靈”。也難怪市面上有那麼多關於 Windows的各種“寶典”。讀微軟的資料可以使你成爲“很好的”工程師,卻不會使你成爲科學家。 不過,幸而還有一些書,在講述其然的同時還在講述其所以然。有趣的是,其中特別重要的幾本正是由微軟出版社組織和出版的。可見微軟自己也知道,光作黑盒子 描述,光讓人家知其然而不知其所以然,是不夠的,那樣很難成長起高質量的Windows軟件開發人員,反過來對微軟也不利。這跟奴隸主有時候也意識到該讓 奴隸們吃的壯實一些,是同一個道理。而對於我們,這些書的重要性就不言而喻了。

Windows參考書的首選當推Mark Russinovich和 David Solomon的“Microsoft Windows Internals”第4版,微軟出版社2005年版。我們只要簡單回顧一下這本書 的歷史,讀者就可體會到它的重要性。這本書的第一版由Helen Custer編寫,書名“Inside Windows NT”。第二版(1998年) 改由David Solomon編寫,由WinNT開發團隊的主任Lou Perazzoli作序。第三版(2000年)的書名改成 “Inside Windows 2000”,由David Solomon和Mark Russinovich共同編寫。到了第四版,書名又改成 “Microsoft Windows Internals”, 由Mark Russinovich和David Solomon共同編寫。尤其引人注目的是,第四版上有David Cutler寫的前言,題爲“Historical Perspective”,文中回顧了WinNT的由來。這位 David Cutler可不是等閒之輩,他是WinNT之父。就是他,當年把VMS的技術和(部分)人馬從DEC帶到了微軟。有個笑話很形象地說出了 WinNT和VMS之間的淵源關係:把“VMS”這三個字母的ASCII代碼每個都加1,就成了“WNT”。而David Solomon是 David Cutler在DEC就相識的老夥伴。正是David Cutler特許David Solomon可以自由翻看WinNT的源代碼。這種 “看”,跟把人請去住在旅館裏十天半個月、每天去微軟資料室看上幾個鐘頭的那種“雙規”下的“看”,當然有着天壤之別。所以,這本書應該說是一本權威著 作,書中所講應該認爲是有源代碼根據的。再說,這本書也確實讓人知其然並且知其所以然。當然,要是有源代碼就更好了,但是要知道那是微軟,能有如此這般就 很不錯了。在兼容內核的開發過程中,這本書無疑將在總體上起很大的指導作用。

第二本書是Walter Oney的 “Programming the Microsoft Windows Driver Model”第2版, 微軟出版社2003年版。這本書對微軟的 WDM設備驅動模型(即框架)作了深入的介紹。微軟要求從Win2k開始的設備驅動模塊都符合WDM的要求。與傳統的WinNT設備驅動相比,WDM要求 設備驅動模塊都支持PnP(即插即用)、電源管理(不用時可轉入省電模式)、以及WMI (Windows Management Instrumentation,意爲Windows管理手段,是微軟版的WBEM實現)。所以,這本書所介紹的是新的Window設備驅動框架的設計與 實現,附帶着也介紹了設備驅動界面上的一些重要的函數。顯然,這本書對於兼容內核中設備驅動框架和設備驅動界面的實現有着重要的指導意義。讀了這本書,再 回過去看Windows DDK中一些樣本實例的源代碼,就更容易理解,理解也可以更深了。

不過,現在實際上在使用的.sys模塊還有不少只是傳統的WinNT設備驅動。WinNT的設備驅動框架可以說是WDM的一個子集,比WDM要簡單一些。 對於WinNT設備驅動,Art Baker的“The Windows NT Device Driver Book”是一本很好的參考書。這本書是由 Prentice Hall在1996年出版的。雖然年代已經久遠,書的內容卻並不顯得太陳舊,可以作爲WDM那本書的補充,參照閱讀。

第四本書是Jeffrey Richter的“Advanced Windows”第3版, 微軟出版社1997年版。這本書就不僅僅是講內核了。它讓讀者對Windows操作系統有個整體上的理解。例如,在另一篇文章中 筆者曾提到,Windows在創建子進程時對於已打開文件的遺傳與Unix/Linux 在方式上有很大的不同,這本書對此就有很詳細的敘述。而這一點正可以說明,不同內核間的有些差別是很難在內核外面得到補償的。

第五本書是 Gary Nebbett的“Windows NT/2000 Native API Reference”, MTP出版社。這裏所說的 “Native API”,實際上就是系統調用。顯然,這是一本關於WinNT系統調用的參考手冊。既然微軟把系統調用界面藏在黑盒子裏面,或者說藏在 Win32 API後面,從來都不公開,那麼這本參考手冊的價值也就不言而喻了。看一下這本書,就可以知道實現Windows系統調用界面的工作量該有多 大。

作爲對這本書的補充,Parasad Dabak等人的“Undocumented Windows NT”,M& T Books,1999年出版,對於WinNT系統調用的實現也是一本有用的參考書。與前面幾本由微軟出版的參考書不同的是,這兩本書的材料主要是通過逆向 工程得來的。有源代碼作爲根基的著作固然比較權威,根據實驗取得的資料也值得重視。 還有一本Sven Schreiber的 “Undocumented Windows 2000 Secrets”, Addison-Wesley,2001年出版,也是一本好書,甚至更好。這本書一邊是基於逆向工程介紹Windows內核各方面的內 容,也包括設備驅動;另一邊還教給讀者一些逆向工程的方法,所以對程序的調試很有好處。特別值得一提的是,這本書的附錄中實際上還列出了Win2k系統調 用的函數跳轉表、即函數名與系統調用號的對照,書中還講述了這個對照表是如何得來的。這可是個寶貴的信息。因爲Native API一書中雖然詳細介紹了各個具體系統調用的使用方法,卻並未提供它們的系統調用號。而若缺了這個信息,我們在實現 Windows系統調用界面的函數跳轉表時就得多費許多周折。

最後,Rajeev Nagar的“Windows NT File System Internals”,O’Reilly,1997,雖然主題是“文件系統內幕”,但是實際上對內核的各個方面都有一些介紹,也有一定的參考價值。 這八本書是筆者所知最好的Windows參考書。當然,並不是說讀者必須讀了這八本書的全部才能從事兼容內核的開發,更不是說讀了這八本書就一定可以把兼容內核開發好。

參考書目 Mark Russinovich,David Solomon,“Microsoft Windows Internals”,4e,Microsoft Press,2005 Walter Oney,“Programming the Microsoft Windows Driver Model”,2e, Microsoft Press,2003 Art Baker,“The Windows NT Device Driver Book”,Prentice Hall,1996 Jeffrey Richter,“Advanced Windows”,3e,Microsoft Press,1997 Gary Nebbett,“Windows NT/2000 Native API Reference”,MTP, 2000 Parasad Dabak, “Undocumented Windows NT”,M&T Books, 1999 Sven Schreiber,“Undocumented Windows 2000 Secrets”,Addison-Wesley,2001 Rajeev Nagar,“Windows NT File System Internals”,O’Reilly,1997

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章