0x000000C2: BAD_POOL_CALLER

OSzone.net » Microsoft » BSOD » Ошибки » 0x000000C2: BAD_POOL_CALLER
Автор: Ginger
Иcточник: MS
Опубликована: 26.01.2005
STOP 0x000000C5 DRIVER_CORRUPTED_EXPOOL
Процесс ядра или драйвер попытались неверно произвести операцию с памятью. Обычно причиной являются неисправные драйвера или софт.


Windows 2000 XP

Применяется к следующим системам:
  1. Microsoft Windows 2000 Server
  2. Microsoft Windows 2000 Advanced Server
  3. Microsoft Windows 2000 Datacenter Server
  4. Microsoft Windows 2000 Professional
  5. Microsoft Windows XP 64-Bit Edition
  6. Microsoft Windows XP Home Edition
  7. Microsoft Windows XP Professional
Решение:
Windows 2000 содержит много различных встроенных фич, которые усиливают процесс распределение басеина памяти (pool allocation process). Эти фичи могут помочь вам установить корневую причину ошибки простым дебагом (debugging).
Следуйте следующим шагам:
BAD_POOL_CALLER (0xC2)
Текущая нить неправильно обращается к памяти. Обычно, это из-за неверного уровня IRQL или двойного освобождения одного и того же места памяти, и т.д.

1 - тип нарушения обращения к бассеину.
6 - адрес освобождаемого бассеина, который уже был освобождён.
7 - адрес освобождаемого бассеина, который уже был освобождён.
8 - переметр 2 - это IRQL расположения, параметр 3 - тип
9 - переметр 2 - это IRQL высвобождения, параметр 3 - тип

Parameter 1 = 0x1, 0x2, or 0x4 : заголовок басейна повреждён
Parameter 2 = указатель на заголовок
Parameter 3 = первая чать содержания заголовка
Parameter 4 = 0

Parameter 1 = 0x6 : попытка освободить пямять, которая уже свободна
Parameter 2 = резерв (__LINE__)
Parameter 3 = указатель на заголовок
Parameter 4 = содержание заголовока

Parameter 1 = 0x7 : попытка освободить пямять, которая уже свободна
Parameter 2 = резерв (__LINE__)
Parameter 3 = указатель на заголовок
Parameter 4 = 0

Parameter 1 = 0x8 : попытка освободить пямять используя неверный IRQL
Parameter 2 = текущий IRQL
Parameter 3 = тип басейна памяти
Parameter 4 = его размер

Parameter 1 = 0x9 : попытка освободить пямять используя неверный IRQL
Parameter 2 = текущий IRQL
Parameter 3 = тип басейна памяти
Parameter 4 = его адрес

Parameter 1 = 0x40 : попытка освободить пользовательский адрес для ядра
Parameter 2 = адрес начала
Parameter 3 = начало системного места
Parameter 4 = 0

Parameter 1 = 0x41 : попытка освободить неиспользуемый адрес
Parameter 2 = адрес начала
Parameter 3 = рамка физической страницы
Parameter 4 = наибольшая рамка

Parameter 1 = 0x50 : попытка освободить неиспользуемый адрес
Parameter 2 = адрес начала
Parameter 3 = Start offset in pages from beginning of paged pool
Parameter 4 = размер в байтах

Parameter 1 = 0x99 : попытка освободить неверный адрес памяти (или повреждение заголовка)
Parameter 2 = освобождаемый адрес
Parameter 3 = 0
Parameter 4 = 0
После того, как вы выяснили детальную информацию по ошибке, воспользуйтесь дебагером.
E:bin>i386kd -z K:DOWNLOADmemory.dmp
Loading Dump File [K:DOWNLOADmemory.dmp]
Full Kernel Dump File...

0: kd> !reload GOOD HOUSEKEEPING DONE HERE
0: kd> dd kibugcheckdata l8 DUMPING THE ERROR
8047fba0 000000c2 00000007 00000b68 815bade0
8047fbb0 815bade8 e1007000 00000000 818988c0
0: kd> kv DUMPING STACK

