Windows核心編程(第5版)

Windows核心編程(第5版)

《Windows核心編程(第5版)》是一本正文語種為簡體中文的書籍。這是一本經典的Windows核心編程指南,從第1版到第5版,引領著數十萬程式設計師走入Windows開發陣營,培養了大批精英。

圖書簡介:

Windows核心編程(第5版) Windows核心編程(第5版)

這是一本經典的Windows核心編程指南,從第1版到第5版,引領著數十萬程式設計師走入Windows開發陣營,培養了大批精英。作為Windows開發人員的必備參考,本書是為打算理解Windows的C和C++程式設計師精心設計的。第5版全面覆蓋Windows XP,Windows Vista和Windows Server 2008中的170個新增函式和Windows特性。書中還講解了Windows系統如何使用這些特性,我們開發的應用程式又如何充分使用這些特性,如何自行創建新的特性。

目 錄

第I部分 必備 知 識

第1章 錯誤處理 3

1.1 定義自己的錯誤代碼 7

1.2 ErrorShow示例程式 7

第2章 字元和字元串處理 10

2.1 字元編碼 11

2.2 ANSI字元和Unicode字元與字元串數據類型 12

2.3 Windows中的Unicode函式和ANSI函式 14

2.4 C運行庫中的Unicode函式和ANSI函式 16

2.5 C運行庫中的安全字元串函式 17

2.5.1 初識新的安全字元串函式 18

2.5.2 在處理字元串時如何獲得更多控制 21

2.5.3 Windows字元串函式 23

2.6 為何要用Unicode 24

2.7 推薦的字元和字元串處理方式 25

2.8 Unicode與ANSI字元串轉換 26

2.8.1 導出ANSI和Unicode DLL函式 28

2.8.2 判斷文本是ANSI還是Unicode 29

第3章 核心對象 32

3.1 何為核心對象 32

3.1.1 使用計數 34

3.1.2 核心對象的安全性 34

3.2 進程核心對象句柄表 36

3.2.1 創建一個核心對象 37

3.2.2 關閉核心對象 38

3.3 跨進程邊界共享核心對象 42

3.3.1 使用對象句柄繼承 42

3.3.2 改變句柄的標誌 45

3.3.3 為對象命名 46

3.3.4 終端服務命名空間 50

3.3.5 專有命名空間 51

3.3.6 複製對象句柄 58

第II部分 工作 機 理

第4章 進程 65

4.1 編寫第一個Windows應用程式 66

4.1.1 進程實例句柄 71

4.1.2 進程前一個實例的句柄 72

4.1.3 進程的命令行 73

4.1.4 進程的環境變數 74

4.1.5 進程的關聯性 79

4.1.6 進程的錯誤模式 79

4.1.7 進程當前所在的驅動器和目錄 80

4.1.8 進程的當前目錄 81

4.1.9 系統版本 82

4.2 CreateProcess函式 85

4.2.1 pszApplicationName和pszCommandLine參數 86

4.2.2 psaProcess,psaThread

和bInheritHandles參數 87

4.2.3 fdwCreate參數 89

4.2.4 pvEnvironment參數 91

4.2.5 pszCurDir參數 92

4.2.6 psiStartInfo參數 92

4.2.7 ppiProcInfo參數 98

4.3 終止進程 100

4.3.1 主執行緒的入口點函式返回 100

4.3.2 ExitProcess函式 101

4.3.3 TerminateProcess函式 102

4.3.4 當進程中的所有執行緒終止時 103

4.3.5 當進程終止運行時 103

4.4 子進程 104

4.5 管理員以標準用戶許可權運行時 106

4.5.1 自動提升進程的許可權 109

4.5.2 手動提升進程的許可權 111

4.5.3 何為當前許可權上下文 112

4.5.4 枚舉系統中正在運行的進程 114

4.5.5 Process Information示例程式 115

第5章 作業 121

5.1 對作業中的進程施加限制 124

5.2 將進程放入作業中 131

5.3 終止作業中的所有執行緒 132

5.4 作業通知 135

5.5 Job Lab示例程式 138

