Windows 核心編程, 5/e (中文限量版)

[美]傑弗里·李希特 (Jeffrey Richter) [法]克裡斯托弗·納薩雷(Christophe Nasarre)著 周靖 譯

  • 出版商: 清華大學
  • 出版日期: 2022-10-01
  • 售價: $1,536
  • 貴賓價: 9.5$1,459
  • 語言: 簡體中文
  • ISBN: 7302609322
  • ISBN-13: 9787302609322
  • 立即出貨 (庫存=1)

  • Windows 核心編程, 5/e (中文限量版)-preview-1
  • Windows 核心編程, 5/e (中文限量版)-preview-2
  • Windows 核心編程, 5/e (中文限量版)-preview-3
Windows 核心編程, 5/e (中文限量版)-preview-1

買這商品的人也買了...

商品描述

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

目錄大綱

簡明目錄

第I 部分 必 備 知 識

第1 章 錯誤處理     3

第2 章 字符和字符串處理    11

第3 章 內核對象        35

第II 部分 工 作 機 理

第4 章 進程        75

第5 章 作業      139

第6 章 線程基礎       161

第7 章 線程調度、優先級和親和性        191

第8 章 用戶模式下的線程同步    231

第9 章 用內核對象進行線程同步       271

第10 章 同步和異步設備I/O      325

第11 章 Windows 線程池       381

第12 章 纖程     407

第III 部分 內 存 管 理

第13 章 Windows 內存架構     417

第14 章 探索虛擬內存      443

第15 章 在應用程序中使用虛擬內存       469

第16 章 線程棧        505

第17 章 內存映射文件      519

第18 章 堆       581

第IV 部分 動態鏈接庫

第19 章 DLL 基礎     601

第20 章DLL 高級技術  619

第21 章 線程局部存儲      667

第22 章 DLL 註入和API 攔截    675

第V 部分 結構化異常處理

第23 章 終止處理程序       739

第24 章 異常處理程序與軟件異常     761

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

第26 章 錯誤報告與應用程序恢復     821

附 錄

附錄A 生成環境       851

附錄B 消息處理宏、子控件宏和API 宏     865

索引         871

 

詳細目錄

第I 部分 必 備 知 識

第1 章 錯誤處理        3

1.1 定義自己的錯誤碼     7

1.2 ErrorShow 示例程序        8

第2 章 字符和字符串處理   11

2.1 字符編碼     12

2.2 ANSI 字符和Unicode 字符與字符串數據類型         14

2.3 Windows 中的Unicode 和ANSI 函數         16

2.4 C 運行庫中的Unicode 函數和ANSI 函數    19

2.5 C 運行庫中的安全字符串函數      19

2.4.1 初識新的安全字符串函數         20

2.4.2 字符串處理時如何獲得更多控制     24

2.4.3 Windows 字符串函數        26

2.6 為何要用Unicode         27

2.7 推薦的字符和字符串處理方式      28

2.8 Unicode 與ANSI 字符串轉換       29

2.8.1 導出ANSI 和Unicode DLL 函數     31

2.8.2 判斷文本是ANSI 還是Unicode       33

第3 章 內核對象       35

3.1 何為內核對象         35

3.1.1 使用計數      37

3.1.2 安全性         37

3.2 進程的內核對象句柄表        40

3.2.1 創建內核對象          41

3.2.2 關閉內核對象          43

3.3 跨進程邊界共享內核對象     46

3.3.1 使用對象句柄繼承           46

3.3.2 改變句柄的標志       50

3.3.3 為對象命名        51

3.3.4 終端服務命名空間           56

3.3.5 專有命名空間          57

3.3.6 復制對象句柄          66

第II 部分 工 作 機 理

第4 章 進程     75

4.1 編寫第一個Windows 應用程序    76

4.1.1 進程實例句柄          81

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

4.1.3 進程的命令行          84

4.1.4 進程的環境變量       86

4.1.5 進程的親和性          92

4.1.6 進程的錯誤模式       92

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

4.1.8 進程的當前目錄       94

4.1.9 系統版本      95

4.2 CreateProcess 函數         99

4.2.1 pszApplicationName 參數和pszCommandLine 參數    99

