Fix it now
The processor raised a trap the kernel could not catch. Parameter 1 is the trap number and it decides everything that follows: 0x8 is a double fault, which Microsoft attributes to kernel stack overflow or to a hardware problem, and 0xD is a general protection fault. Microsoft’s stated cause for this bug check is faulty or mismatched hardware, especially memory.
wmic recoveros get DebugInfoType
sfc /scannow
fltmc
- Read parameter 1 from the BugCheck event in Event Viewer, under Windows Logs then System. Current stop screens do not display the bugcheck parameters, so do not expect to find it there.
- Enter firmware setup and load defaults. Microsoft’s published advice for this bug check includes returning an overclocked processor to its default clock speed and disabling memory caching in the BIOS if the option exists.
- Run the Windows Memory Diagnostics tool: in the Control Panel search box enter Memory, then select Diagnose your computer’s memory problems. Read the result afterwards in Event Viewer under the System log, in the MemoryDiagnostics-Results entry.
- If parameter 1 was 0x8 and the memory tests clean, count the third-party filter drivers with
fltmc. Microsoft names filter drivers stacked on one stack, recursing back in, as a documented route to a kernel stack overflow. - Remove anything redundant on that stack – a second scanner, a backup agent’s leftover filter, disk software you no longer use – and re-test.
Reset firmware to defaults before you test memory, not after. A memory profile is an overclock, and testing modules at a speed you are about to stop using tells you very little.
If the machine is stable at defaults with clean memory, you have your answer. If it is not, the next section explains what a double fault is and why the stack is where to look.
Why it happens
Microsoft’s description of 0x0000007F is that the CPU generated a trap and the kernel failed to catch it, and that the trap is either a bound trap – one the kernel is not permitted to catch – or a double fault, which always results in a system failure. Parameter 1 carries the trap number, and it is the only part of the record that narrows anything down.
The published trap table is worth knowing because the entries point in different directions. 0x00 is a divide by zero, which Microsoft attributes to memory corruption, other hardware problems or software failures. 0x06 is an invalid opcode, which Microsoft says usually means the instruction pointer has been corrupted, most commonly by hardware memory corruption. 0x08 is the double fault. 0x0D is a general protection fault. A machine that produces 0x06 and 0x0D on alternate crashes is telling you about its memory, not about a driver.
A double fault is what happens when a second exception arrives while the handler for the first is still running, and the processor cannot serialise them. Microsoft gives two causes. The first is kernel stack overflow: the guard page is hit, the kernel tries to push a trap frame, there is no stack left to push it onto, and the double fault follows. Microsoft’s own example is two file system filter drivers attached to the same stack with the file system recursing back in. The second is simply a hardware problem.
0x1000007F is the same bug check under a different number. Microsoft states it has the same meaning and the same parameters as 0x7F, so read it identically. The other companions are separate failures that share a stop screen: 0x00000012 is an unknown exception, with parameter 1 saying whether it was an unexpected interrupt, an unknown floating point exception, or the enabled and asserted status bits. 0x00000111 is an NMI arriving while a previous NMI was in progress, which Microsoft attributes to system management interrupt code in firmware – a firmware update, not a driver hunt. 0x000001AA is exception dispatch crossing into an invalid kernel stack. 0x00000094 is a thread exiting while its kernel stack was marked not swappable.
Faulty or mismatched memory
You have this one if Trap numbers vary between crashes, or you see 0x06 and 0x0D on different occasions, and no software change explains the timing.
- Run the Windows Memory Diagnostics tool and read the MemoryDiagnostics-Results entry in the System log afterwards.
- Test one module at a time, keeping the same slot, so a bad slot does not confuse the result.
- Reseat modules and check the slots for dust before condemning anything.
- Replace the faulty module. Where the memory is a matched kit, replace the kit rather than mixing parts.
Microsoft names faulty or mismatched hardware, especially memory, as the typical cause of this bug check. It is the first thing to rule out, not the last.
Kernel stack overflow from drivers stacked on one stack
You have this one if Parameter 1 is 0x8, the machine is at firmware defaults, memory tests clean, and the dump shows a deep stack with several third-party filters on the same path.
- List filter drivers with
fltmcand count the non-Microsoft entries. - Take one out of the path for a test with
fltmc unload <name>, then reproduce the workload. - Remove anything genuinely redundant – a second scanner, an old backup agent’s filter, disk or virtual drive software you no longer use.
- Update the filters that remain to the builds published for your Windows version.
Clocks or voltages outside specification
You have this one if Any manual tuning is in place – a memory profile, a multiplier, a voltage offset, an undervolt – and crashes are not tied to any particular workload.
- Load firmware defaults and run entirely at stock for several days before concluding anything.
- Return an overclocked processor to its default clock speed, which is one of Microsoft’s published steps for this bug check.
- Disable memory caching in the BIOS if the option is offered, which is another of them.
- Reintroduce one change at a time so you learn which one it was.
Recently added or recently updated hardware and drivers
You have this one if The crashes date from the day something was fitted or a driver was updated.
- Remove the recently added hardware and see whether the error recurs, which is Microsoft’s first published step.
- Run the hardware diagnostics supplied by the system manufacturer.
- Where a driver update preceded the crashes, roll it back or install the vendor’s own build for your Windows version.
- Check the System log for messages identifying the device or driver in the same window as the crash.
Full reference
The trap numbers Microsoft publishes
| Parameter 1 | Trap | What Microsoft says about it |
|---|---|---|
0x00 |
Divide by zero | A DIV executed with a zero divisor. Memory corruption, other hardware problems or software failures |
0x04 |
Overflow | An interrupt handler was called with the overflow flag set |
0x05 |
Bounds check fault | A BOUND instruction found its operand outside the specified limits |
0x06 |
Invalid opcode | The processor tried to execute an invalid instruction, usually because the instruction pointer is corrupt. The most common cause is hardware memory corruption |
0x07 |
No coprocessor | A coprocessor instruction with no coprocessor present |
0x08 |
Double fault | An exception during the handler for a prior exception. Kernel stack overflow or a hardware problem |
0x0A |
Invalid TSS | A corrupted task state segment |
0x0B |
Segment not present | An access to a memory segment that was not present |
0x0C |
Stack fault | An access beyond the limits of a stack |
0x0D |
General protection fault | A protection fault not covered by another exception |
Working a double fault in the debugger
Microsoft’s published sequence is specific and worth following in order rather than staring at !analyze output. Start with !analyze -v. Then run kv for the stack. If kv shows a task gate, use .tss on the selector; if it shows a trap frame, use .trap on that address. Then run kv again – the second stack is the real one. On a double fault the first stack is frequently mangled, which is why the top frame so often resolves to a core Windows component that was merely on the path.
The companion codes, and what each actually means
| Code | Published meaning | Where it sends you |
|---|---|---|
0x1000007F |
Same meaning and same parameters as 0x7F | Read it as 0x7F. There is nothing else to know |
0x00000012 |
An unknown exception occurred | Parameter 1: 1 is an unexpected interrupt with the vector in parameter 2, 2 an unknown floating point exception, 3 the enabled and asserted status bits |
0x00000111 |
An NMI occurred while a previous NMI was in progress | Firmware. Microsoft attributes it to SMI code that interrupts an NMI and re-enables interrupts |
0x000001AA |
Exception dispatch crossed into an invalid kernel stack | A corrupted stack pointer during dispatch or unwind, or a driver running off a stack that is not a legal kernel stack |
0x00000094 |
A thread exited while its kernel stack was marked not swappable | No parameters are published. Read the stack |
Reading 0x000001AA when it appears
This one rewards a moment’s attention because its parameters are unusually informative. Parameter 1 points at the current stack. Parameter 2 is the kernel’s best estimate of which kind of stack should have been active – a normal kernel thread stack is 0x3, a processor DPC stack 0x1, an ISR stack 0x6, an NMI handling stack 0x8, a machine check handling stack 0x9. Parameter 3 is the context record and parameter 4 the exception record, so .cxr and .exr on those two values give you the state at the moment of the fault directly.
Software steps Microsoft publishes for this bug check
- Check the System log in Event Viewer for messages identifying the device or driver causing the error.
- Check for updates to the ACPI or system firmware, the disk controller driver, or the network card driver.
- If a new or updated device driver preceded the crashes, remove or replace it, using Safe Mode to rename or delete the file if the machine will not start normally.
- If you are upgrading Windows, remove third-party device drivers and system services and disable virus scanners for the upgrade.
- Install the latest Windows updates.
What the crash pattern is telling you
| What you see | Where to concentrate |
|---|---|
| Parameter 1 is 0x8 and any firmware tuning is enabled | The tuning. Return to defaults before anything else |
| Parameter 1 is 0x8 at stock settings with clean memory | Kernel stack depth. Count the filters on the path |
| Parameter 1 varies between crashes | Memory or power delivery rather than any one driver |
| Crashes date from a specific installation | That product’s kernel driver |
| You also see 0x00000111 | Firmware, not drivers. Microsoft attributes 0x111 to system management interrupt code |
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
0x0000007F |
The CPU generated a trap the kernel could not catch. Parameter 1 is the trap number: 0x8 is a double fault, 0x0D a general protection fault | Microsoft Learn |
0x00000012 |
An unknown exception occurred. Parameter 1 is 1 for an unexpected interrupt, 2 for an unknown floating point exception, 3 for the enabled and asserted status bits | Microsoft Learn |
0x00000111 |
A non-maskable interrupt occurred while a previous one was in progress, which Microsoft attributes to system management interrupt code in firmware | Microsoft Learn |
0x1000007F |
UNEXPECTED_KERNEL_MODE_TRAP_M. Microsoft states it has the same meaning and the same parameters as 0x0000007F | Microsoft Learn |
0x000001AA |
Exception dispatch crossed over into an invalid kernel stack, either from a corrupted stack pointer during dispatch or unwind, or from a driver running off a stack that is not a legal kernel stack | Microsoft Learn |
0x00000094 |
A thread exited while its kernel stack was marked as not swappable. No parameters are published | Microsoft Learn |
Confirm the fix worked
- Confirm firmware is at defaults, with any tuning reintroduced deliberately and tested one change at a time.
- Confirm the Windows Memory Diagnostics result in the System log reports no errors.
- Run a sustained processor load for at least half an hour and confirm the machine stays up.
- Run
fltmcand confirm every filter listed belongs to a product that is installed and current. - Use the machine for several days and confirm no new BugCheck events are written to the System log.
Questions people ask about this
My memory profile has run for two years. Can it really be the cause?
It can. Microsoft’s published guidance for this bug check includes returning an overclocked processor to its default clock speed and disabling memory caching in firmware, and a rated memory profile is an overclock whatever the packaging says. Running at defaults for a day costs nothing and settles the question.
Does fixing this cost money?
Usually not. Firmware defaults, the Windows Memory Diagnostics tool, removing redundant filter drivers and vendor driver updates are all free. Cost only enters if a component turns out to be genuinely faulty.
How thorough does a memory test need to be?
Thorough enough that a clean result means something. A single short pass on a cold machine misses marginal faults, so run a full session and, if you have any doubt after that, test modules individually.
The dump names a Microsoft driver. Is Windows at fault?
Unlikely on this bug check specifically. A double fault frequently leaves a mangled stack, which is why Microsoft’s published debugging sequence tells you to find the trap frame or task gate with .trap or .tss and then take the stack again. Read the second stack, not the first.
What is the difference between 0x7F and 0x1000007F?
Nothing you need to act on. Microsoft states that 0x1000007F has the same meaning and the same parameters as 0x7F.