第6章 執行緒基礎 140

6.1 何時創建執行緒 141

6.2 何時不應該創建執行緒 143

6.3 編寫第一個執行緒函式 144

6.4 CreateThread函式 144

6.4.1 psa參數 145

6.4.2 cbStackSize參數 145

6.4.3 pfnStartAddr和pvParam參數 146

6.4.4 dwCreateFlags 147

6.4.5 pdwThreadID 147

6.5 終止運行執行緒 148

6.5.1 執行緒函式返回 148

6.5.2 ExitThread函式 148

6.5.3 TerminateThread函式 149

6.5.4 進程終止運行時 149

6.5.5 執行緒終止運行時 150

6.6 執行緒內幕 150

6.7 C/C++運行庫注意事項 153

6.7.1 用_beginthreadex而不要用

CreateThread創建執行緒 161

6.7.2 絕對不應該調用的C/C++運行庫函式 161

6.8 了解自己的身份 162

第7章 執行緒調度、優先權和關聯性 165

7.1 執行緒的掛起和恢復 166

7.2 進程的掛起和恢復 167

7.3 睡眠 169

7.4 切換到另一個執行緒 169

7.5 在超執行緒CPU上切換到另一個執行緒 170

7.6 執行緒的執行時間 170

7.7 在實際上下文中談CONTEXT結構 174

7.8 執行緒優先權 178

7.9 從抽象角度看優先權 179

7.10 優先權編程 182

7.10.1 動態提升執行緒優先權 185

7.10.2 為前台進程微調調度程式 186

7.10.3 調度I/O請求優先權 186

7.10.4 Scheduling Lab 示例程式 188

7.11 關聯性 192

第8章 用戶模式下的執行緒同步 197

8.1 原子訪問:Interlocked系列函式 198

8.2 高速快取行 203

8.3 高級執行緒同步 205

8.4 關鍵段 207

8.4.1 關鍵段:細節 209

8.4.2 關鍵段和旋轉鎖 212

8.4.3 關鍵段和錯誤處理 213

8.5 Slim讀/寫鎖 214

8.6 條件變數 217

8.6.1 Queue示例程式 218

8.6.2 在停止執行緒時的死鎖問題 225

8.6.3 一些有用的竅門和技巧 227

第9章 用核心對象進行執行緒同步 230

9.1 等待函式 232

9.2 等待成功所引起的副作用 235

9.3 事件核心對象 236

9.4 可等待的計時器核心對象 245

9.4.1 讓可等待的計時器添加APC調用 248

9.4.2 計時器的剩餘問題 250

9.5 信號量核心對象 251

9.6 互斥量核心對象 253

9.6.1 遺棄問題 255

9.6.2 互斥量與關鍵段的比較 256

9.6.3 Queue示例程式 256

9.7 執行緒同步對象速查表 264

9.8 其他的執行緒同步函式 265

9.8.1 異步設備I/O 265

9.8.2 WaitForInputIdle函式 265

9.8.3 MsgWaitForMultipleObjects(Ex)函式 266

9.8.4 WaitForDebugEvent函式 267

9.8.5 SignalObjectAndWait函式 267

9.8.6 使用等待鏈遍歷API來檢測死鎖 268

第10章 同步設備I/O與異步設備I/O 275

10.1 打開和關閉設備 276

10.2 使用檔案設備 285

10.2.1 取得檔案的大小 285

10.2.2 設定檔案指針的位置 286

10.2.3 設定檔案尾 288

10.3 執行同步設備I/O 289

10.3.1 將數據刷新至設備 289

10.3.2 同步I/O的取消 290

10.4 異步設備I/O基礎 291

10.4.1 OVERLAPPED結構 292

10.4.2 異步設備I/O的注意事項 294

10.4.3 取消佇列中的設備I/O請求 296

10.5 接收I/O請求完成通知 296

10.5.1 觸發設備核心對象 297

10.5.2 觸發事件核心對象 298

10.5.3 可提醒I/O 301

10.5.4 I/O完成連線埠 306

