· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› BAD_POOL_CALLER

Посл.отвђт Сообщенiе


Дата: Фев 25, 2004 17:31:17

stop: 0x000000c2 (0x000000007, 0x00000b8a,...)
BAD_POOL_CALLER

Вот это вываливается на синем экране... Нашел в DDK описание "Attempt to free pool which was already freed", что означает - пытаюсь освободить пул, который уже освобожден. Все конечно понятно с пулом, но в моём драйвере нет выделения и освобождения пула.
Смысл работы драйвера - эмулировать новый HDD в системе, при этом просто подсовывать данные из файла-имиджа, считанного с дискеты.
Есть еще одна особенность, крах системы происходит только при многократном запуске и остановке драйвера, причем после остановки может пройти много времени и BSOD вываливается, например, при простом закрытии Explorer или при переключении между задачами. Процедура UnLoad
DriverUnload proc pDriverObject:PDRIVER_OBJECT
.if hDiskFile!=NULL
invoke ZwClose, hDiskFile
.endif
invoke IoDeleteSymbolicLink, addr SymbLinkName
mov eax, pDriverObject
assume eax:ptr DRIVER_OBJECT
invoke IoDeleteDevice, [eax].DeviceObject
assume eax:ptr nothing
ret
DriverUnload endp


Дата: Фев 26, 2004 00:35:55 · Поправил: Four-F

Точно сказать невозможно. Причин может быть много. Например, ты аттачишься к имеющемуся девайсу, перехватываешь его IRP и устанавливаешь процедуру завершения (Completion Routine). К тебе приходит IRP, ты перенаправляешь его ниже по стеку и какой-то из драйверов ниже откладывает обработку этого IRP. Ты выгружаешь драйвер, но адрес процедуры завершения находится в теле драйвера, когда происходит завершение IRP система вызывает твою процедуру, но ее там уже нет. В твоем случае, судя по BAD_POOL_CALLER, проблема, наверное в другом. Но все равно может быть какая-то завязка с отложенными IRP. Или ты ассоиативный список не освободил или хрен знает еще что. По одному BSOD'у тут не разобраться. Включи в айсе трап на исключения faults on. Так на ещё живой системе можно посмотреть какой поток, состояние стека, жив ли твой драйвер и т.п. может за что-нить и зацепишься.


Дата: Фев 26, 2004 14:56:16

Немного разобрался, вся "засада" в broadcast сообщениях...
Когда система обнаруживает новый диск (юзал flash usb) по системе проходит сообщение uMsg = WM_DEVICECHANGE WParam = DBT_DEVICEARRIVAL (8000h) lParam = 12FEE4 на что окошки (не все) отвечают, очевидно OK! - broadcast сообщение uMsg = WM_DEVICECHANGE WParam = 7, LParam = 0
При отключении flash - uMsg = WM_DEVICECHANGE WParam = DBT_DEVICEREMOVECOMPLETE (8004h) lParam = 12FEE4, на что ответ идет uMsg = WM_DEVICECHANGE WParam = 7, LParam = 0
В моём приложении сообщения проходят немного не так (не в той последовательности) => не все системные модули получают уведомление об отключении устройства. И когда происходит время кому-нить обратиться к диску (например проверить его наличие) - BSOD
Но это пока только предположение :)


Дата: Фев 26, 2004 15:34:17

См. в KmdKit (на этом сайте) пример \examples\advanced\RamDisk\. Может поможет чем-нибудь.


Дата: Мар 4, 2004 10:36:27

Разобрался окончательно - "шальные ручки" до добра не доводят. Не удалил часть кода, в котором по esi записывается один DWORD, а это происходило в момент вызова диспетчера чтения => через определенное время, когда память очищалась системой - получал BSOD :(


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.128