driver-debugging

v2026.09.24

Windows driver debugging end-to-end: WinDbg / WinDbg-Preview, KDNET kernel debugging setup over Ethernet/USB, Driver Verifier, Application Verifier (UMDF), bugcheck analysis with !analyze -v, common kernel commands (!process, !thread, !irp, !devstack, !wdfdevice, !wdfkd.wdfdriverinfo), live and post-mortem (kernel dumps), symbol setup, and WPP / ETW trace analysis. USE WHEN: user mentions "WinDbg", "kd", "KDNET", "kernel debugger", "Driver Verifier", "verifier.exe", "Application Verifier", "appverif", "!analyze", "!irp", "bugcheck", "0x9f DRIVER_POWER_STATE_FAILURE", "kernel dump", "MEMORY.DMP", "DebugView", "tracefmt", "tracerpt", "WPP decode" DO NOT USE FOR: Visual Studio managed/.NET debugging, web app debugging

GitHub
Install command
npx skhub add claude-dev-suite/driver-debugging
Markdown
SKILL.md

Windows Driver Debugging - Quick Reference

Deep Knowledge: Use mcp__documentation__fetch_docs with technology: driver-debugging. Authoritative source: learn.microsoft.com/en-us/windows-hardware/drivers/debugger/.

Setup checklist (one-time per test machine pair)

  1. Two machines: HOST (debugger, WinDbg) + TARGET (the machine running the driver)
  2. Same OS bitness, both on the same private network (or USB 3 debug cable, or serial — Ethernet via KDNET is the modern default)
  3. On TARGET, enable kernel debugging:
    bcdedit /debug on
    bcdedit /dbgsettings net hostip:<HOST_IP> port:50000 key:1.2.3.4
    bcdedit /set testsigning on        ; if loading test-signed drivers
    
    bcdedit prints the debug key — copy it to HOST.
  4. Reboot TARGET — it now waits for HOST early in boot (or run live)
  5. On HOST: WinDbg → File → Attach to Kernel → Net → port 50000, paste key
  6. Symbols: set _NT_SYMBOL_PATH=srv*c:\symbols*https://msdl.microsoft.com/download/symbols (and add your driver's .pdb path)

Driver Verifier (use this every dev/test session)

Configure on TARGET:

verifier /standard /driver MyDriver.sys
verifier /flags 0x209BB /driver MyDriver.sys     ; common production-like set
verifier /query                                   ; show current state
verifier /reset                                   ; turn off

Standard rules catch: pool corruption, IRQL violations, low resources simulation, leaked references, deadlock detection, DMA verification.

Cost: ~10–20% perf hit, occasional artificial low-memory failures. Worth it — the bugs Verifier finds are bugs that ship.

WinDbg essentials

CommandPurpose
g / gu / t / pgo / step out / step in / step over
bp <addr> / bm <pat>software / module breakpoint
bc *clear all breakpoints
k / kn / kpcall stack / numbered / with parameters
!analyze -vbugcheck root-cause first stop
!process 0 0list every process
!process 0 7 myapp.exedump all threads + stacks of myapp.exe
!thread <addr>inspect a _KTHREAD
!irp <addr>decode an IRP (driver stack, status, params)
!devstack <devobj>show device stack for a _DEVICE_OBJECT
!devnode 0 1the entire PnP devnode tree
!wdfkd.wdfdriverinfo MyDriverWDF metadata about your driver (load wdfkd.dll)
!wdfkd.wdfdevice <wdfdevice>WDF device internals (queues, refs, callbacks)
!locks / !qlocksheld kernel locks
!pool <addr>identify a pool block (tag, size)
!poolused 4 <tag>who allocated under this pool tag
dt nt!_EPROCESS <addr>typed structure dump

