Windows核心编程(第5版·英文版)

Windows核心编程(第5版·英文版)
作 者: 里克特 纳萨尔
出版社: 人民邮电出版社
丛编项: 图灵程序设计丛书
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: WINDOWS
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  Jeffrey Richter全球享有盛誉的微软技术专家,著名技术咨询和培训公司Wintellect创始人之一,MSDN Magazine杂志特邀编辑。多年来,他担任微软各开发团队顾问,参与了微软的许多关键产品包括各版本Windows、Visual Studio、Microsoft Offce和.NET框架的设计和编程。他撰写了一系列著作,包括本书和《深入理解.NET》(第2版·英文版,人民邮电出版社。2008),都堪称技术图书的典范,影响了一代Windows程序员,并因此荣获微软公司杜区最高技术荣誉“微软软件传奇人物”(Software Legend)称号。

内容简介

书是Windows程序设计领域的名著,涵盖了Windows的最新版本Vista 以及Windows XP的最新内容。书中全面深入地介绍了Windows的各种基本要素,如进程、线程池、虚拟内存、DLL、设备I/O和SEH 等,并列举了大量应用程序,精辟地分析了要素的使用方法。本书适于各层次Windows编程人员阅读。

图书目录

Part I Required Reading

 1 Error Handling  

 Defining Your Own Error Codes  

  The ErrorShow Sample Application  

 2 Working with Characters and Strings  

  Character Encodings  

  ANSI and Unicode Character and String Data Types  

  Unicode and ANSI Functions in Windows  

  Unicode and ANSI Functions in the C Run-Time Library  

  Secure String Functions in the C Run-Time Library  

   Introducing the New Secure String Functions  

   How to Get More Control When Performing String Operations  

   Windows String Functions  

  Why You Should Use Unicode  

  How We Recommend Working with Characters and Strings  

  Translating Strings Between Unicode and ANSI  

   Exporting ANSI and Unicode DLL Functions  

   Determining If Text Is ANSI or Unicode  

 3 Kernel Objects  

  What Is a Kernel Object?  

   Usage Counting  

   Security  

  A Process’ Kernel Object Handle Table  

   Creating a Kernel Object  

   Closing a Kernel Object  

  Sharing Kernel Objects Across Process Boundaries  

   Using Object Handle Inheritance  

   Naming Objects  

   Duplicating Object Handles  

Part II Getting Work Done

 4 Processes  

  Writing Your First Windows Application  

   A Process Instance Handle  

  The CreateProcess Function  

   pszApplicationName and pszCommandLine  

  Terminating a Process  

   The Primary Thread’s Entry-Point Function Returns  

   The ExitProcess Function  

   The TerminateProcess Function  

   When All the Threads in the Process Die  

   When a Process Terminates  

  Child Processes  

   Running Detached Child Processes  

  When Administrator Runs as a Standard User  

   Elevating a Process Automatically  

   Elevating a Process by Hand  

   What Is the Current Privileges Context?  

   Enumerating the Processes Running in the System  

 5 Jobs  

  Placing Restrictions on a Job’s Processes  

  Placing a Process in a Job  

  Terminating All Processes in a Job Querying Job Statistics  

  Job Notifications  

  The Job Lab Sample Application  

6 Thread Basics  

  When to Create a Thread  

  When Not to Create a Thread  

  Writing Your First Thread Function  

  The CreateThread Function  

   psa  

   cbStackSize  

   pfnStartAddr and pvParam  

   dwCreateFlags  

   pdwThreadID  

  Terminating a Thread  

   The Thread Function Returns  

   The ExitThread Function  

   The TerminateThread Function  

   When a Process Terminates  

   When a Thread Terminates  

  Some Thread Internals  

  C/C++ Run-Time Library Considerations  

   Oops—I Called CreateThread Instead of _beginthreadex by Mistake  

   C/C++ Run-Time Library Functions That You Should Never Call  

  Gaining a Sense of One’s Own Identity  

   Converting a Pseudohandle to a Real Handle  

