下載地址:網盤下載程序員
圖書簡介:
編輯
這是一本經典的Windows核心編程指南,從第1版到第5版,引領着數十萬程序員走入Windows開發陣營,培養了大批精英。做爲Windows開發人員的必備參考,本書是爲打算理解Windows的C和C++程序員精心設計的。第5版全面覆蓋Windows XP,Windows Vista和Windows Server 2008中的170個新增函數和Windows特性。書中還講解了Windows系統如何使用這些特性,咱們開發的應用程序又如何充分使用這些特性,如何自行建立新的特性。
[1]
目 錄
編輯
第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
下載地址: 網盤下載