Bugcheck analysis flow

  1. !analyze -v — get the proposed culprit, parameters, faulting stack
  2. Cross-check with bugcheck reference (e.g. 0xC4 = Driver Verifier detected violation, 0x9F = power state failure, 0xD1 = DRIVER_IRQL_NOT_LESS_OR_EQUAL)
  3. kP for full stack with parameters
  4. !irp <faulting irp> if an IRP is involved (very common for 0xD1)
  5. Inspect the suspect driver:
    • lm vm MyDriver — module info, build time
    • !for_each_module .if (...) to script
  6. Reproduce with Driver Verifier if not already on — it often changes a wild crash into a precise assertion

Common bugchecks tied to driver mistakes

CodeNameUsual cause
0xAIRQL_NOT_LESS_OR_EQUALTouched paged data at DISPATCH_LEVEL or freed memory
0x1EKMODE_EXCEPTION_NOT_HANDLEDUnhandled SEH in kernel; often null deref
0x9FDRIVER_POWER_STATE_FAILUREDriver didn't complete a Pnp/Power IRP within timeout
0xC2BAD_POOL_CALLERWrong pool free, double-free, wrong tag
0xC4DRIVER_VERIFIER_DETECTED_VIOLATIONVerifier rule fired — read parameter 1 for the rule
0xC9DRIVER_VERIFIER_IOMANAGER_VIOLATIONI/O misuse caught by Verifier (most common: incomplete IRP)
0xD1DRIVER_IRQL_NOT_LESS_OR_EQUALPageable code/data at DISPATCH_LEVEL
0x139KERNEL_SECURITY_CHECK_FAILUREStack canary / CFG / control-flow integrity violation
0x1AAEXCEPTION_ON_INVALID_STACKStack corruption

Live remote inspection (no break)

.reload /f                         ; refresh symbols
!process 0 17                       ; very verbose process list
!thread <tid>                       ; current thread
.dump /ma C:\target.dmp              ; full memory dump for offline analysis

Post-mortem (MEMORY.DMP)

Configure TARGET to write a kernel/full dump:

  • System Properties → Advanced → Startup and Recovery → Write debugging information → Kernel memory dump (or Complete for big repros)
  • After bugcheck, %SystemRoot%\MEMORY.DMP is created — open with WinDbg → Open Crash Dump

Application Verifier (UMDF)

For UMDF drivers (and the user-mode services that talk to them), use appverif.exe:

appverif /verify WUDFHost.exe                  ; full UMDF host coverage
appverif /verify mytestapp.exe /faults          ; with fault injection

Catches handle leaks, heap corruption, double-frees, lock-order issues — the user-mode equivalent of Driver Verifier.

WPP trace decoding

:: Start a session against the driver's WPP GUID
tracelog -start mytrace -guid GuidFile.txt -f trace.etl -flag 0xFFFF -level 5

:: Repro the bug

tracelog -stop mytrace

:: Decode using the .pdb of the driver (TMF embedded)
tracefmt -p C:\symbols\MyDriver.pdb trace.etl -o trace.txt

Or use traceview.exe (legacy GUI) for live decoding.

ETW (modern alternative for UMDF / general)

  • Define an ETW provider with <instrumentationManifest> or TraceLoggingProvider.h
  • Capture: wpr -start GeneralProfile && repro && wpr -stop trace.etl
  • Open in Windows Performance Analyzer (WPA) for graphs, or tracerpt trace.etl -of XML

Anti-Patterns

Anti-PatternWhy It's BadCorrect Approach
Debug only with DbgPrintNo filtering, no offline replayWPP / ETW with structured fields
Disable Driver Verifier "to ship faster"Bugs shipKeep it on for all dev/test boots
Trust the first !analyze -v answer absolutelyHeuristic, sometimes wrongCross-check with kP, !irp, the actual code
Stale symbolsWrong stacks, wrong line numbers.reload /f and pin the build's .pdb next to .sys
Debugging via Hyper-V quick-create + screen-staringSlow loopKDNET to a real (or VM) target, scripted repro
Saving only minidumpsOften missing the data you needSet Kernel or Complete dump for driver bugs
Capturing ETW without a clear provider listMassive noiseFilter by your driver's GUID + the kernel providers you actually need
Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

MIT

Source path

skills/windows/driver-debugging

Default branch

main

Latest commit

9496306

Tree SHA

fe4e2f1