7 Thread Scheduling, Priorities, and Affinities  

  Suspending and Resuming a Thread  

  Suspending and Resuming a Process  

  Sleeping  

  Switching to Another Thread  

  Switching to Another Thread on a Hyper-Threaded CPU  

  A Thread’s Execution Times  

  Putting the CONTEXT in Context  

  Thread Priorities  

  An Abstract View of Priorities  

  Programming Priorities  

   Dynamically Boosting Thread Priority Levels  

   Tweaking the Scheduler for the Foreground Process  

   Scheduling I/O Request Priorities  

   The Scheduling Lab Sample Application  

  Affinities  

8 Thread Synchronization in User Mode  

  Atomic Access: The Interlocked Family of Functions  

  Cache Lines  

  Advanced Thread Synchronization  

   A Technique to Avoid  

  Critical Sections  

   Critical Sections: The Fine Print  

   Critical Sections and Spinlocks  

   Critical Sections and Error Handling  

  Slim Reader-Writer Locks  

  Condition Variables  

   The Queue Sample Application  

   Useful Tips and Techniques  

9 Thread Synchronization with Kernel Objects  

  Wait Functions  

  Successful Wait Side Effects  

  Event Kernel Objects  

   The Handshake Sample Application  

  Waitable Timer Kernel Objects  

   Having Waitable Timers Queue APC Entries  

   Timer Loose Ends  

  Semaphore Kernel Objects  

  Mutex Kernel Objects  

   Abandonment Issues  

   Mutexes vs  Critical Sections  

   The Queue Sample Application  

  A Handy Thread Synchronization Object Chart  

  Other Thread Synchronization Functions  

   Asynchronous Device I/O  

   WaitForInputIdle  

   MsgWaitForMultipleObjects(Ex)  

   WaitForDebugEvent  

   SignalObjectAndWait  

   Detecting Deadlocks with the Wait Chain Traversal API  

10 Synchronous and Asynchronous Device I/O  

  Opening and Closing Devices  

   A Detailed Look at CreateFile  

  Working with File Devices  

   Getting a File’s Size  

   Positioning a File Pointer  

   Setting the End of a File  

  Performing Synchronous Device I/O  

   Flushing Data to the Device  

   Synchronous I/O Cancellation  

  Basics of Asynchronous Device I/O  

   The OVERLAPPED Structure  

   Asynchronous Device I/O Caveats  

   Canceling Queued Device I/O Requests  

  Receiving Completed I/O Request Notifications  

   Signaling a Device Kernel Object  

   Signaling an Event Kernel Object  

   Alertable I/O  

   I/O Completion Ports  

11 The Windows Thread Pool  

  Scenario 1: Call a Function Asynchronously  

   Explicitly Controlling a Work Item  

   The Batch Sample Application  

  Scenario 2: Call a Function at a Timed Interval  

   The Timed Message Box Sample Application  

  Scenario 3: Call a Function When a Single Kernel Object Becomes Signaled  

  Scenario 4: Call a Function When Asynchronous I/O Requests Complete  

  Callback Termination Actions  

   Customized Thread Pools  

   Gracefully Destroying a Thread Pool: Cleanup Groups  

12 Fibers  

  Working with Fibers  

   The Counter Sample Application  

Part III Memory Management

13 Windows Memory Architecture  

  A Process’ Virtual Address Space  

  How a Virtual Address Space Is Partitioned  

   Null-Pointer Assignment Partition  

   User-Mode Partition  

   Kernel-Mode Partition  

  Regions in an Address Space  

  Committing Physical Storage Within a Region  

  Physical Storage and the Paging File  

   Physical Storage Not Maintained in the Paging File  

  Protection Attributes  

   Copy-on-Write Access  

   Special Access Protection Attribute Flags  

  Bringing It All Home  

   Inside the Regions  

  The Importance of Data Alignment  

14 Exploring Virtual Memory  

  System Information  

   The System Information Sample Application  

  Virtual Memory Status  

  Memory Management on NUMA Machines  

   The Virtual Memory Status Sample Application  

  Determining the State of an Address Space  

   The VMQuery Function  

   The Virtual Memory Map Sample Application  