10.5.5 模擬已完成的I/O請求 316

第11章 Windows執行緒池 324

11.1 情形1:以異步方式調用函式 325

11.1.1 顯式地控制工作項 325

11.1.2 Batch示例程式 327

11.2 情形2:每隔一段時間調用一個函式 330

11.3 情形3:在核心對象觸發時調用一個函式 335

11.4 情形4:在異步I/O請求完成時調用一個函式 337

11.5 回調函式的終止操作 339

11.5.1 對執行緒池進行定製 340

11.5.2 得體地銷毀執行緒池:清理組 342

第12章 纖程 345

第III部分 內 存 管 理

第13章 Windows記憶體體系結構 355

13.1 進程的虛擬地址空間 355

13.2 虛擬地址空間的分區 356

13.2.1 空指針賦值分區 357

13.2.2 用戶模式分區 357

13.3 地址空間中的區域 360

13.4 給區域調撥物理存儲器 361

13.5 物理存儲器和頁交換檔案 362

13.6 頁面保護屬性 365

13.6.1 寫時複製 366

13.6.2 一些特殊的訪問保護屬性標誌 367

13.7 實例分析 367

13.8 數據對齊的重要性 375

第14章 探索虛擬記憶體 379

14.1 系統信息 379

14.2 虛擬記憶體狀態 387

14.3 NUMA機器中的記憶體管理 388

14.4 確定地址空間的狀態 391

14.4.1 VMQuery函式 392

14.4.2 示例程式:虛擬記憶體映射 397

第15章 在應用程式中使用虛擬記憶體 400

15.1 預訂地址空間區域 400

15.2 給區域調撥物理存儲器 402

15.3 同時預訂和調撥物理存儲器 403

15.4 何時調撥物理存儲器 405

15.5 撤銷調撥物理存儲器及釋放區域 407

15.5.1 何時撤銷調撥物理存儲器 407

15.5.2 虛擬記憶體分配示例程式 408

15.6 改變保護屬性 414

15.7 重置物理存儲器的內容 415

15.8 地址視窗擴展 419

第16章 執行緒棧 429

16.1 C/C++運行庫的棧檢查函式 433

16.2 Summation示例程式 435

第17章 記憶體映射檔案 440

17.1 映射到記憶體的執行檔和DLL 441

17.1.1 同一個執行檔或DLL的多個實例不會共享靜態

數據 442

17.1.2 在同一個執行檔或DLL的多個實例間共享靜態

數據 444

17.1.3 Application Instances示例程式 449

17.2 映射到記憶體的數據檔案 451

17.2.1 方法1:一個檔案,一塊快取 451

17.2.2 方法2:兩個檔案,一塊快取 452

17.2.3 方法3:一個檔案,兩塊快取 452

17.2.4 方法4:一個檔案,零個快取 453

17.3 使用記憶體映射檔案 453

17.3.1 第1步:創建或打開檔案核心對象 454

17.3.2 第2步:創建檔案映射核心對象 455

17.3.3 第3步:將檔案的數據映射到進程的地址空間 458

17.3.4 第4步:從進程的地址空間撤銷對檔案數據的映射 461

17.3.5 第5步和第6步:關閉檔案映射對象和檔案對象 462

17.3.6 File Reverse示例程式 463

17.4 用記憶體映射檔案來處理大檔案 469

17.5 記憶體映射檔案和一致性 470

17.6 給記憶體映射檔案指定基地址 471

17.7 記憶體映射檔案的實現細節 472

17.8 用記憶體映射檔案在進程間共享數據 473

17.9 以頁交換檔案為後備存儲器的記憶體映射檔案 474

17.10 稀疏調撥的記憶體映射檔案 478

第18章 堆 491

18.1 進程的默認堆 491

18.2 為什麼要創建額外的堆 492

18.2.1 對組件進行保護 493

18.2.2 更有效的記憶體管理 493

18.2.3 使記憶體訪問局部化 494

18.2.4 避免執行緒同步的開銷 494

18.2.5 快速釋放 495

18.3 如何創建額外的堆 495

