In Windows via C++, Jeffrey Richter and Christophe Nasarre have written the definitive guide to under-the-hood Windows programming with today's Visual C++. (This isn't a shock. Earlier versions of this book, titled Programming Applications for Microsoft Windows and Advanced Windows, respectively, were classics in systems-level Windows programming.)
This new edition has been thoroughly updated for Windows Vista's and Windows Server 2008's important new API features, in areas ranging from threading to security, exception handling to I/O. (There's also coverage of some significant WinXP and Windows Server 2003 API improvements that Richter and Nasarre haven't attended to before.)
Virtually no other authors offer more insight into how Windows really works from a developer's standpoint. Richter and Nasarre range from processes to memory management, DLL injection and API hooking to error reporting and recovery. What's more, their code examples are exceptionally solid: You can really rely on them.
Yes, it's better to prevent bugs, but software must still be carefully debugged, and few Windows programmers are experts at debugging. Mario Hewardt and Daniel Pravat are. In Advanced Windows Debugging, they share literally decades of experience with both the techniques and the tools.
This is a proudly technical book for serious developers who are familiar with (or at least interested in) Windows internals. The authors thoroughly cover core debugging skills, including effective symbol and source file management. Next, they drill down on each type of software flaw: memory corruption (stacks and heaps), IPC problems, resource leaks, application hangs, even "access denied" problems. Part III journeys even further: into the challenges of 64-bit debugging; into debugging problems arising after shipment; into automating testing via custom debugger extensions.
If you really care what your code is doing (and you're serious about quality), there's no substitute for this book.