Fix it now
0x000000D0 is the system touching invalid memory at an IRQL that was too high, and Microsoft attributes it almost certainly to a driver that has corrupted the system pool. The module named in the dump is usually the one that read the damaged memory, not the one that wrote it, which is why replacing it rarely helps.
verifier /standard /driver suspect1.sys suspect2.sys
verifier /bootmode resetonbootfail
verifier /querysettings
- Collect several dumps rather than one. Open each from
%SystemRoot%\Minidumpwith!analyze -vand note whether the named module changes between crashes. - If it changes, stop treating the named driver as the culprit and go looking for the writer instead.
- Update every third-party driver from its hardware vendor, and remove security, backup or utility software you no longer use.
- Enable Driver Verifier’s standard set – which includes special pool – against named third-party drivers on a machine you can afford to crash, then use it until it bug checks.
- The next dump should name the guilty driver directly. Clear Verifier with
verifier /reset, restart, then update or remove that driver.
Rule out memory first. Failing RAM imitates pool corruption closely, and an overnight run of Windows Memory Diagnostics costs nothing.
If the machine is stable with the identified driver replaced, you are finished. The next section explains why the crash lands somewhere other than the fault.
Why it happens
Kernel pool is a shared heap. A driver that asks for memory gets a block from a pool holding allocations belonging to every other component, with no guard page between neighbours – the cost across every allocation on the system would be unacceptable. A driver that writes a few bytes past the end of its buffer therefore writes into whatever happens to sit next to it.
Nothing fails at that moment. The corruption sits there until the owner of the damaged block reads it and acts on the wrong values, which might be a second later or an hour later, under a different workload entirely. When the crash finally arrives, the stack shows the victim. This is why people replace the named driver, see no change, and conclude the machine is haunted.
The size of the corrupted allocation decides which code you get, and this is the single most useful fact in the family. A corrupted allocation of PAGE_SIZE or larger produces 0x000000D0; anything smaller produces 0x000000C5 instead. Both have the same published description – the system accessed invalid memory at a process IRQL that was too high – and the same attribution to a driver that corrupted the system pool. They are one fault with two numbers.
Special pool is the answer to the delay. When Driver Verifier enables it for a driver, each allocation gets its own page with an inaccessible guard page immediately after it, so an overrun faults at the moment it happens with the guilty driver on the stack. 0x000000CC and 0x000000CD are what that looks like when it works: the first is a reference to memory that was freed, the second is an access beyond the end of an allocation – the driver asked for n bytes and more than n were referenced.
An endpoint agent that is out of support or half-removed
You have this one if A security product’s driver appears in the stack, and the installed build predates the Windows version it is running on.
- Check the installed agent version against the vendor’s supported platform list for your Windows build.
- Update to a current supported build. Kernel components in endpoint agents change often precisely because they touch so much.
- If the product is no longer licensed and therefore no longer updating, remove it with the vendor’s dedicated removal utility.
- Confirm removal with
fltmcrather than trusting the uninstaller’s success message.
Microsoft attributes 0xD0 to ‘a driver that has corrupted the system pool’ without naming product categories. An unsupported agent is a good thing to check, not a documented cause.
A third-party driver overrunning its own allocations
You have this one if Verifier with special pool enabled produces an immediate crash naming one specific driver.
- Note the driver name from the Verifier crash, then clear Verifier with
verifier /resetand restart. - Install the current build from the vendor, or roll back to a version that predates the crashes.
- If the driver belongs to optional software – a peripheral utility, a monitoring suite – remove it entirely and see whether you miss it.
- Send the dump to the vendor. A special pool crash is unusually clear evidence and is the kind of report that gets acted on.
System PTEs rather than pool
You have this one if The code is 0x000000DB rather than 0x000000D0.
- Read it as memory touched at an invalid IRQL, probably because system page table entries are corrupt.
- Set
TrackPtesto DWORD 3 underHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Managementon a test machine. - The next occurrence is then issued as 0x000000DA with a usable stack trace instead of 0x000000DB.
- Take that stack to the driver’s vendor.
Two products competing in the same kernel path
You have this one if fltmc shows several third-party filters, particularly more than one from security or backup vendors.
- Remove duplicated functionality so only one product owns each path.
- Where two are genuinely required, apply each vendor’s documented exclusions for the other.
- Restart and confirm the filter list is what you expect.
- Re-test under a heavy file workload, which is where these conflicts surface.
Full reference
Which code you get, and what it tells you
| Code | Published meaning | What it points at |
|---|---|---|
0x000000D0 |
Invalid memory accessed at too high an IRQL; a driver corrupted the system pool | The corrupted allocation was PAGE_SIZE or larger |
0x000000C5 |
The same description, same attribution | The corrupted allocation was smaller than PAGE_SIZE |
0x000000DB |
Memory touched at an invalid IRQL, probably corrupted system PTEs | Set TrackPtes to 3 to get 0xDA with a stack instead |
0x000000D7 |
A driver is trying to unmap an address that was not mapped | A mapping bug in the driver on the stack |
0x000000C6 |
A driver attempted to access a freed memory pool | The faulty component is on the current kernel stack |
0x000000CC |
The system referenced memory that was earlier freed | Raised by special pool; a use-after-free |
0x000000CD |
Access beyond the end of a driver’s special pool allocation | Raised by special pool; an overrun |
Reading a run of crashes rather than one
| Evidence across several dumps | What it means |
|---|---|
| The same third-party module every time | That driver may genuinely be at fault. Update it first |
| A different module each time | Pool corruption by a driver you have not identified. Use special pool |
| Core Windows components named | Almost certainly victims |
| 0xC5 and 0xD0 alternating | One writer, allocations of different sizes. Same investigation |
| 0xCC or 0xCD after enabling Verifier | Special pool has caught it. The named driver is the writer |
Special pool, and the alternative when it finds nothing
verifier /standard /driver name.sys enables the standard option set, which includes special pool, against named drivers. If that does not reveal the driver, Microsoft’s documented next step is the Global Flags utility, which can enable special pool by pool tag rather than by driver – useful when the dumps keep naming a tag you can see but cannot attribute.
There is also a blunter diagnostic on the 0xD0 page itself. Creating ProtectNonPagedPool as DWORD 1 under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management makes the system unmap all freed nonpaged pool after a restart, which stops drivers corrupting it. Microsoft’s own caveat is that it does not protect the pool from DMA hardware, so a device writing where it should not still gets through.
Debugger commands that earn their keep here
| Command | Purpose |
|---|---|
!analyze -v |
Automated analysis; on a special pool crash it names the driver directly |
!pool <address> |
The pool block at an address, including its tag and header state |
!poolused 2 |
Nonpaged pool usage by tag – the fastest way to spot a component consuming far more than it should |
!poolused 4 |
The same for paged pool |
verifier /querysettings |
What is configured now, before you clear it |
Driver Verifier with special pool enabled will crash the machine deliberately, repeatedly, and possibly during start-up. Microsoft states it should only be run on computers used for testing and debugging. Take a backup, enable it with verifier /bootmode resetonbootfail, and never leave it on a machine somebody depends on.
When it is memory rather than a driver
- Run Windows Memory Diagnostics – type its name at Start – and read the MemoryDiagnostics-Results entry in the System log afterwards.
- A single clean pass proves very little. Run a full overnight test before ruling memory out.
- With more than one module fitted, test one at a time to isolate a failing stick.
- Check whether the machine has been overclocked or has memory profiles enabled in firmware, and return it to stock while you test.
- If 0x0000012B appears alongside these codes, the memory manager has detected corruption that could only have come from a component accessing memory by physical address, which shifts the weight firmly towards RAM, DMA or firmware.
When a licence is the actual fix
If the driver in your stack belongs to an endpoint agent that stopped receiving builds when its subscription lapsed, a supported build is the fix rather than any configuration change, and both routes to one are legitimate. Removing the agent and running Microsoft Defender costs nothing and is fully supported. Where you need managed policy, device control and reporting across a fleet, a current licence restores update delivery so the kernel components track the Windows builds you are running. Arco supplies Sophos Intercept X Advanced licences and can check which seat count and term matches your estate.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
0x000000D0 |
DRIVER_CORRUPTED_MMPOOL: the system attempted to access invalid memory at a process IRQL that was too high. Microsoft attributes it almost certainly to a driver that corrupted the system pool, and this code results when the corrupted allocation was PAGE_SIZE or larger | Microsoft Learn |
0x000000DB |
DRIVER_CORRUPTED_SYSPTES: memory was touched at an invalid IRQL, probably because system page table entries are corrupt. Setting TrackPtes to 3 makes the system issue 0x000000DA with a stack trace instead | Microsoft Learn |
0x000000D7 |
DRIVER_UNMAPPING_INVALID_VIEW: a driver is trying to unmap an address that was not mapped | Microsoft Learn |
0x000000C6 |
DRIVER_CAUGHT_MODIFYING_FREED_POOL: a driver attempted to access a freed memory pool. The faulty component is on the current kernel stack | Microsoft Learn |
0x000000CC |
PAGE_FAULT_IN_FREED_SPECIAL_POOL: the system referenced memory that had earlier been freed. Raised by the Driver Verifier special pool option | Microsoft Learn |
0x000000CD |
PAGE_FAULT_BEYOND_END_OF_ALLOCATION: the system accessed memory beyond the end of a driver’s special pool allocation – the driver allocated n bytes and more than n were referenced | Microsoft Learn |
Confirm the fix worked
verifier /querysettingsreports no active verification before the machine goes back into service.- The machine runs its full normal workload for several days with no new dumps.
fltmcshows only the filters you intend, all from products their vendors currently support on this Windows build.- Windows Memory Diagnostics completes with no errors reported in the System log.
- If you replaced a driver, Device Manager shows the version you installed rather than the one that crashed.
Questions people ask about this
Why does the crash name a different driver each time?
Because pool corruption damages whichever allocation happens to sit next to the offender, and that neighbour changes with every boot. The named driver read the damaged data; it did not write it. Special pool removes the guesswork by faulting at the moment of the overrun.
What is the difference between 0xD0 and 0xC5?
The size of the allocation that was corrupted. PAGE_SIZE or larger gives you 0xD0; smaller gives you 0xC5. The description, the cause and the investigation are the same for both.
How long should I leave Driver Verifier running?
Until it produces a crash, or until the machine has been through its full normal workload for a couple of days without one. If nothing is caught, widen the set of drivers being verified rather than adding aggressive options at random.
Can I just increase the pool size?
No, and there is nothing sensible to increase. This is not a shortage of memory; it is a driver writing outside the memory it was given. More RAM changes the timing of the crash at best.
Does resolving this require buying software?
Not in itself. The debugger, Driver Verifier, memory testing and driver updates are all free, and Microsoft Defender is included with Windows. Money only enters if an agent needs an active licence to receive supported builds, or if the memory turns out to be faulty.
