作者簡介
Jeffrey Richter是一位在全球享有盛譽的技術作家,尤其在Windows/.NET領域有著傑出的貢獻。他的第一本Windows著作Windows 3: A Developer's Guide大獲好評,從而聲名遠揚。之後,他又推出了經典著作《Windows 高級編程指南》和《Windows核心編程》。如今這兩本書早已成為Windows程式設計領域的顛峰之作,培育了幾代軟體開發設計人員。他的每一本新作問世,我們都有理由相信這是一本巨著,我們想要的一切盡在其中。Jeffery 是Wintellect公司的創始人之一,也是MSDN雜誌.NET專欄的特邀編輯。。因為他自1999年開始就參與了微軟.NET框架開發組的諮詢工作,與這些一線人員一起經歷了.NET的孕育與誕生,所以他對.NET思想的領悟、對.NET的細節熟稔,是其他任何作家難以企及的。他是.NET著作領域中當之無愧的一面旗幟。
編輯推薦
亮點:長銷不衰的Windows編程經典
權威力作 再度新鮮亮相
名著名譯 彰顯經典魅力
深刻剖析底層實現機理
直擊Windows編程精髓
Windows核心編程(第5版)針對Windows XP,Windows Vista和Windows Server 2008全面修訂。主題廣泛,內容豐富,講解深入而精闢。透過這本Windows編程經典,我們可以在專家的悉心指導下,洞悉Windows編程精華,深入了解高級編程技巧,編寫出高性能的Windows應用程式。
本書重要主題:
如何為32位和64位Windows系統構建和實現應用程式;
如何新建和處理進程與作業;
如何調度.管理、同步和銷毀執行緒;
如何通過I/O完成連線埠執行同步和異步設備I/O操作;
如何使用虛擬記憶體、記憶體映射檔案和堆之類的各種技術來分配記憶體;
如何處理默認調撥的執行緒棧物理存儲;
如何為延遲載入、API攔截和進程注入構建DLL;
如何使用結構化異常處理、Windows錯誤恢復和應用程式重啟等機制。
《微軟技術叢書》包括以下幾個子系列:
從入門到精通:適合新手程式設計師的實用教程;側重於基礎技術和特徵;提供範例檔案。
技術內幕:權威、必備的參考大全;包含豐富、實用的範例代碼;幫助讀者熟練掌握微軟體技術。
高級編程:側重於高級特性、技術和解決問題;包含豐富、適用性強的範例代碼;幫助讀者精通微軟技術。
精通&寶典:著重剖析套用技巧,以幫助提高工作效率;主題包括辦公套用和開發工具。
認證考試教材:完全根據考試要求來闡述每一個知識點;提供可供搜尋的Ebook(英文版)和訓練題;提供實際場景、案例分析和故障診斷實驗。
簡介
本書是講解Windows作業系統內部機制的一本專著。作者從基本概念入手,全面系統地介紹了Windows底層實現機制、Windows應用程式的基本構件(包括進程、執行緒、記憶體管理、動態程式庫、執行緒本地存儲和Unicode)以及各類Windows API等,並列舉了大量應用程式示例,精闢地分析了Windows編程的各個難點和要點,為掌握Windows編程技巧提供了一條有效的捷徑。.
本書適合Windows編程人員參考。...
目錄
譯者序
前言
作譯者簡介
第一部分 程式設計師必讀
第1章 錯誤處理
1.1 自定義錯誤處理的實現
1.2 錯誤顯示例程
第2章 Unicode
2.1字元集
2.1.1 單位元組和雙位元組字元集
2.1.2 Unicode:寬位元組字元集
2.2 為何需要Unicode
2.3 Windows 2000和Unicode
2.4 Windows 98和Unicode
2.5 Windows CE和Unicode
2.6 評論
2.7 關於COM
2.8 如何編寫Unicode原始碼
2.8.1 C運行庫的Unicode支持
2.8.2 Windows定義的Unicode數據類型
2.8.3 Windows系統中的Unicode函式和ANSI函式
2.8.4 Windows字元串函式
2.9 讓應用程式符合ANSI和Unicode規範
2.9.1 Windows字元串函式
2.9.2 資源
2.9.3 確定文本是ANSI型還是Unicode型
2.9.4 在Unicode和ANSI間轉換字元串
第3章核心對象
3.1核心對象的概念
3.1.1 使用計數
3.1.2 安全性
3.2核心對象句柄表
3.2.1 創建核心對象
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 進程的環境變數
4.1.5 親緣性
4.1.6 進程的錯誤模式
4.1.7 當前驅動器和目錄
4.1.8當前目錄
4.1.9 系統版本
4.2 CreateProcess函式
4.2.1 pszApplicationName和pszCommandLine
4.2.2 psaProcess、psaThread和bInheritHandles
4.2.3 fdwCreate
4.2.4 pvEnvironment
4.2.5 pszCurDir
4.2.6 psiStartInfo
4.2.7 ppiProcInfo
4.3 進程的終止
4.3.1主執行緒的入口函式返回
4.3.2 ExitProcess函式
4.3.3 TerminateProcess函式
4.3.4 進程中所有執行緒的運行終止
4.3.5 進程的運行終止
4.4 子進程
4.5 枚舉系統中運行的進程
第5章 作業
5.1 對作業進程的限制
5.2 把進程放入作業
5.3 終止作業中所有進程的運行
5.4 查詢作業統計信息
5.5 作業通知信息
5.6 JobLab示例應用程式
第6章 執行緒的基本知識
6.1 創建執行緒的時機
6.2 何時不能創建執行緒
6.3 編寫第一個執行緒函式
6.4 CreateThread函式
6.4.1 psa
6.4.2 cbStack
6.4.3 pfnStartAddr和pvParam
6.4.4 fdwCreate
6.4.5 pdwThreadID
6.5 終止執行緒
6.5.1 執行緒函式返回
6.5.2 ExitThread函式
6.5.3TerminateThread函式
6.5.4 在進程終止運行時終止執行緒
6.5.5 執行緒終止運行時發生的操作
6.6 執行緒的一些內部細節
6.7 對於C/C++運行時庫的考慮
6.7.1 Oops—錯誤地調用了CreateThread
6.7.2 不該調用的C/C++運行時庫函式
6.8 執行緒的身份標識
第7章 執行緒的調度、優先權和親緣性
7.1 掛起和恢複線程的運行
7.2 進程的掛起和喚醒
7.3 睡眠
7.4 執行緒切換
7.5 執行緒的運行時間
7.6 上下文環境切換
7.7 執行緒優先權
7.8 優先權的抽象說明
7.9 編程優先權
7.9.1 動態提高執行緒的優先權等級
7.9.2 為前台進程調整調度程式
7.9.3 Scheduling Lab示例應用程式
7.10 親緣性
第8章 用戶模式下的執行緒同步
8.1 原子訪問:互鎖函式族
8.2 高速快取行
8.3 高級執行緒同步
8.4臨界區
8.4.1臨界區準確的描述
8.4.2臨界區與循環鎖
8.4.3臨界區與錯誤處理
8.4.4 有用的提示和技巧
第9章 執行緒與核心對象的同步
9.1等待函式
9.2 成功等待的副作用
9.3 事件核心對象
9.4 等待定時器核心對象
9.4.1 用等待定時器給APC項排隊
9.4.2定時器的鬆散特性
9.5信號量核心對象
9.6 互斥核心對象
9.6.1 釋放問題
9.6.2互斥對象與臨界區的比較
9.6.3 Queue應用程式示例
9.7執行緒同步對象表
9.8 其他執行緒同步函式
9.8.1 異步設備I/O
9.8.2WaitForInputIdle
9.8.3 MsgWaitForMultipleObjects(Ex)
9.8.4 WaitForDebugEvent
9.8.5SignalObjectAndWait
第10章執行緒同步工具包
10.1臨界區的實現:Optex
10.2 創建執行緒安全的數據類型和反信號量
10.3 單寫入多讀出程式的保護
10.4 WaitForMultipleExpressions函式的實現
第11章執行緒池
11.1 場景1:異步調用函式
11.2 場景2:按規定的時間間隔調用函式
11.3 場景3:在某個核心對象變為已通知狀態時調用函式
11.4 場景4:異步I/O請求運行完成時調用函式
第12章纖程
12.1 使用纖程
12.2 Counter示例應用程式
第三部分記憶體管理
第13章 Windows記憶體結構
13.1 進程的虛擬地址空間
13.2 虛擬地址空間分區
13.2.1 無效斷點分配分區(適於Windows 2000和Windows 98)
13.2.2MS-DOS/16位Windows應用程式兼容分區(僅適於Windows 98)
13.2.3 用戶模式分區(適用Windows 2000和Windows 98)
13.2.4 64KB禁止進入分區(僅適用於Windows 2000)
13.2.5 共享的MMF分區(僅適用於Windows 98)
13.2.6 核心模式分區(使用於Windows 2000和Windows 98)
13.3地址空間區域
13.4 在地址空間區域中提交物理存儲器
13.5 物理存儲器和頁面檔案
13.6 保護屬性
13.6.1 Copy-On-Write訪問
13.6.2 特殊訪問保護屬性標誌
13.7 綜合使用所有元素
13.7.1 區域的內部詳情
13.7.2 Windows 98上地址空間的差異
13.8 數據對齊的重要性
第14章虛擬記憶體
14.1系統信息
14.2虛擬記憶體的狀態
14.3 確定地址空間狀態
14.3.1 VMQery函式
14.3.2虛擬記憶體表應用程式示例
第15章應用程式中虛擬記憶體的使用
15.1地址空間中保留區域
15.2 在保留區域中提交存儲器
15.3 同時進行保留區域並提交記憶體
15.4 何時提交物理存儲器
15.5 物理存儲器的回收和地址空間區域的釋放
15.5.1 何時回收物理存儲器
15.5.2虛擬記憶體分配示例應用程式
15.6 改變保護屬性
15.7 清除物理存儲器內容
15.8 地址視窗擴展(僅使用於Windows 2000)
第16章 執行緒棧
16.1 Windows 98下的執行緒棧
16.2 C/C++運行時庫中的棧檢測函式
16.3 Summation示例應用程式
第17章記憶體映射檔案
17.1 記憶體映射的執行檔和DLL檔案
17.1.1執行檔或DLL的多個實例之間無法共享的靜態數據
17.1.2 在執行檔或DLL的多個實例之間共享靜態數據
17.1.3 AppInst示例應用程式
17.2 記憶體映射數據檔案
17.2.1 方法1:一個檔案,一個快取
17.2.2 方法2:兩個檔案,一個快取
17.2.3 方法3:一個檔案,兩個快取
17.2.4 方法4:一個檔案,零個快取
17.3 使用記憶體映射檔案
17.3.1 步驟1:創建或打開檔案核心對象
17.3.2 步驟2:創建檔案映射核心對象
17.3.3 步驟3:將檔案數據映射到進程地址空間
17.3.4 步驟4:進程地址空間中撤銷檔案數據的映像
17.3.5 步驟5和步驟6:關閉檔案映射對象和檔案對象
17.3.6 檔案倒序示例應用程式
17.4 使用記憶體映射檔案處理大檔案
17.5記憶體映射檔案的一致性
17.6 設定記憶體映射檔案的基地址
17.7 實現記憶體映射檔案的具體細節
17.8 使用記憶體映射檔案在進程之間實現數據共享
17.9 受頁面檔案支持的記憶體映射檔案
17.10 稀疏提交的記憶體映射檔案
第18章 堆
18.1 進程的默認堆
18.2 創建輔助堆的原因
18.2.1 保護組件
18.2.2 更有效地管理記憶體
18.2.3 進行本地訪問
18.2.4 減少執行緒同步開銷
18.2.5 快速釋放
18.3 創建輔助堆的方法
18.3.1 分配堆中的記憶體塊
18.3.2 改變記憶體塊的大小
18.3.3 獲取記憶體塊的大小
18.3.4 釋放記憶體塊
18.3.5 銷毀堆
18.3.6 用C++程式使用堆
18.4 其他堆函式
第四部分動態程式庫
第19章 DLL基礎
19.1 DLL與進程的地址空間
19.2 DLL的總體運行情況
19.3 創建DLL模組
19.3.1 導出的真正含義
19.3.2 使用非Visual C++工具創建DLL
19.4 創建可執行模組
19.5 運行可執行模組
第20章 DLL高級技術
20.1 顯式載入DLL模組和符號連結
20.1.1 顯式載入DLL模組
20.1.2 顯式卸載DLL模組
20.1.3 顯式連結到導出符號
20.2 DLL的入口函式
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順序調用DllMain
20.2.6 DllMain和C/C++運行時庫
20.3延遲載入DLL
20.4 函式轉發器
20.5 已知的DLL
20.6 DLL重定向
20.7 模組的基址重置
20.8 綁定模組
第21章 執行緒本地存儲
21.1 動態TLS
21.2 靜態TLS
第22章 DLL注入以及API掛接
22.1 DLL注入:一個例子
22.2 使用註冊表注入DLL
22.3 使用Windows鉤子注入DLL
22.4 使用遠程執行緒注入DLL
22.4.1 Inject Library示例應用程式
22.4.2 Image Walk DLL
22.5 使用特洛伊DLL注入DLL
22.6 將DLL作為調試程式注入
22.7 在Windows 98平台上使用記憶體映射檔案注入代碼
22.8 使用CreateProcess來注入代碼
22.9 API掛接:一個例子
22.9.1 通過覆寫代碼實現API掛接
22.9.2 通過操作模組的導入部分來實現API掛接
22.9.3 LastMsgBoxInfo示例應用程式
第五部分結構化異常處理
第23章 終止處理例程
23.1 Funcenstein1
23.2 Funcenstein2
23.3 Funcenstein3
23.4 Funcfurter1
23.5 小測驗:FuncaDoodleDoo
23.6 Funcenstein4
23.7 Funcarama1
23.8 Funcarama2
23.9 Funcarama3
23.10 Funcarama4:最終的邊界
23.11 有關finally塊的說明
23.12 Funcfurter2
23.13 SEH終止示例應用程式
第24章 異常處理程式和軟體異常
24.1 通過例子理解異常過濾器和異常處理程式
24.1.1 Funcmeister1
24.1.2 Funcmeister2
24.2 EXCEPTION_EXECUTE_HANDLER
24.2.1 一些有用的例子
24.2.2 全局展開
24.2.3 暫停全局展開
24.3 EXCEPTION_CONTINUE_EXECUTION
24.4 EXCEPTION_CONTINUE_SEARCH
24.5GetExceptionCode
24.5.1 與記憶體相關的異常
24.5.2 與異常相關的異常
24.5.3 與調試相關的異常
24.5.4 與整數相關的異常
24.5.5 與浮點數相關的異常
24.6 GetExceptionInformation
24.7軟體異常
第25章 未處理異常和C++異常
25.1 即時調試
25.2 關閉異常訊息框
25.2.1 強制進程終止運行
25.2.2 包裝一個執行緒函式
25.2.3 包裝所有的執行緒函式
25.2.4 自動調用調試器
25.3 自己調用UnhandledExceptionFilter
25.4 UnhandledExceptionFilter函式的內部細節
25.5 異常和調試程式
25.6 C++異常與結構化異常比較
第六部分 視窗
第26章 視窗訊息
26.1 執行緒的訊息佇列
26.2 將訊息投送到一個執行緒的訊息佇列中
26.3 向視窗傳送訊息
26.4 喚醒一個執行緒
26.4.1 佇列狀態標誌
26.4.2 從執行緒佇列中提取訊息的算法
26.4.3 使用核心對象或者佇列狀態標誌來喚醒一個執行緒
26.5 使用訊息傳送數據
26.6 Windows處理ANSI/Unicode字元和字元串的方法
第27章 硬體輸入模型與本地輸入狀態
27.1 原始輸入執行緒
27.2 本地輸入狀態
27.2.1 鍵盤輸入和焦點
27.2.2 滑鼠游標管理
27.3 將虛擬輸入佇列和本地輸入狀態相關聯
27.3.1 LISLab示例應用程式
27.3.2 LISWatch示例應用程式
附錄
附錄A 構建環境
附錄B 訊息解析器、子控制項宏以及API宏