琢石成器——Windows環境下32位彙編語言程式設計

本書從編寫應用程式的角度,從簡單的例子開始到編寫多執行緒、註冊表和網路通信等複雜的程式,通過70多個實例逐步深入Win32彙編語言編程的方方面面。

圖書信息

作 者:羅雲彬
出 版 社:電子工業出版社
出版時間: 2009-6-1
頁 數:756頁
開 本:16開
ISBN 9787121086632
定價::89.00元(含光碟1張)

宣傳語

暢銷書《Windows環境下32位彙編語言程式設計》升級版。

內 容 簡 介

Windows環境下32位彙編語言是一種全新的程式語言。它使用與C++語言相同的API接口,不僅可以開發出大型的軟體,而且是了解作業系統運行細節的最佳方式。
本書作者羅雲彬擁有十餘年彙編語言編程經驗,是彙編編程網站的創辦者。本書是作者多年來編程工作的總結,適合於欲通過Win32彙編語言編寫Windows程式的讀者。

前言

從Windows出現開始,彙編語言似乎在慢慢地銷聲匿跡,但本書可以讓人放棄這個觀點,其實在Win32環境下,彙編語言依然強大。
Why——為什麼選擇Win32彙編
選擇Win32彙編的理由是什麼呢?
在DOS時代,學習彙編就是學習系統底層編程的代名詞,僅要成為一名入門級的彙編程式設計師,就需要學習從CPU結構、CPU工作方式、各種硬體的編程方法到DOS工作方式等範圍很廣的知識。隨著Windows時代的到來,Windows像一堵巨大的牆,把我們和計算機的硬體隔離開。對於DOS的彙編程式設計師來說,就像在一夜之間,我們發現自己曾經學過的幾乎所有的東西都被Windows封裝到核心中去了,由於保護模式的存在,我們又無法像在DOS下那樣闖入系統核心為所欲為。在Windows下用任何語言編程都必須遵循Windows的規範,彙編也不例外,也就是說,彙編不再是一種“有特權”的語言。面對洶湧而來的Visual C++,Visual Basic,PowerBuilder和Java等各個領域的猛將,從DOS時代“為所欲為”的“系統警察”崗位下崗,在其他領域又沒有一技之長,彙編語言似乎失去了生存的意義,有很多人在DOS轉向Windows的時候放棄了彙編語言。
但是經過短暫的失落,擺正了自己在系統中的位置,我們發現從“系統警察”轉換到遵循Windows規範的“好市民”後,彙編語言又慢慢地在這個世界流行起來了。畢竟,不能為所欲為也可以有好的一面,我們可以不必再考慮一些老大難的問題,如程式運行時會面對什麼樣的顯示卡,如何驅動不同的印表機,記憶體不夠了如何用磁碟交換,等等。我們也可以在了解更少硬體知識的情況下就可以掌握Win32的彙編編程。而且,我們驚喜地發現,做了“好市民”以後,我們反而擁有了和其他語言同樣的權利——為了做圖形和界面等方面的功能,彙編程式設計師在DOS時代連做夢都在羨慕C語言龐大的函式館,而現在,Windows為我們提供了比這還要多得多的函式,以至於其他大部分語言可以做出來的功能,彙編都可以做,而其他語言做不到的功能,彙編照樣可以做!所以這就是理由之一:Win32彙編可以當做一種功能強大的開發語言使用,使用它完全可以開發出大型的軟體來。
正因為Win32彙編看上去不再那樣低級,於是有讀者曾經提出:Win32彙編講的都是用API來寫程式,和高級語言差不多,以前在DOS下使用的中斷什麼的都不能用,所以沒有什麼新奇的了。還有讀者認為本書只不過是MSDN的彙編版本而已。言下之意就是:學彙編就是為了了解高級語言底下一層的功能,但現在Win32彙編卻使用和C++等語言相同的API接口,既然和高級語言處於同一個級別,我們為什麼還要去和機器指令打交道呢,還不如去學Visual C++方便。
但是我們可以這樣問一問自己:
問:在DOS彙編中我們為什麼用中斷功能?
答:為了使用DOS核心提供的功能。
問:在DOS中我們常常自己用操作I/O連線埠的方法讀寫硬碟或操作顯示卡嗎?
答:不,我們用系統提供的int 13h和int 10h。
……
同樣,在Win32彙編里使用API也是為了使用Windows核心提供的功能。只不過使用的方式不再是中斷方式而已,這不是Win32彙編語言“高級化”了,而是高級語言因為使用Windows的API接口而“低級化”了,其代價就是無法移植到其他系統,用Visual C++寫的程式是無法移植到其他作業系統平台上的,只有和平台無關的ANSI C++等才能算是真正意義上的高級語言。
其實,任何彙編語言都是和作業系統密切相關的,不管是DOS彙編、Win32彙編,還是Linux彙編,都是基於特定的作業系統的,如果一定要繞過作業系統,那么就不會有DOS彙編和Win32彙編的區別了,但是這樣的話我們不是在學彙編,而是在自己開發作業系統。高級語言在不同的作業系統上看起來都差不多,但作為一種低級語言,不同作業系統上的彙編就是不同的世界。所以,既然Windows和DOS是兩個完全不同的作業系統,我們就必須拋棄DOS彙編中的大部分概念從頭開始學習Win32彙編。這就是理由之二:Win32彙編是Windows環境下一種全新的程式語言。
Win32環境下的很多高級語言,如Visual C++和Visual Basic等,一如既往地對實現的細節進行了或深或淺的封裝,就連最能表現Windows特徵的部分,如訊息循環和多執行緒的處理等內容也都被隱藏封裝,使我們在使用它們進行可視化編程的同時,無法全面了解Win32程式運行的具體方式。在學習Win32彙編以後,這些隱藏在高級語言後面的細節就暴露出來了。
由於封裝的關係,各種高級語言或多或少存在某種“缺陷”,比如VB不支持指針,結果很多需要使用指針的API用起來就很不方便,像多執行緒一類的特徵在VB中就無法實現,PowerBuilder也是如此;C語言已經是最靈活的高級語言了,但還是無法在代碼級別處理某些需求;而彙編語言見到的是一個最真實的作業系統,它可以用最靈活的方式使用各種系統功能,第13章中有關進程隱藏的內容就是最好的寫照。所以理由之三就是:使用Win32彙編語言是了解作業系統運行細節的最佳方式。
最後的理由根本不是理由,而是必然的選擇,當我們在Windows環境下進行加密解密、逆向工程,還有病毒、木馬等有害代碼的分析和防治工作時,Win32彙編是唯一的選擇。在任何討論這方面內容的書籍中,彙編代碼的篇幅總是很大的。因此,要想深入了解這些內容的前提就是深入彙編編程。
How——如何學習Win32彙編
以往的彙編書籍往往把重點放在硬體結構和指令上,講述了一大堆電路框圖和指令列表,把大家搞得暈暈乎乎後,再舉出一些重量級的例子,不是一些像數組、矩陣計算一類的複雜運算,就是開始圖形模式畫圖,以至於大家看完以後就再也找不到北了!實際上,這些例子不是太難了,而是太枯燥了。有人說,學彙編就像考大學,千軍萬馬過獨木橋,太多的人中途放棄了,只有少數人堅持到最後。
筆者認為:學習彙編應該在輕鬆的環境下進行,在學習中使用的例子不一定太複雜,但一定要有吸引力。用彙編寫複雜的運算程式固然會比C更有效率,但同樣的事在C中用一個表達式就全部搞定了,從這裡開始學彙編,給人的感覺就像從複雜的公式開始學算術,要知道,加法還沒有學會呢!而對於高級語言封裝起來的系統功能,用彙編解釋起來就非常直接,非常自然,也更容易懂。以筆者自己學彙編的過程來說,那時候是1990年,剛好是中國第一次病毒大流行,大家的計算機上都是那個病毒的開山鼻祖——桌球病毒,在流行DOS的時期,看著在螢幕上蹦的小球,心中就有一個問題:如何編出這樣一個玩意來呢?要知道DOS是單任務的,而那個球在別的程式運行的時候照樣蹦!這用當時流行的FORTRAN、C等課程中學到的任何知識都無法解釋,因為這些課程中不可能有TSR、中斷、引導區等內容。帶著這樣一個疑問學習彙編,在分析桌球病毒的過程中啃一條條不懂的指令,病毒分析完了,彙編課也學完了,而且反過來看那些複雜的計算程式都是那么順理成章,不攻自破了。實際上,從一些實用的系統功能開始學習彙編遠比學矩陣計算容易理解。
正如最經典的C程式就是那個“Hello,World!”一樣,這個程式的有名並不是因為它用高深複雜的語句放倒了一大批人,而是它以最簡單易懂的方式讓人們走入C語言的大門。對於Win32彙編也是如此,從最簡單的例子開始總是沒錯的,筆者建議讀者跟隨本書中從簡到繁的例子,努力做到理解並靈活引用這些例子中的各種功能,正如“熟讀唐詩三百首,不會寫詩也會吟”,最後能夠熟練地使用Win32彙編來解決各種編程需求就是最大的勝利。
另外,正如前面講到的,彙編語言的學習必須和作業系統緊密結合。經過簡單的調查,筆者發現很多高校使用的彙編教程還是停留在清華91版《IBM-PC彙編語言程式設計》之類的教材上,雖然這些教材中基礎知識部分永遠不會過時,但涉及作業系統的部分還是停留在DOS階段。隨著DOS作業系統的悄然引退,繼續把精力花在上面是一種浪費,因為任何語言都必須有套用的平台,否則課程學完之後會尷尬地發現沒有地方可以套用。筆者認為,在《IBM-PC彙編語言程式設計》之類傳統教材中的基礎部分學習完畢以後,重點就應該轉向Win32彙編,以及保護模式方面的知識。
關於本書的內容
本書嘗試從編寫應用程式的角度,從“Hello,World”這個簡單的例子開始到編寫多執行緒、註冊表和網路通信等複雜的程式,通過70多個從簡單到複雜的例子,逐步深入Win32彙編編程的方方面面。筆者從事彙編編程已經有十幾年的歷史了,從8086時代的DOS彙編編程開始到當前的Win32彙編編程,從一個初學者到現在能利用Win32彙編來解決大部分編程需求,中間也經過了很長時間的摸索和大量的挫折,所以筆者很清楚初學者在哪些地方會遇到問題,但是涉及Win32彙編的書籍卻實在太少了。正是因為如此,筆者決心把本書的目標定為:能讓讀者入門並在最後能熟練掌握Win32彙編編程,而不是那種深入系統奧秘一類的書籍。
從這個目標出發,本書的選材中儘量去掉已經有其他書籍詳細討論的部分,因為要一本書涉及全部方面是不現實的。內容全面就必然不精,內容深刻就必須圍繞一個中心點,所以本書的內容並不詳細討論一般彙編教材的基礎部分,如處理器結構和保護模式等,也不準備涉及Windows驅動程式、com編程或者其他能夠冠以“密技”頭銜的內容。本書主要的內容將放在32位宏彙編對比DOS彙編所不同的部分,以及Win32應用程式的彙編實現上。不求全面,只求精也!(說句老實話,也不敢對自己不精通的地方妄加評論,以免破壞自己的良好形象。 )
在一些彙編編程論壇上,經常有初學者問到MASM和TASM有什麼不同,用哪個比較好,@@標號是什麼意思,為什麼用下載的彙編編譯器無法編譯程式等問題,雖然這些都屬於最基本的問題,但是以前的確沒有一個地方或者有一本書能系統全面地講解這些問題。本書的基礎篇就是因此而設,它們是:
● 第1章 背景知識
● 第2章 準備編程環境
● 第3章 使用MASM
當搭建編譯環境和對編譯器的使用不再成為絆腳石的時候,初學者的問題往往集中在對Windows程式結構的迷惑上,訊息驅動體系、視窗過程、與硬體隔絕的圖形接口及資源檔案等相對於DOS程式來說都是全新的內容。接下來的4章將深入討論這些內容,通過這幾章,讀者應該開始習慣以Windows的方式考慮問題了(腦海中的DOS逐漸遠去……),這就是本書的初級篇:
● 第4章 第一個視窗程式
● 第5章 使用資源
● 第6章 定時器和Windows時間
● 第7章 圖形操作
Windows系統不像DOS系統,它的應用程式界面是規範化的,統一的界面來自大量統一的界面控制項,學習這些控制項就等於學習如何編寫Windows界面。下面的界面篇中的兩章將探討這方面的內容:
● 第8章 通用對話框
● 第9章 通用控制項
學到這裡為止,讀者應該可以寫出界面規範的標準的Win32程式了。但還是無法用這些程式來解決一些具體問題,因為有關Windows系統的高級特徵的介紹還沒有開始,如記憶體管理、檔案操作和多執行緒等。這些就是本書系統篇中將要介紹的內容,通過這些內容,讀者將比較深入地了解Windows的工作方式:
● 第10章 記憶體管理和檔案操作
● 第11章 動態程式庫和鉤子
● 第12章 多執行緒
● 第13章 進程控制
● 第14章 異常處理
相信到這裡為止,讀者對Windows的了解已經比較系統了。雖然Windows中還存在其他很多方面的內容,如管道,郵件槽,如何寫控制臺程式、螢幕保護程式和驅動程式等。但是有了前面的基礎以後,讀者自己去了解這些內容就不成問題了,因為掌握了“漁”,得到“魚”又有什麼困難呢?在最後的幾章中,本書將從套用的角度再補充介紹一些常用的網路編程、註冊表、pe檔案和資料庫操作方面的內容,這就是套用篇:
● 第15章 註冊表和ini檔案
● 第16章 WinSock接口和網路編程
● 第17章 PE檔案
● 第18章 ODBC資料庫編程
在本書中,筆者特別以顯著的方式標出了一些經驗之談,這些是筆者在長期的彙編編程中得到的體會,可能是任何一本教科書或者手冊里都沒有的。希望這些能給讀者帶來幫助!
用“燈泡”標出的部分表示一些小技巧,可以對編程的理解有促進作用。
用“驚嘆號”標出的部分表示容易出錯的部分,可以幫助讀者避免一些難以理解的錯誤。
對讀者的假設
有了內容的定位,讀者的定位也就比較清楚了,本書適合於以下讀者:
● 想用Win32彙編寫Windows應用程式的讀者。
● 想從DOS下的16位彙編轉向Windows下32位彙編的讀者。
● 欲了解Win32彙編,以便為Windows下的加密解密、系統安全、逆向工程等方面打基礎的讀者。
● 欲了解Win32彙編,以便為用彙編寫Windows驅動程式打基礎的讀者。
● 正在學習彙編課程,需要補充彙編課程中Win32部分的學生。
在開始本書之前,讀者應該有以下的基礎知識:
● 計算機的基礎知識,如進制轉換、邏輯運算、變數類型和指針的概念等。
● 數據結構的基礎知識,因為Win32編程涉及大量的數據結構。
● C語言的基礎知識,因為Win32編程的絕大部分參考資料都是以C的格式出現的。
● Intel 80x86處理器的基礎知識,如定址方式和指令的使用等。
本書並不是為以下讀者準備的:
● 欲詳細了解保護模式的讀者——因為Windows並不是一個開放的平台,Windows的開放只限於應用程式接口,所以要用Windows做背景研究保護模式只能是自討苦吃,如果讀者需要深入了解這方面的內容,最好的方法就是去研究Linux的核心代碼並在Linux上實驗。
● 欲了解Windows核心“機密”的讀者——彙編並不等同於深入作業系統的內部,所以本書不是《Windows核心分析》。而真正意義上的《Windows核心分析》除了Microsoft,恐怕誰也寫不出來。
● 欲了解Windows驅動程式編寫的讀者——要介紹清楚Windows驅動程式,需要的篇幅絕不會亞於本書的篇幅,本書不打算涉及這方面的內容,讀者有興趣的話,可以閱讀《Programming WDM》和《System Programming for Windows 95》等書,前者講述的是Windows 2000/Windows NT下的WDM驅動程式,後者講述的是Windows 9x下的VxD驅動程式。
第3版有什麼新的內容
本書第1版出版至今已經6年多了,第2版出版至今也已經3年了,期間筆者收到了大量的讀者來信,對本書提出了各種意見和建議,綜合各種方面的考慮,本書的第3版做了以下改進。
● 對第2版中已知的錯誤進行了修正,包括一些排版錯誤、錯別字和例子中的Bug。
● 對一些過時的內容進行了更新或者刪除。
● 根據讀者的反饋,對部分章節進行了重寫。
關於附書代碼和讀者反饋
為了更好地說明Win32彙編的編程方法,本書附帶了70多個例子,這些例子的原始碼全部可以在附書光碟中找到,代碼全部採用MASM格式編寫,推薦使用的編譯軟體為masm32 SDK軟體包。
本書中的例子代碼已經經過了嚴格的防病毒測試,絕對不含任何病毒,但第11章的例子涉及鉤子技術,第17章的例子涉及對PE檔案進行操作,其中的小段代碼與一些木馬和病毒的特徵碼類似,以至於被一些防毒軟體誤認為有未知病毒,請讀者放心使用,不必顧慮。
雖然本書中所有的例子代碼都已經在Windows 98、Windows 2000、Windows XP和Windows Vista下測試通過,但也有存在Bug的可能,如果發現代碼存在錯誤或者發現書中有其他問題,請告知作者,以便在下一個版本中改進。如果讀者有任何的反饋意 見——不管是批評還是鼓勵,都請和作者聯繫,請訪問作者網站獲取最新有效的E-mail地址。
羅雲彬
致謝
首先感謝我的父母親,如果沒有你們從小到大對我的培養,就沒有這一切。也感謝我的妹妹,在很多關鍵的時候,你總是給予我很多的幫助。
感謝我的妻子小豬豬,在本書創作的時候,沒有你的理解和支持,我不可能完成這樣一部作品;在本書發行後的日子裡,要不是你將逛街、買衣服、旅遊的時間慷慨地貢獻出來,並盯緊四處亂跑的小寶寶,本書就不會有多次再版的機會。
感謝我的母校浙江大學,浙大“求是創新”的校訓,“實事求是、嚴謹踏實、奮發進取、開拓創新”的校風讓我能夠有一個好的學習習慣,讓我在畢業以後的這么多年裡能夠始終有一種動力去學習最新的知識。
感謝電子工業出版社博文視點資訊有限公司的郭立老師和李冰編輯,你們的支持、鼓勵和專業的指點使本書能夠按照進度按時完成。
非常高興看到本書的再版,本書的前2個版本取得了累計銷量達到40000冊的好成績,從本書的第1版發行到現在,我收到了很多讀者和網友的反饋,使本書更加完善。在第3版發行之際,再次感謝你們對我的關心和愛護,也感謝你們為我提了很多寶貴的意見和建議。
羅雲彬