4.2.2 參數psaProcess,psaThread 和bInheritHandles       101

4.2.3 fdwCreate 參數       104

4.2.4 pvEnvironment 參數        106

4.2.5 pszCurDir 參數       106

4.2.6 psiStartInfo 參數      106

4.2.7 ppiProcInfo 參數      113

4.3 終止進程         116

4.3.1 主線程的入口點函數返回       116

4.3.2 ExitProcess 函數      116

4.3.3 TerminateProcess 函數      118

4.3.4 當進程中的所有線程終止時         119

4.3.5 當進程終止運行時         119

4.4 子進程      120

4.5 管理員以標準用戶權限運行       122

4.5.1 自動提升進程權限         126

4.5.2 手動提升進程權限         127

4.5.3 何為當前權限上下文       129

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

4.5.5 Process Information 示例程序         132

第5 章 作業          139

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

5.2 將進程放入作業中       151

5.3 終止作業中的所有線程       152

5.4 作業通知         156

5.5 Job Lab 示例程序         158

第6 章 線程基礎      161

6.1 何時創建線程        162

6.2 何時不應該創建線程         164

6.3 編寫第一個線程函數         165

6.4 CreateThread 函數        166

6.4.1 psa 參數      167

6.4.2 cbStackSize 參數     167

6.4.3 pfnStartAddr 參數和pvParam 參數       168

6.4.4 dwCreateFlags 參數         169

6.4.5 pdwThreadID 參數         169

6.5 終止運行線程        170

6.5.1 線程函數返回         170

6.5.2 ExitThread 函數       170

6.5.3 TerminateThread 函數      171

6.5.4 進程終止運行時      171

6.5.5 線程終止運行時      172

6.6 線程內幕         173

6.7 C/C++ 運行庫註意事項       175

6.7.1 用_beginthreadex 而不要用CreateThread 創建線程      185

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

6.8 瞭解自己的身份     187

第7 章 線程調度、優先級和親和性  191

7.1 線程的掛起和恢復       193

7.2 進程的掛起和恢復       194

7.3 睡眠         196

7.4 切換到另一個線程       196

7.5 在超線程CPU 上切換到另一個線程         197

7.6 線程的執行時間     197

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

7.8 線程優先級           207

7.9 從抽象角度看優先級         208

7.10 優先級編程         211

7.10.1 動態提升線程優先級     214

7.10.2 為前臺進程調整調度程序      216

7.10.3 調度I/O 請求優先級      216

7.10.4 Scheduling Lab 示例程序       218

7.11 親和性     224

第8 章 用戶模式下的線程同步      231

8.1 原子訪問:Interlocked 系列函數        232

8.2 高速緩存行           239

8.3 高級線程同步        241

8.4 關鍵段      243

8.4.1 關鍵段:細節         246

8.4.2 關鍵段和自旋鎖      249

8.4.3 關鍵段和錯誤處理         250

8.5 Slim 讀/ 寫鎖        251

8.6 條件變量         254

8.6.1 Queue 示例程序      255

8.6.2 停止線程時的死鎖問題          265

8.6.3 一些有用的技巧和技術          267

第9 章 用內核對象進行線程同步    271

9.1 等待函數         274

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

9.3 事件內核對象        278

9.4 可等待的計時器內核對象          289

9.4.1 讓可等待的計時器入隊APC 調用       293

9.4.2 計時器未盡事宜      295

9.5 信號量內核對象     296

9.6 互斥量內核對象     299

9.6.1 遺棄問題         301

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

9.6.3 Queue 示例程序      302

9.7 線程同步對象速查表         312

9.8 其他線程同步函數       313

9.8.1 異步設備I/O          313

9.8.2 WaitForInputIdle 函數      314

9.8.3 MsgWaitForMultipleObjects(Ex) 函數         315

9.8.4 WaitForDebugEvent 函數         315

9.8.5 SignalObjectAndWait 函數       316

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

第10 章 同步和異步設備I/O         325

10.1 打開和關閉設備         326

10.2 使用文件設備       335

10.2.1 取得文件的大小           335

10.2.2 定位文件指針       337

10.2.3 設置文件尾          339

10.3 執行同步設備I/O           339

10.3.1 將數據回寫到設備        340

