Performance Insights
Windows stop code · 0x00000050

0x50 PAGE_FAULT_IN_NONPAGED_AREA

What stop code 0x50 PAGE_FAULT_IN_NONPAGED_AREA means, how to read its four parameters, and the WinDbg commands that find the code that touched bad memory.

Published 2026-10-22 by PerformanceInsights.ai

Short answer: 0x50 means kernel-mode code referenced memory that isn't valid: an address that was never mapped, memory that has already been freed, or a garbage pointer. Parameter 1 is the address it touched and Parameter 3, when Windows knows it, is the instruction that touched it: ln on Parameter 3 names the function and the driver. A buggy or out-of-date driver is the usual cause; antivirus, a corrupted NTFS volume and faulty RAM are the others Microsoft lists.

Parameters

ParameterMeaning
1The memory address referenced.
2The kind of access. After Windows 10 1507 (TH1), on x64 and x86: 0x0 = read, 0x2 = write, 0x10 = execute; on Arm: 0x0 = read, 0x1 = write, 0x8 = execute. Before 1507, on x64 and x86: 0x0 = read, 0x1 = write. WinDbg's own !analyze text may still say "0 = read operation, 1 = write operation", so go by this table.
3The address of the instruction that referenced the memory, if known.
4The type of page fault: 0x0 NONPAGED_BUGCHECK_FREED_PTE, the address is on a page table entry marked free; 0x2 NONPAGED_BUGCHECK_NOT_PRESENT_PAGE_TABLE, no valid active page table entry; 0x3 NONPAGED_BUGCHECK_WRONG_SESSION, a session address used from a process with no session (until Windows 10 RS3; later reported as 0x2); 0x4 NONPAGED_BUGCHECK_VA_NOT_CANONICAL, a non-canonical address; 0xF NONPAGED_BUGCHECK_USER_VA_ACCESS_INCONSISTENT, kernel code touched a user-mode address where that isn't allowed. Microsoft documents only these; other values (its own example shows 0xc, labelled reserved) aren't explained.

Source: Microsoft Learn, Bug Check 0x50.

Reading the dump

!analyze -v                 # MODULE_NAME / IMAGE_NAME, and the four arguments
dx KiBugCheckDriver         # the driver Windows named on the blue screen, if any
.trap <address>             # if !analyze shows a TRAP_FRAME, switch to it, then:
kv                          # stack at the faulting instruction
ln <Arg3>                   # function that made the access
ub <Arg3>                   # the instructions just before it
r                           # registers: which one held the bad address
!pte <Arg1>                 # is the address mapped at all
!pool <Arg1>                # is it in pool, and is it freed?
lmvm <driver>               # version and date of the suspect

!pte and !pool need a kernel or complete memory dump. A small minidump usually doesn't contain page tables or pool pages, so an error from them there means "not in this dump", not "not mapped".

Typical causes and fixes

Rather not read the dump yourself?

Upload it to DumpTriage. It runs the debugger, reads the output and sends back the faulting module, the stack and a plain-language root cause (how the analysis works). Cases the automated passes can't settle go to an engineer. Free during the pilot.

Create an account