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
安装命令
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
发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

Sep 24, 2026

分类

未分类

许可证

MIT

源路径

skills/windows/driver-debugging

默认分支

main

最新提交

9496306

Tree SHA

fe4e2f1