關(guān)于我們
書單推薦
新書推薦
|
Windows核心編程(第5版)
這是一本經(jīng)典的Windows核心編程指南,從第1版到第5版,引領(lǐng)著數(shù)十萬程序員走入Windows開發(fā)陣營,培養(yǎng)了大批精英。
作為Windows開發(fā)人員的必備參考,本書是為打算理解Windows的C和C++程序員精心設(shè)計的。第5版全面覆蓋Windows XP,Windows Vista和Windows Server 2008中的170個新增函數(shù)和Windows特性。書中還講解了Windows系統(tǒng)如何使用這些特性,我們開發(fā)的應(yīng)用程序又如何充分使用這些特性,如何自行創(chuàng)建新的特性。 玉不琢,不成器 --《Windows核心編程(第5版)》出版前言 在剛剛過去的第29屆奧運會上,氣勢恢弘、美輪美奐的開幕式,精彩紛呈、歡呼不斷的賽場,讓我們度過了多少個激動人心的不眠之夜!開幕式上,以宏偉氣勢演繹的各種形式的"和"給人留下深刻的印象,同時也凸現(xiàn)了我們這個時代的主旋律。是的,"事成于和睦,力生于團結(jié)。"電影《赤壁》中,飾演周瑜的梁朝偉同樣也以一個簡單的動作強調(diào)了"和"的重要作用。 值此《Windows核心編程(第5版)》出版之際,心里也同樣洋溢著一樣的情結(jié)。作為此書的出版者,我們得到了很多方面的支持,從拿到選題、遴選譯者,再到后期的反復(fù)審稿,來自社內(nèi)領(lǐng)導(dǎo)和同仁,來自兄弟出版社,來自微軟公司,來自譯者,來自讀者的支持和熱情,大大增強了我們出好書,出精品書的信心和決心,能得到這么多的支持和關(guān)注,實乃三生有幸!在此特別向各位表示由衷的感謝! 正所謂"玉不琢,不成器",一本經(jīng)典著作,不僅要內(nèi)容精確,還少不了版式和其他細節(jié)的精心雕琢與編排。 * 優(yōu)秀譯者是高品質(zhì)譯著的源泉 甄選譯者的時候,很多讀者朋友踴躍報名,他們都希望能參與此書的工作,為Windows編程領(lǐng)域作出貢獻。在此,向他們表示由衷的感謝。他們當中,有70后的資深程序員,也有80后的高手程序員,更有朝氣蓬勃的在校學(xué)生?紤]到質(zhì)量和時間的因素,最后確定由微軟中國研發(fā)集團服務(wù)器及開發(fā)工具事業(yè)部的葛子昂主譯,周靖和廖敏參與。優(yōu)秀譯者是高品質(zhì)譯著的源泉,這一點在本書上得以充分的驗證。他們在翻譯過程中,秉承一貫的嚴謹風(fēng)格,在字里行間進行認真的推敲,并認真對代碼進行了相應(yīng)的調(diào)試和實踐。葛子昂作為主譯,不僅精心規(guī)劃進度,還犧牲了休息時間主動承擔(dān)了大部分工作,責(zé)無旁貸地對全書進行統(tǒng)稿,他對本書的認真程度,讓人欽佩。兄弟出版社朋友對本書翻譯的參與,也使我大受鼓舞。從他們身上,能夠深切地體會到他們的敬業(yè)精神,他們是真正的愛書人,全心全意為讀者著想的人。為讀者奉獻更豐盛的技術(shù)圖書盛宴,促進技術(shù)圖書的健康發(fā)展,這是我們共同的心愿。 * 來自微軟的支持 本書由微軟中國區(qū)微軟最有價值專家(Most Valuable Professional,MVP)集體審閱,他們對本書給與高度評價,在此感謝劉彥博、蔣晟和王濤為代表的Microsoft MVP。他們是一群令人敬佩的人,他們具備一種或多種微軟技術(shù)專業(yè)知識,積極參與在線或離線的社群活動,經(jīng)常與其他專業(yè)人士分享知識和專業(yè)技能。他們平易近人,是受人尊敬和信任的專家。在全球90多個國家,這樣的MVP有近4000名。目前中國區(qū)就有215名。 * 大人物的推薦序 本書由Windows Internals(深入解析Windows操作系統(tǒng))作者提筆所寫,他對本書的內(nèi)容和結(jié)構(gòu)給予了充分的肯定。 * 精美、雅致的版式 在版式設(shè)計方面,我們突破技術(shù)類圖書的常規(guī),精心設(shè)計了頁眉和章首頁,為讀者提供更賞心悅目的閱讀感受。 * Jeffrey照片和親筆簽名 Microsoft Press的陳幫我們穿針引線,引入Jeffrey的"大頭照"、家庭照和親筆簽名,這些都會在書中呈現(xiàn)出來。此外,Jeffrey還計劃在2009年4月訪問中國,屆時歡迎讀者朋友參與他的見面會,與他一起探討和體驗Windows編程樂趣。 * 索引 為方便讀者查閱,我們在譯文相應(yīng)部分添加了原書頁碼,同時保留原書索引,并將其附于書后。 * 讀后感分享 對于一本好書,很多讀者都有自己的心得和感想,并希望和同道中人切磋,這一點,我們將成立一個專門的書友會,讀者可以在其中暢所欲言,在《Windows核心編程》書友會這個大家庭中共同成長。詳情請關(guān)注我社網(wǎng)站首頁上的公告。 作為出版工作者,我們要感謝來自譯者和讀者的支持和鼓勵,沒有他們,就沒有佳作的誕生。關(guān)于本書的任何意見和建議,歡迎發(fā)送郵件到wenkq@tup.tsinghua.edu.cn,我們一直在聆聽大家的心聲。 清華大學(xué)出版社 目 錄 第I部分 必 備 知 識 第1章 錯誤處理3 1.1 定義自己的錯誤代碼7 1.2 ErrorShow示例程序7 第2章 字符和字符串處理10 2.1 字符編碼11 2.2 ANSI字符和Unicode字符 與字符串數(shù)據(jù)類型12 2.3 Windows中的Unicode函數(shù) 和ANSI函數(shù)14 2.4 C運行庫中的Unicode函數(shù) 和ANSI函數(shù)16 2.5 C運行庫中的安全字符串函數(shù)17 2.5.1 初識新的安全字符串函數(shù)18 2.5.2 在處理字符串時如何獲得 更多控制21 2.5.3 Windows字符串函數(shù)23 2.6 為何要用Unicode24 2.7 推薦的字符和字符串處理方式25 2.8 Unicode與ANSI字符串轉(zhuǎn)換26 2.8.1 導(dǎo)出ANSI和Unicode DLL 函數(shù)28 2.8.2 判斷文本是ANSI還是 Unicode29 第3章 內(nèi)核對象32 3.1 何為內(nèi)核對象32 3.1.1 使用計數(shù)34 3.1.2 內(nèi)核對象的安全性34 3.2 進程內(nèi)核對象句柄表36 3.2.1 創(chuàng)建一個內(nèi)核對象37 3.2.2 關(guān)閉內(nèi)核對象38 3.3 跨進程邊界共享內(nèi)核對象42 3.3.1 使用對象句柄繼承42 3.3.2 改變句柄的標志45 3.3.3 為對象命名46 3.3.4 終端服務(wù)命名空間50 3.3.5 專有命名空間51 3.3.6 復(fù)制對象句柄58 第II部分 工 作 機 理 第4章 進程65 4.1 編寫第一個Windows應(yīng)用程序66 4.1.1 進程實例句柄71 4.1.2 進程前一個實例的句柄72 4.1.3 進程的命令行73 4.1.4 進程的環(huán)境變量74 4.1.5 進程的關(guān)聯(lián)性79 4.1.6 進程的錯誤模式79 4.1.7 進程當前所在的驅(qū)動器 和目錄80 4.1.8 進程的當前目錄81 4.1.9 系統(tǒng)版本82 4.2 CreateProcess函數(shù)85 4.2.1 pszApplicationName和 pszCommandLine參數(shù)86 4.2.2 psaProcess,psaThread 和bInheritHandles參數(shù)87 4.2.3 fdwCreate參數(shù)89 4.2.4 pvEnvironment參數(shù)91 4.2.5 pszCurDir參數(shù)92 4.2.6 psiStartInfo參數(shù)92 4.2.7 ppiProcInfo參數(shù)98 4.3 終止進程100 4.3.1 主線程的入口點函數(shù)返回100 4.3.2 ExitProcess函數(shù)101 4.3.3 TerminateProcess函數(shù)102 4.3.4 當進程中的所有線程終止時103 4.3.5 當進程終止運行時103 4.4 子進程104 4.5 管理員以標準用戶權(quán)限運行時106 4.5.1 自動提升進程的權(quán)限109 4.5.2 手動提升進程的權(quán)限111 4.5.3 何為當前權(quán)限上下文112 4.5.4 枚舉系統(tǒng)中正在運行的 進程114 4.5.5 Process Information示例 程序115 第5章 作業(yè)121 5.1 對作業(yè)中的進程施加限制124 5.2 將進程放入作業(yè)中131 5.3 終止作業(yè)中的所有線程132 5.4 作業(yè)通知135 5.5 Job Lab示例程序138 第6章 線程基礎(chǔ)140 6.1 何時創(chuàng)建線程141 6.2 何時不應(yīng)該創(chuàng)建線程143 6.3 編寫第一個線程函數(shù)144 6.4 CreateThread函數(shù)144 6.4.1 psa參數(shù)145 6.4.2 cbStackSize參數(shù)145 6.4.3 pfnStartAddr和pvParam 參數(shù)146 6.4.4 dwCreateFlags147 6.4.5 pdwThreadID147 6.5 終止運行線程148 6.5.1 線程函數(shù)返回148 6.5.2 ExitThread函數(shù)148 6.5.3 TerminateThread函數(shù)149 6.5.4 進程終止運行時149 6.5.5 線程終止運行時150 6.6 線程內(nèi)幕150 6.7 C/C++運行庫注意事項153 6.7.1 用_beginthreadex而不要用 CreateThread創(chuàng)建線程161 6.7.2 絕對不應(yīng)該調(diào)用的C/C++ 運行庫函數(shù)161 6.8 了解自己的身份162 第7章 線程調(diào)度、優(yōu)先級和關(guān)聯(lián)性165 7.1 線程的掛起和恢復(fù)166 7.2 進程的掛起和恢復(fù)167 7.3 睡眠169 7.4 切換到另一個線程169 7.5 在超線程CPU上切換到另一個 線程170 7.6 線程的執(zhí)行時間170 7.7 在實際上下文中談CONTEXT 結(jié)構(gòu)174 7.8 線程優(yōu)先級178 7.9 從抽象角度看優(yōu)先級179 7.10 優(yōu)先級編程182 7.10.1 動態(tài)提升線程優(yōu)先級185 7.10.2 為前臺進程微調(diào)調(diào)度程序186 7.10.3 調(diào)度I/O請求優(yōu)先級186 7.10.4 Scheduling Lab 示例程序188 7.11 關(guān)聯(lián)性192 第8章 用戶模式下的線程同步197 8.1 原子訪問:Interlocked系列函數(shù)198 8.2 高速緩存行203 8.3 高級線程同步205 8.4 關(guān)鍵段207 8.4.1 關(guān)鍵段:細節(jié)209 8.4.2 關(guān)鍵段和旋轉(zhuǎn)鎖212 8.4.3 關(guān)鍵段和錯誤處理213 8.5 Slim讀/寫鎖214 8.6 條件變量217 8.6.1 Queue示例程序218 8.6.2 在停止線程時的死鎖問題225 8.6.3 一些有用的竅門和技巧227 第9章 用內(nèi)核對象進行線程同步230 9.1 等待函數(shù)232 9.2 等待成功所引起的副作用235 9.3 事件內(nèi)核對象236 9.4 可等待的計時器內(nèi)核對象245 9.4.1 讓可等待的計時器添加APC 調(diào)用248 9.4.2 計時器的剩余問題250 9.5 信號量內(nèi)核對象251 9.6 互斥量內(nèi)核對象253 9.6.1 遺棄問題255 9.6.2 互斥量與關(guān)鍵段的比較256 9.6.3 Queue示例程序256 9.7 線程同步對象速查表264 9.8 其他的線程同步函數(shù)265 9.8.1 異步設(shè)備I/O265 9.8.2 WaitForInputIdle函數(shù)265 9.8.3 MsgWaitForMultipleObjects(Ex) 函數(shù)266 9.8.4 WaitForDebugEvent函數(shù)267 9.8.5 SignalObjectAndWait函數(shù)267 9.8.6 使用等待鏈遍歷API來檢測 死鎖268 第10章 同步設(shè)備I/O與異步設(shè)備I/O275 10.1 打開和關(guān)閉設(shè)備276 10.2 使用文件設(shè)備285 10.2.1 取得文件的大小285 10.2.2 設(shè)置文件指針的位置286 10.2.3 設(shè)置文件尾288 10.3 執(zhí)行同步設(shè)備I/O289 10.3.1 將數(shù)據(jù)刷新至設(shè)備289 10.3.2 同步I/O的取消290 10.4 異步設(shè)備I/O基礎(chǔ)291 10.4.1 OVERLAPPED結(jié)構(gòu)292 10.4.2 異步設(shè)備I/O的注意事項294 10.4.3 取消隊列中的設(shè)備I/O 請求296 10.5 接收I/O請求完成通知296 10.5.1 觸發(fā)設(shè)備內(nèi)核對象297 10.5.2 觸發(fā)事件內(nèi)核對象298 10.5.3 可提醒I/O301 10.5.4 I/O完成端口306 10.5.5 模擬已完成的I/O請求316 第11章 Windows線程池324 11.1 情形1:以異步方式調(diào)用函數(shù)325 11.1.1 顯式地控制工作項325 11.1.2 Batch示例程序327 11.2 情形2:每隔一段時間調(diào)用一個 函數(shù)330 11.3 情形3:在內(nèi)核對象觸發(fā)時調(diào)用 一個函數(shù)335 11.4 情形4:在異步I/O請求完成時 調(diào)用一個函數(shù)337 11.5 回調(diào)函數(shù)的終止操作339 11.5.1 對線程池進行定制340 11.5.2 得體地銷毀線程池: 清理組342 第12章 纖程345 第III部分 內(nèi) 存 管 理 第13章 Windows內(nèi)存體系結(jié)構(gòu)355 13.1 進程的虛擬地址空間355 13.2 虛擬地址空間的分區(qū)356 13.2.1 空指針賦值分區(qū)357 13.2.2 用戶模式分區(qū)357 13.3 地址空間中的區(qū)域360 13.4 給區(qū)域調(diào)撥物理存儲器361 13.5 物理存儲器和頁交換文件362 13.6 頁面保護屬性365 13.6.1 寫時復(fù)制366 13.6.2 一些特殊的訪問保護屬性 標志367 13.7 實例分析367 13.8 數(shù)據(jù)對齊的重要性375 第14章 探索虛擬內(nèi)存379 14.1 系統(tǒng)信息379 14.2 虛擬內(nèi)存狀態(tài)387 14.3 NUMA機器中的內(nèi)存管理388 14.4 確定地址空間的狀態(tài)391 14.4.1 VMQuery函數(shù)392 14.4.2 示例程序:虛擬內(nèi)存映射397 第15章 在應(yīng)用程序中使用虛擬內(nèi)存400 15.1 預(yù)訂地址空間區(qū)域400 15.2 給區(qū)域調(diào)撥物理存儲器402 15.3 同時預(yù)訂和調(diào)撥物理存儲器403 15.4 何時調(diào)撥物理存儲器405 15.5 撤銷調(diào)撥物理存儲器及釋放區(qū)域407 15.5.1 何時撤銷調(diào)撥物理存儲器407 15.5.2 虛擬內(nèi)存分配示例程序408 15.6 改變保護屬性414 15.7 重置物理存儲器的內(nèi)容415 15.8 地址窗口擴展419 第16章 線程棧429 16.1 C/C++運行庫的棧檢查函數(shù)433 16.2 Summation示例程序435 第17章 內(nèi)存映射文件440 17.1 映射到內(nèi)存的可執(zhí)行文件和DLL441 17.1.1 同一個可執(zhí)行文件或DLL 的多個實例不會共享靜態(tài) 數(shù)據(jù)442 17.1.2 在同一個可執(zhí)行文件或DLL 的多個實例間共享靜態(tài) 數(shù)據(jù)444 17.1.3 Application Instances示例 程序449 17.2 映射到內(nèi)存的數(shù)據(jù)文件451 17.2.1 方法1:一個文件,一塊 緩存451 17.2.2 方法2:兩個文件,一塊 緩存452 17.2.3 方法3:一個文件,兩塊 緩存452 17.2.4 方法4:一個文件,零個 緩存453 17.3 使用內(nèi)存映射文件453 17.3.1 第1步:創(chuàng)建或打開文件 內(nèi)核對象454 17.3.2 第2步:創(chuàng)建文件映射 內(nèi)核對象455 17.3.3 第3步:將文件的數(shù)據(jù)映射 到進程的地址空間458 17.3.4 第4步:從進程的地址空間 撤銷對文件數(shù)據(jù)的映射461 17.3.5 第5步和第6步:關(guān)閉文件 映射對象和文件對象462 17.3.6 File Reverse示例程序463 17.4 用內(nèi)存映射文件來處理大文件469 17.5 內(nèi)存映射文件和一致性470 17.6 給內(nèi)存映射文件指定基地址471 17.7 內(nèi)存映射文件的實現(xiàn)細節(jié)472 17.8 用內(nèi)存映射文件在進程間共享 數(shù)據(jù)473 17.9 以頁交換文件為后備存儲器的 內(nèi)存映射文件474 17.10 稀疏調(diào)撥的內(nèi)存映射文件478 第18章 堆491 18.1 進程的默認堆491 18.2 為什么要創(chuàng)建額外的堆492 18.2.1 對組件進行保護493 18.2.2 更有效的內(nèi)存管理493 18.2.3 使內(nèi)存訪問局部化494 18.2.4 避免線程同步的開銷494 18.2.5 快速釋放495 18.3 如何創(chuàng)建額外的堆495 18.3.1 從堆中分配內(nèi)存塊497 18.3.2 調(diào)整內(nèi)存塊的大小498 18.3.3 獲得內(nèi)存塊的大小499 18.3.4 釋放內(nèi)存塊500 18.3.5 銷毀堆500 18.3.6 在C++中使用堆500 18.4 其他堆函數(shù)503 第IV部分 動態(tài)鏈接庫 第19章 DLL基礎(chǔ)509 19.1 DLL和進程的地址空間510 19.2 縱觀全局512 19.2.1 構(gòu)建DLL模塊514 19.2.2 構(gòu)建可執(zhí)行模塊519 19.2.3 運行可執(zhí)行模塊522 第20章 DLL高級技術(shù)524 20.1 DLL模塊的顯式載入和符號鏈接524 20.1.1 顯式地載入DLL模塊525 20.1.2 顯式地卸載DLL模塊529 20.1.3 顯式地鏈接到導(dǎo)出符號532 20.2 DLL的入口點函數(shù)533 20.2.1 DLL_PROCESS_ATTACH 通知534 20.2.2 DLL_PROCESS_DETACH 通知535 20.2.3 DLL_THREAD_ATTACH 通知537 20.2.4 DLL_THREAD_DETACH 通知538 20.2.5 DllMain的序列化調(diào)用538 20.2.6 DllMain和C/C++運行庫541 20.3 延遲載入DLL542 20.4 函數(shù)轉(zhuǎn)發(fā)器553 20.5 已知的DLL553 20.6 DLL重定向555 20.7 模塊的基地址重定位556 20.8 模塊的綁定562 第21章 線程局部存儲區(qū)565 21.1 動態(tài)TLS566 21.2 靜態(tài)TLS570 第22章 DLL注入和API攔截572 22.1 DLL注入的一個例子573 22.2 使用注冊表來注入DLL575 22.3 使用Windows掛鉤來注入DLL576 22.4 使用遠程線程來注入DLL587 22.4.1 Inject Library示例程序591 22.4.2 Image Walk DLL596 22.5 使用木馬DLL來注入DLL598 22.6 把DLL作為調(diào)試器來注入598 22.7 使用CreateProcess來注入代碼599 22.8 API攔截的一個例子599 22.8.1 通過覆蓋代碼來攔截API600 22.8.2 通過修改模塊的導(dǎo)入段來 攔截API601 22.8.3 Last MessageBox Info示例 程序604 第V部分 結(jié)構(gòu)化異常處理 第23章 終止處理程序621 第24章 異常處理程序與軟件異常638 24.1 通過實例理解異常過濾程序 和異常處理程序638 24.1.1 Funcmeister1函數(shù)639 24.1.2 Funcmeister2函數(shù)639 24.2 EXCEPTION_EXECUTE_ HANDLER641 24.2.1 一些有用的例子642 24.2.2 全局展開645 24.2.3 停止全局展開647 24.3 EXCEPTION_CONTINUE_ EXECUTION648 24.4 EXCEPTION_CONTINUE_ SEARCH650 24.5 GetExceptionCode652 24.6 GetExceptionInformation656 24.7 軟件異常659 第25章 未處理異常、向量化異常處理 與C++異常663 25.1 UnhandledExceptionFilter函數(shù) 詳解665 25.2 即時調(diào)試671 25.3 電子表格示例程序673 25.4 向量化異常和繼續(xù)處理程序681 25.5 C++異常與結(jié)構(gòu)化異常的比較683 25.6 異常與調(diào)試器684 第26章 錯誤報告與應(yīng)用程序恢復(fù)688 26.1 Windows錯誤報告控制臺688 26.2 可編程的Windows錯誤報告691 26.3 對進程中所有的問題報告進行 定制693 26.4 問題報告的創(chuàng)建與定制694 26.4.1 創(chuàng)建一個自定義的問題 報告697 26.4.2 設(shè)置報告參數(shù): WerReportSetParameter698 26.4.3 將小型轉(zhuǎn)儲文件放入報告: WerReportAddDump698 26.4.4 將任意文件放入報告: WerReportAddFile699 26.4.5 修改對話框文本: WerReportSetUIOption700 26.4.6 提交錯誤報告: WerReportSubmit700 26.4.7 關(guān)閉問題報告: WerReportCloseHandle702 26.4.8 Customized WER示例 程序702 26.5 應(yīng)用程序的自動重啟與恢復(fù)708 26.5.1 應(yīng)用程序的自動重啟708 26.5.2 對應(yīng)用程序恢復(fù)的支持709 第VI部分 附錄A 構(gòu)建環(huán)境713 附錄B 消息處理宏、子控件宏和API宏724 索引729
你還可能感興趣
我要評論
|