Bug Check 0xC2: BAD_POOL_CALLER
The BAD_POOL_CALLER bug check has a value of 0x000000C2. This indicates that the current thread is making a bad pool request.
Important
This article is for programmers. If you're a customer who has received a blue screen error code while using your computer, see Troubleshoot blue screen errors.
BAD_POOL_CALLER Parameters
Parameter 1 indicates the type of violation.
Parameter 1 | Parameter 2 | Parameter 3 | Parameter 4 | Cause of Error |
---|---|---|---|---|
0x00 |
0 |
Pool type |
Pool tag |
The current thread requested a zero-byte pool allocation. |
0x01, 0x02, 0x04 |
Pointer to pool header |
First part of pool header contents |
0 |
The pool header has been corrupted. |
0x06 |
Reserved |
Pointer to pool header |
Pool header contents |
The current thread attempted to free the pool, which was already freed. |
0x07 |
Reserved |
Pool header contents |
Address of the block of pool being freed |
The current thread attempted to free the pool, which was already freed. |
0x08 |
Current IRQL |
Pool type |
Size of allocation, in bytes |
The current thread attempted to allocate the pool at an invalid IRQL. |
0x09 |
Current IRQL |
Pool type |
Address of pool |
The current thread attempted to free the pool at an invalid IRQL. |
0x0A |
Address of pool |
Allocator's tag |
Tag being used in the attempted free |
The current thread attempted to free pool memory by using the wrong tag. (The memory might belong to another component.) |
0x0B, 0x0C, or 0x0D |
Address of pool |
Pool allocation's tag |
Bad quota process pointer |
The current thread attempted to release a quota on a corrupted pool allocation. |
0x40 |
Starting address |
Start of system address space |
0 |
The current thread attempted to free the kernel pool at a user-mode address. |
0x41 |
Starting address |
Physical page frame |
Highest physical page frame |
The current thread attempted to free a non-allocated nonpaged pool address. |
0x42 or 0x43 |
Address being freed |
0 |
0 |
The current thread attempted to free a virtual address that was never in any pool. |
0x44 |
Starting address |
Reserved |
0 |
The current thread attempted to free a non-allocated nonpaged pool address. |
0x46 |
Starting address |
0 |
0 |
The current thread attempted to free an invalid pool address. |
0x47 |
Starting address |
Physical page frame |
Highest physical page frame |
The current thread attempted to free a non-allocated nonpaged pool address. |
0x48 |
Starting address |
Reserved |
Reserved |
The current thread attempted to free a non-allocated paged pool address. |
0x50 |
Starting address |
Start offset, in pages, from beginning of paged pool |
Size of paged pool, in bytes |
The current thread attempted to free a non-allocated paged pool address. |
0x60 |
Starting address |
0 |
0 |
The current thread attempted to free an invalid contiguous memory address. (The caller of MmFreeContiguousMemory is passing a bad pointer.) |
0x99 |
Address that is being freed |
0 |
0 |
The current thread attempted to free pool with an invalid address. (This code can also indicate corruption in the pool header.) |
0x9A |
Pool type |
Number of bytes requested |
Pool tag |
The current thread marked an allocation request MUST_SUCCEED. (This pool type is no longer supported.) |
0x9B |
Pool type |
Number of bytes requested |
Caller's address |
The current thread attempted to allocate a pool with a tag of 0 (This would be untrackable, and possibly corrupt the existing tag tables.) |
0x9C |
Pool type |
Number of bytes requested |
Caller's address |
The current thread attempted to allocate a pool with a tag of "BIG". (This would be untrackable and could possibly corrupt the existing tag tables.) |
0x9D |
Incorrect pool tag used |
Pool type |
Caller's address |
The current thread attempted to allocate a pool with a tag that does not contain any letters or digits. Using such tags makes tracking pool issues difficult. |
0x41286 |
Reserved |
Reserved |
Start offset from the beginning of the paged pool, in pages |
The current thread attempted to free a paged pool address in the middle of an allocation. |
The _POOL_TYPE codes are enumerated in Ntddk.h. In particular, 0 indicates nonpaged pool and 1 indicates paged pool.
Cause
An invalid pool request has been made by the current thread. Typically this is at a bad IRQL level or double freeing the same memory allocation, etc.
Resolution
Activate Driver Verifier with memory pool options enabled, to obtain more information about these errors and to locate the faulting driver.
Driver Verifier
Driver Verifier is a tool that runs in real time to examine the behavior of drivers. If it see errors in the execution of driver code, it proactively creates an exception to allow that part of the driver code to be further scrutinized. The driver verifier manager is built into Windows and is available on all Windows PCs. To start the driver verifier manager, type Verifier at a command prompt. You can configure which drivers you would like to verify. The code that verifies drivers adds overhead as it runs, so try and verify the smallest number of drivers as possible. For more information, see Driver Verifier.
Windows Memory Diagnostics
In particular, for situations with memory pool corruption, run the Windows Memory Diagnostics tool, to try and isolate the physical memory as a cause. In the control panel search box, type Memory, and then select Diagnose your computer's memory problems. After the test is run, use Event viewer to view the results under the System log. Look for the MemoryDiagnostics-Results entry to view the results.