Что вызвало сбой моего драйвера минипорта NDIS на ОС XP

Я написал простой драйвер фильтра пакетов, основанный на примере "passthru" Windows DDK, когда я включил функцию фильтра, ОС потерпела крах, и я получил следующее сообщение из WinDbg:

Microsoft (R) Windows Debugger Версия 6.12.0002.633 X86 Авторское право (c) Корпорация Microsoft. Все права защищены.

Загрузка файла дампа [D:\iCheckTool\dump\MEMORY.DMP] Файл дампа сводки ядра: доступно только адресное пространство ядра

ВНИМАНИЕ: Пробелы в начале элемента path Путь поиска символа: D:\iCheckTool\dump; SRV*E:\DebuggingSymbols*http://msdl.microsoft.com/download/symbols;SRV*C:\MyLocalSymbols*http://192.168.20.25/zfprisymbols/ Путь поиска исполняемого файла: Windows XP Kernel Version 2600 (Service Пакет 3) MP (2 процесса) Бесплатный x86-совместимый Продукт: WinNt, набор: TerminalServer SingleUserTS Построен: 2600.xpsp_sp3_qfe.120504-1617 Имя машины: Ядро базы = 0x804d8000 PsLoadedModuleList = 0x8055e720 Время сеанса отладки: вторник, 11 сентября 09:41:02.828 2012 (UTC + 8:00) Время работы системы: 0 дней 0:02:30.578 Загрузка символов ядра............................................................................................................................ Загрузка пользовательских символов PEB выгружается (Peb.Ldr = 7ffd800c). Для получения подробной информации наберите ".hh dbgerr001" Загрузка списка выгруженных модулей........


  • *
  • Анализ ошибок *
  • *

Используйте! Analysis -v, чтобы получить подробную информацию об отладке.

BugCheck C5, {4, 2, 1, 8054c10f}

Вероятно, вызвано: Pool_Corruption (нет!ExDeferredFreePool+109)

Продолжение: Pool_corruption

1: kd>! Анализировать -v


  • *
  • Анализ ошибок *
  • *

DRIVER_CORRUPTED_EXPOOL (c5) Была предпринята попытка получить доступ к адресу страницы (или полностью недействительному) на слишком высоком уровне запроса прерывания (IRQL). Это вызвано драйверами, которые повредили системный пул. Запустите средство проверки драйверов для любых новых (или подозрительных) драйверов, и если это не выявит виновника, используйте gflags для включения специального пула. Аргументы: Arg1: 00000004, ссылка на память Arg2: 00000002, IRQL Arg3: 00000001, значение 0 = операция чтения, 1 = операция записи Arg4: 8054c10f, адрес, на который ссылается память

Детали отладки:

BUGCHECK_STR: 0xC5_2

CURRENT_IRQL: 2

FAULTING_IP: nt! ExDeferredFreePool + 109 8054c10f 895f04 mov
dword ptr [edi + 4], ebx

DEFAULT_BUCKET_ID: DRIVER_FAULT

PROCESS_NAME: explorer.exe

TRAP_FRAME: b42555dc - (.trap 0xffffffffb42555dc) ErrCode = 00000002 eax=89cc1c60 ebx=89e4ded8 ecx=000001ff edx=89cc2a78 esi=80565d20 edi=00000000 eip=8054c1056 esp nb = es50 cy cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010297 nt!ExDeferredFreePool+0x109: 8054c10f 895f04 mov dword ptr [edi+4],ebx ds:0023:00000004=???????? Сброс области по умолчанию

LOCK_ADDRESS: 8055c4e0 - (! Блокирует 8055c4e0)

Resource @ nt! PiEngineLock (0x8055c4e0) Доступное число конфликтов = 1 1 всего блокировок

PNP_TRIAGE: Адрес блокировки: 0x8055c4e0 Количество потоков: 0 Адрес потока: 0x00000000 Ожидание потока: 0x0

LAST_CONTROL_TRANSFER: от 8054c10f до 80545768

STACK_TEXT: b42555dc 8054c10f badb0d00 89cc2a78 b8338538 нт KiTrap0E+0x238 b4255690 8054c75f 00000001 8055c100 00020019 нт ExDeferredFreePool+0x109 b42556d0 8058635e 899522e8 00000000 b42557d8 нт ExFreePoolWithTag+0x47f b42556fc 805878b8 c0000023 00000007 8058758c нт PiGetDeviceRegistryProperty+0x108 b425578c bf879f40 8a523030 00000001 00000100 нт IoGetDeviceProperty!!! +0x25e b42558f8 bf879735 00000000 e1b5e008 00000000 win32k!DrvEnumDisplayDevices+0x33b b425591c 8054268c 00000000 00000000 0007ecc4 win32k! Следующие кадры могут быть неправильными. 0007f010 00000000 00000000 00000000 00000000 0x7c92e514

STACK_COMMAND: кб

FOLLOWUP_IP: nt! ExDeferredFreePool + 109 8054c10f 895f04 mov
dword ptr [edi + 4], ebx

SYMBOL_STACK_INDEX: 1

SYMBOL_NAME: нет! ExDeferredFreePool + 109

FOLLOWUP_NAME: пул_коррупция

IMAGE_NAME: Pool_Corruption

DEBUG_FLR_IMAGE_TIMESTAMP: 0

MODULE_NAME: Pool_Corruption

FAILURE_BUCKET_ID: 0xC5_2_nt! ExDeferredFreePool + 109

BUCKET_ID: 0xC5_2_nt! ExDeferredFreePool + 109

Продолжение: Pool_corruption

Может кто-нибудь сказать мне, что вызвало эту проблему и как ее исправить? Благодарю.

1 ответ

Решение

Видимо, вы пытались записать в недопустимую область памяти (адрес = 0x4). Помимо этого, анализ отладчика, который вы опубликовали, не слишком полезен. Вы можете попытаться найти свой стек драйверов (которого нет в опубликованных результатах отладки) в отладчике, чтобы получить код ошибки, но это не гарантировано. Другие методы для атаки включают в себя добавление отладочных отпечатков в ваш код и захват их с помощью DbgView (вы можете позже извлечь их из дампа памяти). И вы также можете подключить отладчик ядра и поймать ошибку, когда это произойдет.

Другие вопросы по тегам