ChildEBP RetAddr Args to Child
bdce0348 be11dc84 e1fff000 a08d0008 000007f8 banshee!vH3ImageTransferMm32
bdce037c be116f18 be85fd78 00000001 bdce03dc banshee!vMmXferNative
bdce03ac be113eec e1fff000 e25e2a38 bdce03dc banshee!vPutBits
bdce03e8 a008e47f e1ff86f8 e25e2a38 e1fef908 banshee!DrvCopyBits
bdce0430 a008e899 be113d40 bdce04d8 e1ff86f8 win32k!OffCopyBits
bdce04e4 a008e4d1 e1ff86f8 e25e2a38 00000000 win32k!SpBitBlt
Документация ошибки указывает, что память была освобождена. Это явно из линии:
Parameter 1 = 0x7: Attempt to free pool which was already freed.
Так же видно, что видео карта в процессе записи, поэтому мы должны продолжать работу над ошибкой. Во-первых, мы должны выявить, если этот компьютер мультипроцессорный:
0: kd> ~1 SWITCH PROC
1: kd> kv DUMPING STACK
ChildEBP RetAddr Args to Child
bde81b7c 8046894d 815bade8 00000000 be03bb2b ntkrnlmp!ExFreePoolWithTag
bde81b88 be03bb2b 815bade8 be03ca94 815bade8 ntkrnlmp!ExFreePool
00000128 00000000 00000000 00000000 00000000 BADDRIVER
Предыдущий текст указывает, что память была освобождена драйвером имя_драйвера. Это может быть корневой причиной.
Теперь выявим драйвер.
1: kd> !drivers
Loaded System Driver Summary

Base Code Size Data Size Driver Name Creation Time
80400000 139f40 (1255 kb) 4f3c0 (316 kb) ntoskrnl.exe Tue Dec 07 14:05:26 1999
80062000 ffe0 ( 63 kb) 3d60 ( 15 kb) hal.dll Tue Nov 02 20:14:22 1999
ed410000 1760 ( 5 kb) 1000 ( 4 kb) BOOTVID.dll Wed Nov 03 20:24:33 1999
ed49c000 1b00 ( 6 kb) 680 ( 1 kb) gameenum.sys Sat Sep 25 14:35:57 1999
ed080000 a000 ( 40 kb) 20c0 ( 8 kb) VIDEOPRT.SYS Sat Nov 06 16:55:20 1999
bfdcf000 1d480 ( 117 kb) 7520 ( 29 kb) mga64m.sys Mon Nov 29 20:47:46 1999
bfdbc000 11600 ( 69 kb) 1600 ( 5 kb) el90xnd5.sys Fri Oct 29 17:54:34 1999
ed090000 3a60 ( 14 kb) 5980 ( 22 kb) banshee.sys Fri Oct 29 19:00:56 1999
ed5df000 2e0 ( 0 kb) 4a0 ( 1 kb) audstub.sys Sat Sep 25 14:35:33 1999
ed370000 33e0 ( 12 kb) a40 ( 2 kb) raspti.sys Fri Oct 08 16:45:10 1999
ed0c0000 c5e0 ( 49 kb) 20e0 ( 8 kb) parallel.sys Fri Oct 22 18:00:54 1999
ed5e0000 580 ( 1 kb) 540 ( 1 kb) swenum.sys Sat Sep 25 14:36:31 1999
be552000 72a60 ( 458 kb) 13c40 ( 79 kb) mga64d.dll Tue Nov 30 04:33:19 1999
be113000 36f00 ( 219 kb) 7a20 ( 30 kb) banshee.dll Tue Nov 30 04:31:18 1999
be031000 FFFF ( FF kb) FFFF ( F kb) BADDRIVER.sys Mon Feb 30 23:22:43 2000

TOTAL: 7f8dc0 (8163 kb) 172140 (1480 kb) ( 0 kb 0 kb)
Предыдущий текст показывает, что драйвер используется ПО третьей стороны. Этот драйвер, скорей всего, и есть главная причина ошибки.

Microsoft Debugging Tools
http://www.microsoft.com/ddk/debugging/default.asp

Ссылка: http://www.oszone.net/1153/0x000000C2_BAD_POOL_CALLER