10.3.2 同步I/O 取消        340

10.4 異步設備I/O 基礎           342

10.4.1 OVERLAPPED 結構      343

10.4.2 異步設備I/O 的註意事項       345

10.4.3 取消隊列中的設備I/O 請求         347

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

10.5.1 觸發設備內核對象        348

10.5.2 觸發事件內核對象        350

10.5.3 可提醒I/O           353

10.5.4 I/O 完成埠         359

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

第11 章 Windows 線程池      381

11.1 情形1:異步調用函數      382

11.1.1 顯式控制工作項           383

11.1.2 Batch 示例程序      385

11.2 情形2:定時調用函數      389

11.3 情形3:在內核對象觸發時調用函數       395

11.4 情形4:在異步I/O 請求完成時調用函數      397

11.5 回調函數的終止操作        399

11.5.1 對線程池進行定製        400

11.5.2 得體地銷毀線程池:清理組        403

第12 章 纖程        407

第III 部分 內 存 管 理

第13 章 Windows 內存架構        417

13.1 進程的虛擬地址空間        417

13.2 虛擬地址空間的分區        418

13.2.1 空指針賦值分區           419

13.2.2 用戶模式分區       419

13.3 地址空間中的區域           422

13.4 為區域調撥物理存儲        423

13.5 物理存儲和分頁文件        424

13.6 頁面保護屬性         428

13.6.1 寫時復制        429

13.6.2 一些特殊的訪問保護屬性標志     430

13.7 實例分析       430

13.8 數據對齊的重要性           438

第14 章 探索虛擬內存    443

14.1 系統信息       443

14.2 虛擬內存狀態       453

14.3 NUMA 機器中的內存管理       455

14.4 確定地址空間的狀態        458

14.4.1 VMQuery 函數      460

14.4.2 示例程序:虛擬內存映射      466

第15 章 在應用程序中使用虛擬內存      469

15.1 預訂地址空間區域           470

15.2 為預訂的區域調撥物理存儲      472

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

15.4 何時調撥物理存儲           474

15.5 撤銷調撥物理存儲並釋放區域         476

15.5.1 何時撤銷調撥物理存儲         477

15.5.2 虛擬內存分配示例程序         478

15.6 更改保護屬性       487

15.7 重置物理存儲的內容        488

15.8 地址窗口擴展       492

第16 章 線程棧      505

16.1 C/C++ 運行庫的棧檢查函數      510

16.2 Summation 示例程序        512

第17 章 內存映射文件    519

17.1 映射到內存的可執行文件和DLL      520

17.1.1 同一個可執行文件或DLL 的多個實例不會共享靜態數據         521

17.1.2 在同一個可執行文件或DLL 的多個實例間共享靜態數據         523

17.1.3 Application Instances 示例程序     529

17.2 映射到內存的數據文件     533

17.2.1 方法1:一個文件,一個緩沖區   533

17.2.2 方法2:兩個文件,一個緩沖區   534

17.2.3 方法3:一個文件,兩個緩沖區   534

17.2.4 方法4:一個文件,零個緩沖區   534

17.3 使用內存映射文件           535

17.3.1 第1 步:創建或打開文件內核對象         535

17.3.2 第2 步:創建文件映射內核對象       536

17.3.3 第3 步:將文件的數據映射到進程的地址空間     540

17.3.4 第4 步:從進程的地址空間撤銷對文件數據的映射         543

17.3.5 第5 步和第6 步:關閉文件映射對象和文件對象       545

17.3.6 File Reverse 示例程序           546

17.4 用內存映射文件處理大文件      553

17.5 內存映射文件和一致性     555

17.6 為內存映射文件指定基地址      556

17.7 內存映射文件的實現細節         557

17.8 用內存映射文件在進程間共享數據         558

17.9 以分頁文件作為後備存儲的內存映射文件     559

17.10 稀疏調撥的內存映射文件       565

第18 章 堆    581

18.1 進程的默認堆       582

18.2 為什麽要創建額外的堆     583

18.2.1 對組件進行保護           583

18.2.2 更高效的內存管理        584

18.2.3 局部訪問        584

18.2.4 避免線程同步的開銷     585

18.2.5 快速釋放        585