15 Using Virtual Memory in Your Own Applications  

  Reserving a Region in an Address Space  

  Committing Storage in a Reserved Region  

  Reserving a Region and Committing Storage Simultaneously  

  When to Commit Physical Storage  

  Decommitting Physical Storage and Releasing a Region  

   When to Decommit Physical Storage  

   The Virtual Memory Allocation Sample Application  

  Changing Protection Attributes  

  Resetting the Contents of Physical Storage  

   The MemReset Sample Application  

  Address Windowing Extensions  

   The AWE Sample Application  

16 A Thread’s Stack  

  The C/C++ Run-Time Library’s Stack-Checking Function  

  The Summation Sample Application  

17 Memory-Mapped Files  

  Memory-Mapped Executables and DLLs  

   Static Data Is Not Shared by Multiple Instances of an Executable or a DLL  

  Memory-Mapped Data Files  

   Method 1: One File, One Buffer  

   Method 2: Two Files, One Buffer  

   Method 3: One File, Two Buffers  

   Method 4: One File, Zero Buffers  

  Using Memory-Mapped Files  

   Step 1: Creating or Opening a File Kernel Object  

   Step 2: Creating a File-Mapping Kernel Object  

   Step 3: Mapping the File’s Data into the Process’ Address Space  

   Step 4: Unmapping the File’s Data from the Process’ Address Space  

   Steps 5  and 6: Closing the File-Mapping Object and the File Object  

   The File Reverse Sample Application  

  Processing a Big File Using Memory-Mapped Files  

  Memory-Mapped Files and Coherence  

  Specifying the Base Address of a Memory-Mapped File  

  Implementation Details of Memory-Mapped Files  

  Using Memory-Mapped Files to Share Data Among Processes  

  Memory-Mapped Files Backed by the Paging File  

   The Memory-Mapped File Sharing Sample Application  

  Sparsely Committed Memory-Mapped Files  

   The Sparse Memory-Mapped File Sample Application  

18 Heaps  

  A Process’ Default Heap  

  Reasons to Create Additional Heaps  

   Component Protection  

   More Efficient Memory Management  

   Local Access  

   Avoiding Thread Synchronization Overhead  

   Quick Free  

  How to Create an Additional Heap  

   Allocating a Block of Memory from a Heap  

   Changing the Size of a Block  

   Obtaining the Size of a Block  

   Freeing a Block  

   Destroying a Heap  

   Using Heaps with C++  

  Miscellaneous Heap Functions  

Part IV Dynamic-Link Libraries

19 DLL Basics  

  DLLs and a Process’ Address Space  

  The Overall Picture  

   Building the DLL Module  

   Building the Executable Module  

   Running the Executable Module  

20 DLL Advanced Techniques  

  Explicit DLL Module Loading and Symbol Linking  

   Explicitly Loading the DLL Module  

   Explicitly Unloading the DLL Module  

   Explicitly Linking to an Exported Symbol  

  The DLL’s Entry-Point Function  

   The DLL_PROCESS_ATTACH Notification  

   The DLL_PROCESS_DETACH Notification  

   The DLL_THREAD_ATTACH Notification  

   The DLL_THREAD_DETACH Notification  

   Serialized Calls to DllMain  

   DllMain and the C/C++ Run-Time Library  

  Delay-Loading a DLL  

   The DelayLoadApp Sample Application  

  Function Forwarders  

  Known DLLs  

  DLL Redirection  

  Rebasing Modules  

  Binding Modules  

21 Thread-Local Storage  

  Dynamic TLS  

   Using Dynamic TLS  

  Static TLS  

