PARTⅠ:REQUIRED READING
CHAPTER ONE ERROR HANDLING
You Can This Too
The ErrorShow Sample Application
CHAPTER TWO UNICODE
Character Sets
Single-Byte and Double-Byte Character Sets
Unicode:The Wide-Byte Character Set
Why You Should Use Unicode
Windows 2000 and Unicode
Windows 98 and Unicode
Windows CE and Unicode
Keeping Score
A Quick Word About COM
How to Write Unicode Source Code
Unicode Support in the C Run-Time Library
Unicode Data Types Defined by Windows
Unicode and ANSI Functions in Winodows
Windows String Functions
Making Your Application ANSI-and Unicode-Ready
Windows String Functions
Resources
Determining If Text Is ANSI or Unicode
Translating Strings Between Unicode and ANSI
CHAPTER THREE KERNEL OBJECTS
What Is a Kernel Object?
Usage Counting
Security
A Process’s Kernel Object Handle Table
Creating a Kernel Object
Closing a Kernel Object
Sharing Kernel Objects Across Process Boundaries
Object Handle Inheritance
Named Objects
Duplicating Object Handles
PARTⅡ:GETTING WORK DONE
CHAPTER FOUR PROCESSES
Writing Your First Windows Application
A Process’s Instance Handle
A Process’s Previous Instance Handle
A Process’s Command Line
A Process’s Environment Variables
A Process’s Affinity
A Process’s Error Mode
A Process’s Current Drive and Directory
The System Version
The CreateProcess Function
pszApplicationName and pszCommandLine
psaProcess,psaThread,and blnheritHandles
fdwCreate
pvEnvironment
pszCurDir
psiStartInfo
ppiProcInfo
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 Process
Running Detached Child Processes
Enumerating the Processes Running in the System
CHAPTER FIVE JOBS
Placing Restrictions on a Job’s Processes
Placing a Process in a Job
Terminating All Processes in a Job
Querying Job Statistics
Job Notifiacations
The JobLab Sample Application
CHAPTER SIX THREAD BASICS
When to Create a Thread
When Not to Create a Thread
Writing Your First Thread Function
The Create Thread Function
psa
cbStack
pfnStartAddr and pbParam
pdwThreadID
Terminating a Thread
The Thread Function Returns
The ExitThread Function
The Terminate Thread 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 Lbbrary Functions That You Should Never Call
Gaining a Sense of One’s Own Identity
Converting a Pseudo-Handle to a Real Handle
CHAPTER SEVER THREAD SCHEDULING,PRIORITIES,AND AFFINITIES
Suspending and Resuming a Thread
Suspending and Resuming a Process
Sleeping
Switching to Another Thread
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
The Scheduling Lab Sample Application
Affinities
CHAPTER EIGHT THREAD SYNCHRONIZATION IN USER MODE
Atomic Access:The Interlocked Family fo 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 Handing
Useful Tips and Techniques
CHAPTER NINE 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.Crivical Sections
The Queue Sample Application
A Handy Thread Synchronization Object Chart
Other Thread Synchronization Functions
Asynchronous Device I/O
WartForInputIdle
MsgWaitForMultipleObjects(Ex)
WaitForDebugEvent
SignalObjectAndWait
CHAPTER TEN THREAD SYNCHRONIZATION TOOLKIT
Implementing a Critical Section:The Optex
The Optex Sample Application
Creating Thread-Safe Datatypes and Inverse Semaphores
The InterlockedType Sample Application
The Single Writer/Multiple Reader Guard(SWMRG)
The SWMRG Sample Application
Implementing a WaitForMultipleExpressions Function
The WaitForMultipleExpressions Sample Application
CHAPTER ELEVER THREAD POOLING
Scenario1:Call Functions Asynchronously
Scenario2:Call Functions at Timed Intervals
The TimedMsgBox Sample Application
Scenario3:Call Functions When Single Kernel Objects Become Signaled
Scenario4:Call Functions When Asynchronous I/O Requests Complete
CHAPTER TWELVE FIBERS
Working with Fibers
The Counter Sample Application
PARTⅢ:MEMORY MANAGEMENT
CHAPTER THIRTEEN WINDOWS MEMORY ARCHITECTURE
A Process’s Virtual Address Space How a Virtual Address Space Is Partitioned
Null-Pointer Assignment Partition(Windows 2000 and Windows 98)
MS-DOS/16-Bit Windows Application Compatibility Partition(Windows 98 Only)
User-Mode Partition (Windows 2000 and Windows 98)
64-KB Off-Limits Partition(Windows 2000 Only)
Shared MMF Partition(Windows 98 Only)
Kernel-Mode Partition(Windows 2000 and Windows 98)
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
Address Space Differences for Windows 98
The Importance of Data Alignment
CHAPTER FOURTEEN EXPLORING VIRTUAL MEMORY
System Information
The System Information Sample Application
Virtual Memory Status
The Virtual Memory Status Sample Application
Determining the State of an Address Space
The VMQuery Function
The Virtual Memory Map Sample Application
CHAPTER FIFTEEN 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(Windows 2000 only)
The AWE Sample Application
CHAPTER SIXTEEN A THREAD’S STACK
A Thread’s Stack Under Window 98
The C/C++Run-Time Library’s Stack-Checking Function
The Summation Sample Application
CHAPTER SEVENTEEN MEMORY-MAPPED FILES
Memory-Mapped Executables and DLLS
Static Data Is Not Shared by Multiple Instances of an Executable or a DLL
Sharing Static Data Across Multiple Instances of an Executable or a DLL
The AppInst Sample Application
Memory-Mapped Data Files
Method1:One File,One Buffer
Method2:Two File,One Buffer
Method3:One File,Two Buffer
Method4:One File,Zero Buffers
Using Memory-Mapped Files
Step1:Creating or Opening a File Kernel Object
Step2:Creating a File-Mapping Kernel Object
Step3:Mapping the File’s Data into the Process’s Address Space
Step4:Unmapping the File’s Data from the Process’s Address Space
Step5 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 Shore 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
CHAPTER EIGHTEEN HEAPS
A Proess’s 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++
PARTⅣ:DYNAMIC-LINK LIBRARIES
CHAPTER NINETEEN DLL BASICS
DLLs and a Process’s Address Space
The Overall Picture
Building the DLL Module
What Exporting Really Means
Creating DLLs for Use with Non-Visual C++ Tools
Building the Executable Module
What Importing Really Means
Running the Executable Module
CHAPTER TWENTY 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_DETCH Notification
The DLL_THREAD_ATTACH Notification
The DLL_THREAD_DETACH Notification
Serialized Calls to D//Main
D//Main and the C/C++ Run-Time Library
Delay-Loading a DLL
The DelayLoadApp Sample Application
Function Forwarders
Known DLLs
DLL Redirection
Rebasing Modules
Bind Modules
CHAPTER TWENTY-ONE THREAD-LOCAL STORAGE
Dynamic TLS
Using Dynamic TLS
Static TLS
CHAPTER TWENTY-TWO DLL INJECTION AND API HOOKING
DLL Injection:An Example
Injecting a DLL Using the Rgistry
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 a Memory-Mapped File on Windows 98
Injecting Code with CreateProcess
API Hooking:An Example
API Hooking by Overwriting Code
API Hooking by Module’s Import Section
The LastMsgBoxInfo Sample Application
PARTⅤ:STRUCTURED EXCEPTION HANDLING
CHAPTER TWENTY-THREE 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
CHAPTER TWENTY-FOUR EXCEPTION HANDLERS AND SOFTWARE EXCEPTIONS
Understanding Exception Filters and Exception Handlers by Example
Funcmeister1
Funcmeister2
EXCEPTION_EXECUTE_HANDLER
Some Useful Examples
Golbal Unwinds
Halting Golbal Unwinds
EXCEPTION_CONTINUE_EXECUTION
Use EXCEPTION_CONTINUE_EXECUTION with Caution
EXCEPTION_CONTINUE_SEARCH
GetExceptinCode
Memory-Related Exceptions
Exception-Related Exceptions
Debugging-Related Exceptions
Integer-Related Exceptions
Floating Point-Related Exceptions
GetExceptionInfomation
Software Exceptions
CHAPTER TWENTY-FIVE NUHANDLED EXCEPTIONS AND C++ EXCEPTIONS
Just-In-Time Debugging
Turning off the Exception Message Box
Forcing the Process to Die
Wrapping a Thread Function
Wrapping All Thread Functions
Automatically Invoking the Debugger
Calling UnhandledExceptionFilter Yourself
Inside the UnhandledExceptionFilter Function
Exceptions and the Debugger
The Spreadsheet Sample Application
C++ Exceptions Versus Structured Exceptions
Catching Structured Exceptions with C++
PARTⅥ:WINDOWING
CHAPTER TWENTY-SIX WINDOW MESSAGING
A Thread’s Message Queue
Posting Messages to a Thread’s Message Queue
Sending Messages to a Window
Waking a Thread
The Queue Status Flags
The Algorithm for Extracting Messages from a Thread’s Queue
Waking a Thread with Kernel Objects or with Queue Status Flags
Sending Data with Messages
The CopyData Sample Application
How Windows Handle ANSI/Unicode Characters and Strings
CHAPTER TWENTY-SEVEN THE HARDWARE INPUT MODEL AND LOCAL INPUT STATE
The Raw Input Thread
Local Input State
Keyboard Input and Focus
Mouse Cursor Management
Attaching Virtualized Input Queues and Local Input State Together
The Local Input State Laboratory(LISLab) Sample Application
The Local Input State Watch(LISWatch)Sample Application
APPENDIX A THE BUILD ENVIRONMENT
The CmnHdr.h Header File
Windows Version Build Option
Unicode Build Option
Windows Definitions and Warning Level 4
The Pragma Message Helper Macro
The chINRANGE and chDIMOF Macros
The chBEGINTHREADEX Macro
DebugBreak Improvement for 86 Platforms
Creating Software Exception Codes
The chMB Macro
The chASSERT and chVERIFY Macros
The chHANDLE_DLGMSG Macro
The chSETDLGICONS Macro
The OS Version Check Inline Finctions
Making Sure the Host System Supports Unicode
Forcing the Linker to Look for a(w)WinMain Entry-Point Function
APPENDIX B MESSAGE CRACKERS,CHILD CONTROL MACROS,AND API MACROS
Message Crackers
Child Control Macros
API Macros
Index