18.3 如何創建額外的堆           585

18.3.1 從堆中分配內存塊        588

18.3.2 調整內存塊的大小        589

18.3.3 獲得內存塊的大小        590

18.3.4 釋放內存塊          590

18.3.5 銷毀堆      591

18.3.6 在C++ 中使用堆          591

18.4 其他堆函數         594

第IV 部分 動態鏈接庫

第19 章 DLL 基礎        601

19.1 DLL 和進程的地址空間           602

19.2 縱觀全局       605

19.2.1 生成DLL 模塊      607

19.2.2 生成可執行模塊           613

19.2.3 運行可執行模塊          616

第20 章 DLL 高級技術    619

20.1 DLL 模塊的顯式加載和符號鏈接      619

20.1.1 顯式加載DLL 模塊       621

20.1.2 顯式卸載DLL 模塊       624

20.1.3 顯式鏈接到導出的符號         627

20.2 DLL 的入口點函數          628

20.2.1 DLL_PROCESS_ATTACH 通知    630

20.2.2 DLL_PROCESS_DETACH 通知    631

20.2.3 DLL_THREAD_ATTACH 通知     633

20.2.4 DLL_THREAD_DETACH 通知     634

20.2.5 DllMain 的序列化調用         635

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

20.3 延遲加載DLL      639

20.4 函數轉發器         652

20.5 已知的DLL         652

20.6 DLL 重定向         654

20.7 模塊的基址重定位           655

20.8 模塊的綁定         662

第21 章 線程局部存儲    667

21.1 動態TLS       668

21.2 靜態TLS       673

第22 章 DLL 註入和API 攔截      675

22.1 DLL 註入的一個例子       676

22.2 使用註冊表來註入DLL           678

22.3 使用Windows 掛鉤來註入DLL        680

22.4 使用遠程線程來註入DLL        694

22.4.1 Inject Library 示例程序         698

22.4.2 Image Walk DLL           705

22.5 使用木馬DLL 來註入DLL       708

22.6 將DLL 作為調試器來註入       708

22.7 使用CreateProcess 來註入代碼         709

22.8 API 攔截的一個例子        709

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

22.8.2 通過修改模塊的導入段來攔截API         711

22.8.3 Last MessageBox Info 示例程序     715

第V 部分 結構化異常處理

第23 章 終止處理程序    739

第24 章 異常處理程序與軟件異常   761

24.1 通過實例理解異常過濾程序和異常處理程序       762

24.1.1 Funcmeister1 函數         762

24.1.2 Funcmeister2 函數         763

24.2 EXCEPTION_EXECUTE_HANDLER      765

24.2.1 一些有用的例子           766

24.2.2 全局展開        769

24.2.3 停止全局展開       772

24.3 EXCEPTION_CONTINUE_EXECUTION       774

24.4 EXCEPTION_CONTINUE_SEARCH       776

24.5 GetExceptionCode           778

24.6 GetExceptionInformation 函數           783

24.7 軟件異常       787

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

25.1 UnhandledExceptionFilter 函數詳解         794

25.2 即時調試       799

25.3 Spreadsheet 示例程序       802

25.4 向量化異常和繼續處理程序      814

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

25.6 異常與調試器       817

第26 章 錯誤報告與應用程序恢復   821

26.1 Windows 錯誤報告控制台         821

26.2 可編程的Windows 錯誤報告    824

26.3 定製進程中的所有問題報告      826

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

26.4.1 創建自定義問題報告     830

26.4.2 設置報告參數:WerReportSetParameter     832

26.4.3 將小型轉儲文件放入報告:WerReportAddDump    832

26.4.4 將任意文件放入報告:WerReportAddFile       833

26.4.5 修改對話框文本:WerReportSetUIOption       834

26.4.6 提交錯誤報告:WerReportSubmit       835

26.4.7 關閉問題報告:WerReportCloseHandle     836

26.4.8 Customized WER 示例程序         837

26.5 應用程序的自動重啟與恢復      845

26.5.1 應用程序的自動重啟     845

26.5.2 應用程序恢復的支持           846

附 錄

附錄A 生成環境      851

附錄B 消息處理宏、子控件宏和API 宏       865

索引      871