22 DLL Injection and API Hooking  

  DLL Injection: An Example  

  Injecting a DLL Using the Registry  

  Injecting a DLL Using Windows Hooks  

   The Desktop Item Position Saver (DIPS) Utility  

  Injecting a DLL Using Remote Threads  

   The Inject Library Sample Application  

   The Image Walk DLL  

  Injecting a DLL with a Trojan DLL  

  Injecting a DLL as a Debugger  

  Injecting Code with CreateProcess  

  API Hooking: An Example  

   API Hooking by Overwriting Code  

   API Hooking by Manipulating a Module’s Import Section  

   The Last MessageBox Info Sample Application  

Part V Structured Exception Handling

23  Termination Handlers  

  Understanding Termination Handlers by Example  

   Funcenstein1  

   Funcenstein2  

   Funcenstein3  

   Funcfurter1  

   Pop Quiz Time: FuncaDoodleDoo  

   Funcenstein4  

   Funcarama1  

   Funcarama2  

   Funcarama3  

   Funcarama4: The Final Frontier  

   Notes About the finally Block  

   Funcfurter2  

   The SEH Termination Sample Application  

24 Exception Handlers and Software Exceptions  

  Understanding Exception Filters and Exception Handlers by Example  

   Funcmeister1  

   Funcmeister2  

  EXCEPTION_EXECUTE_HANDLER  

   Some Useful Examples  

   Global Unwinds  

   Halting Global Unwinds  

  EXCEPTION_CONTINUE_EXECUTION  

   Use EXCEPTION_CONTINUE_EXECUTION with Caution  

  EXCEPTION_CONTINUE_SEARCH  

  GetExceptionCode  

   Memory-Related Exceptions  

   Exception-Related Exceptions  

   Debugging-Related Exceptions  

   Integer-Related Exceptions  

   Floating Point–Related Exceptions  

  GetExceptionInformation  

  Software Exceptions  

25 Unhandled Exceptions, Vectored Exception Handling, and C++ Exceptions  

  Inside the UnhandledExceptionFilter Function  

   Action #1: Allowing Write Access to a Resource and Continuing Execution  

   Action #2: Notifying a Debugger of the Unhandled Exception  

   Action #3: Notifying Your Globally Set Filter Function  

   Action #4: Notifying a Debugger of the Unhandled Exception (Again)  

   Action #5: Silently Terminating the Process  

   UnhandledExceptionFilter and WER Interactions  

  Just-in-Time Debugging  

  The Spreadsheet Sample Application  

  Vectored Exception and Continue Handlers  

  C++ Exceptions vs  Structured Exceptions  

  Exceptions and the Debugger  

26 Error Reporting and Application Recovery  

  The Windows Error Reporting Console  

  Programmatic Windows Error Reporting  

   Disabling Report Generation and Sending  

  Customizing All Problem Reports Within a Process  

  Creating and Customizing a Problem Report  

   Creating a Custom Problem Report: WerReportCreate  

   Setting Report Parameters: WerReportSetParameter  

   Adding a Minidump File to the Report: WerReportAddDump  

   Adding Arbitrary Files to the Report: WerReportAddFile  

   Modifying Dialog Box Strings: WerReportSetUIOption  

   Submitting a Problem Report: WerReportSubmit  

   Closing a Problem Report: WerReportCloseHandle  

   The Customized WER Sample Application  

  Automatic Application Restart and Recovery  

   Automatic Application Restart  

   Support for Application Recovery  

Part VI Appendixes

A The Build Environment  

  The CmnHdr.h Header File  

   Microsoft Windows Version Build Option  

   Unicode Build Option  

   Windows Definitions and Warning Level 4  

   The pragma message Helper Macro  

   The chINRANGE Macro  

   The chBEGINTHREADEX Macro  

   DebugBreak Improvement for x86  Platforms  

   Creating Software Exception Codes  

   The chMB Macro  

   The chASSERT and chVERIFY Macros  

   The chHANDLE_DLGMSG Macro  

   The chSETDLGICONS Macro  

   Forcing the Linker to Look for a (w)WinMain Entry-Point Function  

   Support XP-Theming of the User Interface with pragma  

B Message Crackers, Child Control Macros, and API Macros  

  Message Crackers  

  Child Control Macros  

  API Macros  

Index