目 錄

基礎篇
第1章 背景知識 1
1.1 Win32的軟硬體平台 1
1.1.1 80x86系列處理器簡史 1
1.1.2 Windows的歷史 3
1.1.3 Win32平台的背後——
1.1.3 Wintel聯盟 5
1.2 Windows的特色 6
1.3 必須了解的基礎知識 7
1.3.1 80x86處理器的工作模式 7
1.3.2 Windows的記憶體管理 9
1.3.3 Windows的特權保護 17
第2章 準備編程環境 21
2.1 Win32執行檔的
2.1 開發過程 21
2.2 編譯器和連結器 23
2.2.1 MASM系列 23
2.2.2 TASM系列 27
2.2.3 其他編譯器 28
2.2.4 MASM,TASM還是
2.2.4 nasm 29
2.2.5 我們的選擇——MASM32
2.2.5 SDK軟體包 30
2.3 創建資源 31
2.3.1 資源編譯器的使用 31
2.3.2 所見即所得的資源編輯器 32
2.4 make工具的用法 34
2.4.1 make工具是什麼 34
2.4.2 NMake的用法 35
2.4.3 描述檔案的語法 36
2.5 獲取資料 39
2.5.1 Windows資料的來源 40
2.5.2 Intel處理器資料 42
2.6 構建編程環境 42
2.6.1 IDE還是命令行 42
2.6.2 本書推薦的工作環境 43
2.6.3 嘗試編譯第一個程式 44
第3章 使用MASM 46
3.1 Win32彙編源程式的結構 46
3.1.1 模式定義 48
3.1.2 段的定義 50
3.1.3 程式結束和程式入口 53
3.1.4 注釋和換行 53
3.2 調用API 54
3.2.1 API是什麼 54
3.2.2 調用API 56
3.2.3 API參數中的等值定義 60
3.3 標號、變數和數據結構 62
3.3.1 標號 62
3.3.2 全局變數 64
3.3.3 局部變數 65
3.3.4 數據結構 68
3.3.5 變數的使用 70
3.4 使用子程式 74
3.4.1 子程式的定義 75
3.4.2 參數傳遞和堆疊平衡 76
3.5 高級語法 79
3.5.1 條件測試語句 79
3.5.2 分支語句 80
3.5.3 循環語句 82
3.6 代碼風格 85
3.6.1 變數和函式的命名 85
3.6.2 代碼的書寫格式 87
3.6.3 代碼的組織 88
初級篇
第4章 第一個視窗程式 89
4.1 開始了解視窗 89
4.1.1 視窗是什麼 89
4.1.2 視窗界面 90
4.1.3 視窗程式是怎么工作的 92
4.2 分析視窗程式 98
4.2.1 模組和句柄 98
4.2.2 創建視窗 100
4.2.3 訊息循環 107
4.2.4 視窗過程 109
4.3 視窗間的通信 114
4.3.1 視窗間的訊息互發 114
4.3.2 在視窗間傳遞數據 117
4.3.3 SendMessage
4.3.3 PostMessage函式的區別 118
第5章 使用資源 119
5.1 選單和加速鍵 120
5.1.1 選單和加速鍵的組成 120
5.1.2 選單和加速鍵的資源定義 121
5.1.3 使用選單和加速鍵 126
5.2 圖示和游標 138
5.2.1 圖示和游標的資源定義 139
5.2.2 使用圖示和游標 139
5.3 點陣圖 143
5.3.1 點陣圖簡介 143
5.3.2 在資源中定義點陣圖 144
5.4 對話框 145
5.4.1 對話框簡介 145
5.4.2 對話框的資源定義 147
5.4.3 使用對話框 149
5.4.4 在對話框中使用子
5.4.4 視窗控制項 152
5.5 字元串資源 174
5.6 版本信息資源 176
5.6.1 版本信息資源的定義 176
5.6.2 在程式中檢測版本信息 179
5.7 二進制資源和自定義資源 180
5.7.1 使用二進制資源 180
5.7.2 使用自定義資源 181
第6章 定時器和Windows時間 183
6.1 定時器 183
6.1.1 定時器簡介 183
6.1.2 定時器的使用方法 184
6.2 Windows時間 188
6.2.1 Windows時間的獲取和
6.2.1 設定 188
6.2.2 計算時間間隔 189
第7章 圖形操作 191
7.1 GDI原理 191
7.1.1 GDI程式的結構 192
7.1.2 設備環境 195
7.1.3 色彩和坐標 201
7.2 繪製圖形 203
7.2.1 畫筆和畫刷 211
7.2.2 繪製像素點 214
7.2.3 繪製圖形 214
7.2.4 繪圖模式 218
7.3 創建和使用點陣圖 220
7.3.1 一個使用點陣圖的時鐘例子 220
7.3.2 創建和使用點陣圖 230
7.3.3 使用設備無關點陣圖 231
7.4 塊傳送操作 233
7.4.1 塊傳送方式 233
7.4.2 塊傳送函式 234
7.5 區域和路徑 239
7.5.1 使用區域 239
7.5.2 使用路徑 241
界面篇
第8章 通用對話框 243
8.1 通用對話框簡介 243
8.2 使用通用對話框 250
8.2.1 “打開”檔案和“保存”
8.2.1 檔案對話框 250
8.2.2 字型選擇對話框 252
8.2.3 “顏色選擇”對話框 254
8.2.4 “查找”和“替換”文本
8.2.4 對話框 255
8.2.5 “頁面設定”對話框 258
8.2.6 “瀏覽目錄”對話框 259
第9章 通用控制項 260
9.1 通用控制項簡介 260
9.1.1 通用控制項的分類 260
9.1.2 使用通用控制項 262
9.2 使用狀態欄 266
9.2.1 創建狀態欄 271
9.2.2 狀態欄的控制訊息 272
9.2.3 在狀態欄上顯示選單
9.2.3 提示信息 274
9.3 使用工具列 275
9.3.1 創建工具列 282
9.3.2 工具列的控制訊息 285
9.3.3 工具列的通知訊息 288
9.4 使用Richedit控制項 291
9.4.1 創建Richedit控制項 303
9.4.2 Richedit控制項的控制訊息 305
9.4.3 Richedit控制項的通知訊息 314
9.5 視窗的子類化 315
9.5.1 什麼是視窗的子類化 315
9.5.2 視窗子類化的實現 316
9.6 控制項的超類化 322
9.6.1 什麼是控制項的超類化 322
9.6.2 控制項超類化的實現 323
系統篇
第10章 記憶體管理和檔案操作 327
10.1 記憶體管理 327
10.1.1 記憶體管理基礎 327
10.1.2 記憶體的當前狀態 328
10.1.3 標準記憶體管理函式 330
10.1.4 堆管理函式 335
10.1.5 虛擬記憶體管理函式 339
10.1.6 其他記憶體管理函式 344
10.2 檔案操作 345
10.2.1 Windows的檔案I/O 345
10.2.2 創建和讀寫檔案 346
10.2.3 查找檔案 357
10.2.4 檔案屬性 364
10.2.5 其他檔案操作 366
10.3 驅動器和目錄 367
10.3.1 邏輯驅動器操作 368
10.3.2 目錄操作 371
10.4 記憶體映射檔案 373
10.4.1 記憶體映射檔案簡介 374
10.4.2 使用記憶體映射檔案 376
第11章 動態程式庫和鉤子 384
11.1 動態程式庫 384
11.1.1 動態程式庫的概念 384
11.1.2 編寫動態程式庫 385
11.1.3 使用動態程式庫 391
11.1.4 動態程式庫中的數據
11.1.4 共享 400
11.1.5 在VC++中使用動態
11.1.5 程式庫 401
11.2 Windows鉤子 404
11.2.1 什麼是Windows鉤子 404
11.2.2 遠程鉤子的安裝和使用 406
11.2.3 日誌記錄鉤子 414
第12章 多執行緒 418
12.1 進程和執行緒 418
12.2 多執行緒編程 419
12.2.1 一個單執行緒的“問題
12.2.1 程式” 419
12.2.2 多執行緒的解決方法 423
12.2.3 與執行緒有關的函式 427
12.3 使用事件對象控制執行緒 431
12.3.1 事件 432
12.3.2 等待事件 433
12.3.3 進一步改進計數程式 434
12.4 執行緒間的同步 437
12.4.1 產生同步問題的原因 437
12.4.2 各種用於執行緒間同步
12.4.2 的對象 442
第13章 過程控制 450
13.1 環境變數和命令行參數 450
13.1.1 環境變數 450
13.1.2 命令行參數 453
13.2 執行執行檔 458
13.2.1 方法一:Shell調用 458
13.2.2 方法二:創建進程 460
13.3 進程調試 469
13.3.1 獲取運行中的進程句柄 469
13.3.2 讀寫進程的地址空間 475
13.3.3 調試API的使用 480
13.4 進程的隱藏 489
13.4.1 在Windows 9x中隱藏
13.4.1 進程 489
13.4.2 Windows NT中的遠程
13.4.2 執行緒 491
第14章 異常處理 503
14.1 異常處理的用途 503
14.2 使用篩選器處理異常 504
14.2.1 註冊回調函式 504
14.2.2 異常處理回調函式 506
14.3 使用seh處理異常 510
14.3.1 註冊回調函式 512
14.3.2 異常處理回調函式 513
14.3.3 SEH鏈和異常的傳遞 516
14.3.4 展開操作(Unwinding) 518
套用篇
第15章 註冊表和INI檔案 522
15.1 註冊表和INI檔案簡介 522
15.2 INI檔案的操作 523
15.2.1 INI檔案的結構 523
15.2.2 管理鍵值 525
15.2.3 管理小節 532
15.2.4 使用不同的INI檔案 533
15.3 對註冊表的操作 534
15.3.1 註冊表的結構 534
15.3.2 管理子鍵 536
15.3.3 管理鍵值 547
15.3.4 子鍵和鍵值的枚舉 548
15.3.5 註冊表套用舉例 551
第16章 WinSock接口和網路編程 555
16.1 windows socket接口簡介 556
16.2 Windows Socket接口的
16.2 使用 559
16.2.1 IP位址的轉換 559
16.2.2 套接字 563
16.2.3 網路應用程式的一般
16.2.3 工作流程 566
16.2.4 監聽、發起連線和
16.2.4 接收連線 569
16.2.5 數據的收發 572
16.2.6 一個最簡單的TCP服務
16.2.6 端程式 575
16.3 TCP應用程式的設計 581
16.3.1 通信協定和工作執行緒
16.3.1 的設計 581
16.3.2 TCP聊天室例子——
16.3.2 伺服器端 591
16.3.3 TCP聊天室例子——
16.3.3 客戶端 598
16.3.4 以非阻塞方式工作的
16.3.4 TCP聊天室客戶端 606
16.3.5 其他常用函式 617
第17章 PE檔案 621
17.1 PE檔案的結構 621
17.1.1 概論 621
17.1.2 DOS檔案頭和DOS塊 622
17.1.3 PE檔案頭(NT
17.1.3 檔案頭) 624
17.1.4 節表和節 629
17.2 導入表 644
17.2.1 導入表簡介 644
17.2.2 導入表的結構 646
17.2.3 查看PE檔案導入表舉例 649
17.3 導出表 651
17.3.1 導出表的結構 652
17.3.2 查看PE檔案導出表舉例 655
17.4 資源 658
17.4.1 資源簡介 658
17.4.2 資源的組織方式 659
17.4.3 查看PE檔案中的資源
17.4.3 列表舉例 662
17.5 重定位表 667
17.5.1 重定位表的結構 667
17.5.2 查看PE檔案的重定
17.5.2 位表舉例 670
17.6 套用實例 672
17.6.1 動態獲取API入口地址 672
17.6.2 在PE檔案上添加執行
17.6.2 代碼 679
第18章 ODBC資料庫編程 688
18.1 基礎知識 688
18.1.1 資料庫接口的發展歷史 688
18.1.2 SQL語言 691
18.1.3 ODBC程式的流程 693
18.2 連線資料庫 694
18.2.1 連線和斷開資料庫 694
18.2.2 連線字元串 700
18.3 數據的管理 703
18.3.1 執行SQL語句 703
18.3.2 執行結果的處理 708
18.3.3 獲取結果集中的數據 710
18.3.4 事務處理 715
18.4 資料庫操作的例子 717
18.4.1 結果集處理模組 718
18.4.2 例子的原始碼 723
參考文獻 734

相關詞條

熱門詞條

聯絡我們