18.3.1 從堆中分配記憶體塊 497

18.3.2 調整記憶體塊的大小 498

18.3.3 獲得記憶體塊的大小 499

18.3.4 釋放記憶體塊 500

18.3.5 銷毀堆 500

18.3.6 在C++中使用堆 500

18.4 其他堆函式 503

第IV部分 動態程式庫

第19章 DLL基礎 509

19.1 DLL和進程的地址空間 510

19.2 縱觀全局 512

19.2.1 構建DLL模組 514

19.2.2 構建可執行模組 519

19.2.3 運行可執行模組 522

第20章 DLL高級技術 524

20.1 DLL模組的顯式載入和符號連結 524

20.1.1 顯式地載入DLL模組 525

20.1.2 顯式地卸載DLL模組 529

20.1.3 顯式地連結到導出符號 532

20.2 DLL的入口點函式 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的序列化調用 538

20.2.6 DllMain和C/C++運行庫 541

20.3 延遲載入DLL 542

20.4 函式轉發器 553

20.5 已知的DLL 553

20.6 DLL重定向 555

20.7 模組的基地址重定位 556

20.8 模組的綁定 562

第21章 執行緒局部存儲區 565

21.1 動態TLS 566

21.2 靜態TLS 570

第22章 DLL注入和API攔截 572

22.1 DLL注入的一個例子 573

22.2 使用註冊表來注入DLL 575

22.3 使用Windows掛鈎來注入DLL 576

22.4 使用遠程執行緒來注入DLL 587

22.4.1 Inject Library示例程式 591

22.4.2 Image Walk DLL 596

22.5 使用木馬DLL來注入DLL 598

22.6 把DLL作為調試器來注入 598

22.7 使用CreateProcess來注入代碼 599

22.8 API攔截的一個例子 599

22.8.1 通過覆蓋代碼來攔截API 600

22.8.2 通過修改模組的導入段來攔截API 601

22.8.3 Last MessageBox Info示例程式 604

第V部分 結構化異常處理

第23章 終止處理程式 621

第24章 異常處理程式與軟體異常 638

24.1 通過實例理解異常過濾程式

和異常處理程式 638

24.1.1 Funcmeister1函式 639

24.1.2 Funcmeister2函式 639

24.2 EXCEPTION_EXECUTE_HANDLER 641

24.2.1 一些有用的例子 642

24.2.2 全局展開 645

24.2.3 停止全局展開 647

24.3 EXCEPTION_CONTINUE_EXECUTION 648

24.4 EXCEPTION_CONTINUE_SEARCH 650

24.5 GetExceptionCode 652

24.6 GetExceptionInformation 656

24.7 軟體異常 659

第25章 未處理異常、向量化異常處理與C++異常 663

25.1 UnhandledExceptionFilter函式詳解 665

25.2 即時調試 671

25.3 電子表格示例程式 673

25.4 向量化異常和繼續處理程式 681

25.5 C++異常與結構化異常的比較 683

25.6 異常與調試器 684

第26章 錯誤報告與應用程式恢復 688

26.1 Windows錯誤報告控制台 688

26.2 可程式的Windows錯誤報告 691

26.3 對進程中所有的問題報告進行定製 693

26.4 問題報告的創建與定製 694

26.4.1 創建一個自定義的問題報告 697

26.4.2 設定報告參數:

WerReportSetParameter 698

26.4.3 將小型轉儲檔案放入報告:WerReportAddDump 698

26.4.4 將任意檔案放入報告:WerReportAddFile 699

26.4.5 修改對話框文本:WerReportSetUIOption 700

26.4.6 提交錯誤報告:WerReportSubmit 700

26.4.7 關閉問題報告:WerReportCloseHandle 702

26.4.8 Customized WER示例程式 702

26.5 應用程式的自動重啟與恢復 708

26.5.1 應用程式的自動重啟 708

26.5.2 對應用程式恢復的支持 709

第VI部分

附錄A 構建環境 713

附錄B 訊息處理宏、子控制項宏和API宏 724

索引 729

相關詞條

熱門詞條

聯絡我們