Skip to content

Est. 2011ยทMicrosoft Partner 7033487ยทDelivery under 3 minยทSupport 7 days a week

Your vault is empty.

License Error 0x000000D0

DRIVER_CORRUPTED_MMPOOL 0x000000D0 and driver pool corruption bugchecks

12 min read Updated October 5, 2026 Windows Crashes & Boot Recovery

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.

On a test machine only, in an elevated Command Prompt, then restart

verifier /standard /driver suspect1.sys suspect2.sys
verifier /bootmode resetonbootfail
verifier /querysettings
  1. Collect several dumps rather than one. Open each from %SystemRoot%\Minidump with !analyze -v and note whether the named module changes between crashes.
  2. If it changes, stop treating the named driver as the culprit and go looking for the writer instead.
  3. Update every third-party driver from its hardware vendor, and remove security, backup or utility software you no longer use.
  4. 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.
  5. 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.

  1. Check the installed agent version against the vendor’s supported platform list for your Windows build.
  2. Update to a current supported build. Kernel components in endpoint agents change often precisely because they touch so much.
  3. If the product is no longer licensed and therefore no longer updating, remove it with the vendor’s dedicated removal utility.
  4. Confirm removal with fltmc rather 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.

  1. Note the driver name from the Verifier crash, then clear Verifier with verifier /reset and restart.
  2. Install the current build from the vendor, or roll back to a version that predates the crashes.
  3. If the driver belongs to optional software – a peripheral utility, a monitoring suite – remove it entirely and see whether you miss it.
  4. 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.

  1. Read it as memory touched at an invalid IRQL, probably because system page table entries are corrupt.
  2. Set TrackPtes to DWORD 3 under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management on a test machine.
  3. The next occurrence is then issued as 0x000000DA with a usable stack trace instead of 0x000000DB.
  4. 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.

  1. Remove duplicated functionality so only one product owns each path.
  2. Where two are genuinely required, apply each vendor’s documented exclusions for the other.
  3. Restart and confirm the filter list is what you expect.
  4. 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

  1. verifier /querysettings reports no active verification before the machine goes back into service.
  2. The machine runs its full normal workload for several days with no new dumps.
  3. fltmc shows only the filters you intend, all from products their vendors currently support on this Windows build.
  4. Windows Memory Diagnostics completes with no errors reported in the System log.
  5. 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.

Related error codes

Was this article helpful?

Your feedback helps us improve our documentation.

Related articles

License Error There was a problem resetting your PC – error 0x80070003 in Reset This PC License Error BAD_POOL_HEADER 0x00000019 and BAD_POOL_CALLER 0x000000C2 explained Free Fix DRIVER_IRQL_NOT_LESS_OR_EQUAL 0x000000D1 and IRQL_NOT_LESS_OR_EQUAL 0x0000000A Free Fix DISM RestoreHealth fails with 0x800F081F or 0x80073712 during recovery
โ† Back to Knowledge Base