出版時間:2008-5 出版社:機械工業(yè)出版社 作者:理查德 頁數(shù):728 譯者:黃隴,李虎
Tag標簽:無
內容概要
本書是講解Windows操作系統(tǒng)內部機制的一本專著。作者從基本概念入手,全面系統(tǒng)地介紹了Windows底層實現(xiàn)機制、Windows應用程序的基本構件(包括進程、線程、內存管理、動態(tài)鏈接庫、線程本地存儲和Unicode)以及各類Windows API等,并列舉了大量應用程序示例,精辟地分析了Windows編程的各個難點和要點,為掌握Windows編程技巧提供了一條有效的捷徑?! ”緯m合Windows編程人員參考。
作者簡介
作者:(美)理查德 譯者:黃隴 李虎Jeffrey Richter,是一位在全球享有盛譽的技術作家,尤其在Windows/.NET領域有著杰出的貢獻。他的第一本Windows著作《Windows 95:A Developer'S Guide》大獲好評,從而聲名遠揚。之后,他又推出了經典著作《Windows高級編程指南》和dWindows核心編程》。如今這兩本書早已成為Windows程序設計領域的經典之作,培育了幾代軟件開發(fā)設計人員。Jeffrey是WinteIIect公司的創(chuàng)始人之一,也是MSDN雜志.NET專欄的特邀編輯。他對Windows思想的領悟、對Windows細節(jié)的熟稔,是其他任何作家難以企及的。他是Windows技術作家中當之無愧的一面旗幟。
書籍目錄
譯者序前言作譯者簡介第一部分 程序員必讀第1章 錯誤處理1.1 自定義錯誤處理的實現(xiàn)1.2 錯誤顯示例程第2章 Unicode2.1 字符集2.1.1 單字節(jié)和雙字節(jié)字符集2.1.2 Unicode:寬字節(jié)字符集2.2 為何需要Unicode2.3 Windows 2000和Unicode2.4 Windows 98和Unicode2.5 Windows CE和Unicode2.6 評論2.7 關于COM2.8 如何編寫Unicode源代碼2.8.1 C運行庫的Unicode支持2.8.2 Windows定義的Unicode數(shù)據(jù)類型2.8.3 Windows系統(tǒng)中的Unicode函數(shù)和ANSI函數(shù)2.8.4 Windows字符串函數(shù)2.9 讓應用程序符合ANSI和Unicode規(guī)范2.9.1 Windows字符串函數(shù)2.9.2 資源2.9.3 確定文本是ANSI型還是Unicode型2.9.4 在Unicode和ANSI間轉換字符串第3章 內核對象3.1 內核對象的概念3.1.1 使用計數(shù)3.1.2 安全性3.2 內核對象句柄表3.2.1 創(chuàng)建內核對象3.2.2 關閉內核對象3.3 進程間內核對象的共享3.3.1 對象句柄的繼承性3.3.2 改變句柄標志3.3.3 命名對象3.3.4 終端服務器命名空間3.3.5 復制對象句柄第二部分 完成編程任務第4章 進程4.1 編寫第一個Windows應用程序4.1.1 進程的實例句柄4.1.2 進程的前一個實例句柄4.1.3 進程的命令行4.1.4 進程的環(huán)境變量4.1.5 親緣性4.1.6 進程的錯誤模式4.1.7 當前驅動器和目錄4.1.8 當前目錄4.1.9 系統(tǒng)版本4.2 CreateProcess函數(shù)4.2.1 pszApplicationName和pszCommandLine4.2.2 psaProcess、psaThread和bInheritHandles4.2.3 fdwCreate4.2.4 pvEnvironment4.2.5 pszCurDir4.2.6 psiStartInfo4.2.7 ppiProcInfo4.3 進程的終止4.3.1 主線程的入口函數(shù)返回4.3.2 ExitProcess函數(shù)4.3.3 TerminateProcess函數(shù)4.3.4 進程中所有線程的運行終止4.3.5 進程的運行終止4.4 子進程4.5 枚舉系統(tǒng)中運行的進程第5章 作業(yè)5.1 對作業(yè)進程的限制5.2 把進程放入作業(yè)5.3 終止作業(yè)中所有進程的運行5.4 查詢作業(yè)統(tǒng)計信息5.5 作業(yè)通知信息5.6 JobLab示例應用程序第6章 線程的基本知識6.1 創(chuàng)建線程的時機6.2 何時不能創(chuàng)建線程6.3 編寫第一個線程函數(shù)6.4 CreateThread函數(shù)6.4.1 psa6.4.2 cbStack6.4.3 pfnStartAddr和pvParam6.4.4 fdwCreate6.4.5 pdwThreadID6.5 終止線程6.5.1 線程函數(shù)返回6.5.2 ExitThread函數(shù)6.5.3 TerminateThread函數(shù)6.5.4 在進程終止運行時終止線程6.5.5 線程終止運行時發(fā)生的操作6.6 線程的一些內部細節(jié)6.7 對于C/C++運行時庫的考慮6.7.1 Oops-錯誤地調用了CreateThread6.7.2 不該調用的C/C++運行時庫函數(shù)6.8 線程的身份標識第7章 線程的調度、優(yōu)先級和親緣性7.1 掛起和恢復線程的運行7.2 進程的掛起和喚醒7.3 睡眠7.4 線程切換7.5 線程的運行時間7.6 上下文環(huán)境切換7.7 線程優(yōu)先級7.8 優(yōu)先級的抽象說明7.9 編程優(yōu)先級7.9.1 動態(tài)提高線程的優(yōu)先級等級7.9.2 為前臺進程調整調度程序7.9.3 Scheduling Lab示例應用程序7.10 親緣性第8章 用戶模式下的線程同步8.1 原子訪問:互鎖函數(shù)族8.2 高速緩存行8.3 高級線程同步8.4 臨界區(qū)8.4.1 臨界區(qū)準確的描述8.4.2 臨界區(qū)與循環(huán)鎖8.4.3 臨界區(qū)與錯誤處理8.4.4 有用的提示和技巧第9章 線程與內核對象的同步9.1 等待函數(shù)9.2 成功等待的副作用9.3 事件內核對象9.4 等待定時器內核對象9.4.1 用等待定時器給APC項排隊9.4.2 定時器的松散特性9.5 信號量內核對象9.6 互斥內核對象9.6.1 釋放問題9.6.2 互斥對象與臨界區(qū)的比較9.6.3 Queue應用程序示例9.7 線程同步對象表9.8 其他線程同步函數(shù)9.8.1 異步設備I/O9.8.2 WaitForInputIdle9.8.3 MsgWaitForMultipleObjects(Ex)9.8.4 WaitForDebugEvent9.8.5 SignalObjectAndWait第10章 線程同步工具包10.1 臨界區(qū)的實現(xiàn):Optex10.2 創(chuàng)建線程安全的數(shù)據(jù)類型和反信號量10.3 單寫入多讀出程序的保護10.4 WaitForMultipleExpressions函數(shù)的實現(xiàn)第11章 線程池11.1 場景1:異步調用函數(shù)11.2 場景2:按規(guī)定的時間間隔調用函數(shù)11.3 場景3:在某個內核對象變?yōu)橐淹ㄖ獱顟B(tài)時調用函數(shù)11.4 場景4:異步I/O請求運行完成時調用函數(shù)第12章 纖程12.1 使用纖程12.2 Counter示例應用程序第三部分 內存管理第13章 Windows內存結構13.1 進程的虛擬地址空間13.2 虛擬地址空間分區(qū)13.2.1 無效斷點分配分區(qū)(適于Windows 2000和Windows 98)13.2.2 MS-DOS/16位Windows應用程序兼容分區(qū)(僅適于Windows 98)13.2.3 用戶模式分區(qū)(適用Windows 2000和Windows 98)13.2.4 64KB禁止進入分區(qū)(僅適用于Windows 2000)13.2.5 共享的MMF分區(qū)(僅適用于Windows 98)13.2.6 內核模式分區(qū)(使用于Windows 2000和Windows 98)13.3 地址空間區(qū)域13.4 在地址空間區(qū)域中提交物理存儲器13.5 物理存儲器和頁面文件13.6 保護屬性13.6.1 Copy-On-Write訪問13.6.2 特殊訪問保護屬性標志13.7 綜合使用所有元素13.7.1 區(qū)域的內部詳情13.7.2 Windows 98上地址空間的差異13.8 數(shù)據(jù)對齊的重要性第14章 虛擬內存14.1 系統(tǒng)信息14.2 虛擬內存的狀態(tài)14.3 確定地址空間狀態(tài)14.3.1 VMQery函數(shù)14.3.2 虛擬內存表應用程序示例第15章 應用程序中虛擬內存的使用15.1 地址空間中保留區(qū)域15.2 在保留區(qū)域中提交存儲器15.3 同時進行保留區(qū)域并提交內存15.4 何時提交物理存儲器15.5 物理存儲器的回收和地址空間區(qū)域的釋放15.5.1 何時回收物理存儲器15.5.2 虛擬內存分配示例應用程序15.6 改變保護屬性15.7 清除物理存儲器內容15.8 地址窗口擴展(僅使用于Windows 2000)第16章 線程棧16.1 Windows 98下的線程棧16.2 C/C++運行時庫中的棧檢測函數(shù)16.3 Summation示例應用程序第17章 內存映射文件17.1 內存映射的可執(zhí)行文件和DLL文件17.1.1 可執(zhí)行文件或DLL的多個實例之間無法共享的靜態(tài)數(shù)據(jù)17.1.2 在可執(zhí)行文件或DLL的多個實例之間共享靜態(tài)數(shù)據(jù)17.1.3 AppInst示例應用程序17.2 內存映射數(shù)據(jù)文件17.2.1 方法1:一個文件,一個緩存17.2.2 方法2:兩個文件,一個緩存17.2.3 方法3:一個文件,兩個緩存17.2.4 方法4:一個文件,零個緩存17.3 使用內存映射文件17.3.1 步驟1:創(chuàng)建或打開文件內核對象17.3.2 步驟2:創(chuàng)建文件映射內核對象17.3.3 步驟3:將文件數(shù)據(jù)映射到進程地址空間17.3.4 步驟4:進程地址空間中撤銷文件數(shù)據(jù)的映像17.3.5 步驟5和步驟6:關閉文件映射對象和文件對象17.3.6 文件倒序示例應用程序17.4 使用內存映射文件處理大文件17.5 內存映射文件的一致性17.6 設定內存映射文件的基地址17.7 實現(xiàn)內存映射文件的具體細節(jié)17.8 使用內存映射文件在進程之間實現(xiàn)數(shù)據(jù)共享17.9 受頁面文件支持的內存映射文件17.10 稀疏提交的內存映射文件第18章 堆18.1 進程的默認堆18.2 創(chuàng)建輔助堆的原因18.2.1 保護組件18.2.2 更有效地管理內存18.2.3 進行本地訪問18.2.4 減少線程同步開銷18.2.5 快速釋放18.3 創(chuàng)建輔助堆的方法18.3.1 分配堆中的內存塊18.3.2 改變內存塊的大小18.3.3 獲取內存塊的大小18.3.4 釋放內存塊18.3.5 銷毀堆18.3.6 用C++程序使用堆18.4 其他堆函數(shù)第四部分 動態(tài)鏈接庫第19章 DLL基礎19.1 DLL與進程的地址空間19.2 DLL的總體運行情況19.3 創(chuàng)建DLL模塊19.3.1 導出的真正含義19.3.2 使用非Visual C++工具創(chuàng)建DLL19.4 創(chuàng)建可執(zhí)行模塊19.5 運行可執(zhí)行模塊第20章 DLL高級技術20.1 顯式加載DLL模塊和符號鏈接20.1.1 顯式加載DLL模塊20.1.2 顯式卸載DLL模塊20.1.3 顯式鏈接到導出符號20.2 DLL的入口函數(shù)20.2.1 DLL_PROCESS_ATTACH通知20.2.2 DLL_PROCESS_DETACH通知20.2.3 DLL_THREAD_ATTACH通知20.2.4 DLL_THREAD_DETACH通知20.2.5 順序調用DllMain20.2.6 DllMain和C/C++運行時庫20.3 延遲加載DLL20.4 函數(shù)轉發(fā)器20.5 已知的DLL20.6 DLL重定向20.7 模塊的基址重置20.8 綁定模塊第21章 線程本地存儲21.1 動態(tài)TLS21.2 靜態(tài)TLS第22章 DLL注入以及API掛接22.1 DLL注入:一個例子22.2 使用注冊表注入DLL22.3 使用Windows鉤子注入DLL22.4 使用遠程線程注入DLL22.4.1 Inject Library示例應用程序22.4.2 Image Walk DLL22.5 使用特洛伊DLL注入DLL22.6 將DLL作為調試程序注入22.7 在Windows 98平臺上使用內存映射文件注入代碼22.8 使用CreateProcess來注入代碼22.9 API掛接:一個例子22.9.1 通過覆寫代碼實現(xiàn)API掛接22.9.2 通過操作模塊的導入部分來實現(xiàn)API掛接22.9.3 LastMsgBoxInfo示例應用程序第五部分 結構化異常處理第23章 終止處理例程23.1 Funcenstein123.2 Funcenstein223.3 Funcenstein323.4 Funcfurter123.5 小測驗:FuncaDoodleDoo23.6 Funcenstein423.7 Funcarama123.8 Funcarama223.9 Funcarama323.10 Funcarama4:最終的邊界23.11 有關finally塊的說明23.12 Funcfurter223.13 SEH終止示例應用程序第24章 異常處理程序和軟件異常24.1 通過例子理解異常過濾器和異常處理程序24.1.1 Funcmeister124.1.2 Funcmeister224.2 EXCEPTION_EXECUTE_HANDLER24.2.1 一些有用的例子24.2.2 全局展開24.2.3 暫停全局展開24.3 EXCEPTION_CONTINUE_EXECUTION24.4 EXCEPTION_CONTINUE_SEARCH24.5 GetExceptionCode24.5.1 與內存相關的異常24.5.2 與異常相關的異常24.5.3 與調試相關的異常24.5.4 與整數(shù)相關的異常24.5.5 與浮點數(shù)相關的異常24.6 GetExceptionInformation24.7 軟件異常第25章 未處理異常和C++異常25.1 即時調試25.2 關閉異常消息框25.2.1 強制進程終止運行25.2.2 包裝一個線程函數(shù)25.2.3 包裝所有的線程函數(shù)25.2.4 自動調用調試器25.3 自己調用UnhandledExceptionFilter25.4 UnhandledExceptionFilter函數(shù)的內部細節(jié)25.5 異常和調試程序25.6 C++異常與結構化異常比較第六部分 窗口第26章 窗口消息26.1 線程的消息隊列26.2 將消息投送到一個線程的消息隊列中26.3 向窗口發(fā)送消息26.4 喚醒一個線程26.4.1 隊列狀態(tài)標志26.4.2 從線程隊列中提取消息的算法26.4.3 使用內核對象或者隊列狀態(tài)標志來喚醒一個線程26.5 使用消息發(fā)送數(shù)據(jù)26.6 Windows處理ANSI/Unicode字符和字符串的方法第27章 硬件輸入模型與本地輸入狀態(tài)27.1 原始輸入線程27.2 本地輸入狀態(tài)27.2.1 鍵盤輸入和焦點27.2.2 鼠標光標管理27.3 將虛擬輸入隊列和本地輸入狀態(tài)相關聯(lián)27.3.1 LISLab示例應用程序27.3.2 LISWatch示例應用程序附錄附錄A 構建環(huán)境附錄B 消息解析器、子控件宏以及API宏
章節(jié)摘錄
第一部分 程序員必讀第1章 錯誤處理在開始學習Windows提供的一些必要特性之前,有必要了解各種Windows函數(shù)是如何進行錯誤處理的。當調用一個Windows函數(shù)時,系統(tǒng)首先驗證傳遞給該函數(shù)的參數(shù)是否有效,然后開始執(zhí)行該函數(shù)的任務。如果函數(shù)接收到一個無效的參數(shù),或者由于其他原因導致該函數(shù)不能執(zhí)行,則通過某種返回值來指示函數(shù)執(zhí)行失敗。表1-1給出了大多數(shù)Windows函數(shù)用到的返回值的數(shù)據(jù)類型。當一個Windows函數(shù)返回一個錯誤代碼時,了解該函數(shù)為何執(zhí)行失敗往往非常有用。微軟公司已經編譯了一系列可能的錯誤代碼,而且為每個錯誤代碼賦予了一個32位的數(shù)字。在系統(tǒng)內部,當一個Windows函數(shù)檢測到一個錯誤時,它常常使用一種稱為線程本地存儲(thread-local storage)的機制來將合適的錯誤代碼號和被調用的線程聯(lián)系起來(線程一本地存儲機制在第21章中討論)。這樣就允許線程之間互相獨立地運行,而不會影響彼此的錯誤代碼。當函數(shù)返回其值后,該返回值會指示發(fā)生了一個錯誤??烧{用GetLastError函數(shù)查看錯誤詳情。
編輯推薦
《經典重讀?Windows核心編程(原書第4版)》幫助讀者:理解Windows操作系統(tǒng)內部機制,精通32位或64位基于Windows的應用程序構件,掌握DLL的本質及其高級技術,使用結構化異常處理創(chuàng)建充分利用內存的應用程序,理解進和線程的實質,精通內存管理,用封裝的可重用代碼工具箱解決常見的線程同步問題,掌握Windows消息循環(huán)的原理。
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載