none
BAD_POOL_CALLER 0x00000c2 в Windows 7 RRS feed

  • Вопрос

  • Приветствую Вас!

    В последнее время зачислил появляться BSOD: BAD_POOL_CALLER 0x00000c2

    ОС: Windows 7 Максимальная x86

    Синий экран появляется исключительно при любой запущенной игре (Diablo 3, World of Tanks, The War Z), через разные промежутки времени, при работе с самой ОС ошибка не появляется. Пробовал обновить драйверы всех устройств, но это не помогло решить проблему.

    Пробовал найти проблему при помощи dbg_x86_6.11.1.404, но утилита ничего не нашла.

    К сообщению прикладываю файл дампа: ссылка

    Помогите пожалуйста найти причину проблемы.

    21 февраля 2013 г. 22:24

Ответы

  • Методом исключения нашел причину проблемы, bsod появляется в играх, которые проявляют сетевую активность, проверил на игре не требующей сетевой составляющей и все замечательно работает, без каких либо ошибок. 

    В итоге виновником появления bsod'а является программа написанная русскими разработчиками ViPNet со своим "фаерволом". 

    Всем спасибо за помощь!

    • Помечено в качестве ответа AndricoRusEditor 4 марта 2013 г. 6:19
    4 марта 2013 г. 2:51

Все ответы

  • Из дама:

    Причина проблемы: PROCESS_NAME:  Diablo III.exe

    22 февраля 2013 г. 6:43
  • чем вы открыли файл дампа?
    22 февраля 2013 г. 6:57
  • Если вы посмотрите на верх форума там есть тема Зачем нужен синий Экран смерти или "Инструкция по интерпретации Малого Дампа Памяти" там все написано. Я использую WinDbg
    22 февраля 2013 г. 7:11
  • Причина проблемы: PROCESS_NAME:  Diablo III.exe
    Капитан-очевидность приходил примерно 8 с половиной часов назад и говорил "Синий экран появляется исключительно при любой запущенной игре (Diablo 3, World of Tanks, The War Z)". То, что показывает базовый анализ - это текущий пользовательский процесс, на фоне которого умерла ОС и он далеко не всегда есть причина. А вот если бы вы посмотрели чуть ниже вывод - вы бы увидели, что это всё-таки пока ещё таинственный неизвестный модуль по адресу 0x776f6194. Профилактически - обновляйте драйвера: особенно видеоадаптера. В остальном - неплохо бы получить дамп ядра, а не мини - после чего думаю или я или sergmat ("ой, я так люблю - когда ты колдуешь"(c) :)) посмотрим глубже. С учётом того что модуль не резолвится - это может быть и вирус, но не всегда - есть нюансы в архитектуре драйверов.

    22 февраля 2013 г. 7:13
    Отвечающий
  • Из дама:

    Причина проблемы: PROCESS_NAME:  Diablo III.exe

    думаю если бы я в момент краша системы играл в любую другую игру, то следуя вашей логике причиной был бы, их исполняемый файл, будь то worldoftanks.exe или thewarz.exe

    22 февраля 2013 г. 7:28
  • В остальном - неплохо бы получить дамп ядра, а не мини - после чего думаю или я или sergmat ("ой, я так люблю - когда ты колдуешь"(c) :)) посмотрим глубже. С учётом того что модуль не резолвится - это может быть и вирус, но не всегда - есть нюансы в архитектуре драйверов.

    насчет вирусов я уверен на 95% что их в системе нет, а что касается дампа ядра, скажи как и где его вытащить
    22 февраля 2013 г. 7:29
  • насчет вирусов я уверен на 95% что их в системе нет, а что касается дампа ядра, скажи как и где его вытащить
    В свойствах системы (Win+Break) на вкладке Advanced в секции Startup and Recovery переключить тип дампа со Small memory dump на Kernel memory dump и повторить сбой.
    22 февраля 2013 г. 7:37
    Отвечающий
  • Капитан-очевидность приходил примерно 8 с половиной часов назад и говорил....

    ;))) ну хоть, что-то позитивное за утро. Не задался день явно, хоть иди домой и спать ложись.
    22 февраля 2013 г. 7:42
  • тогда вопрос откладывается до понедельника, т.к. проблема с компьютером на работе, а потомоу пока нет возможности повторить эксперимент
    22 февраля 2013 г. 8:18
  • Синий экран появляется исключительно при любой запущенной игре (Diablo 3, World of Tanks, The War Z)
    проблема с компьютером на работе
    пардон, хорошая у вас "работа" :)
    22 февраля 2013 г. 8:21
    Отвечающий
  • как и обещал, понедельник и вот файл MEMORY.DMP

    Заранее, спасибо за помощь!

    24 февраля 2013 г. 22:04
  • как и обещал, понедельник и вот файл MEMORY.DMP
    1. В командной строке запустите verifier
    2. Самая верхняя опция (standard settings), Next
    3. Automatically select unsigned drivers, Next
    4. Включайте для всех неподписанных драйверов, если они есть.
    5. После настройки - перезапуск и воспроизведение проблемы: полагаю, что получим BSoD с кодом 0xC4 с указанием на модуль.
    25 февраля 2013 г. 8:53
    Отвечающий
  • результат - "не подписанных драйверов не обнаружено"
    25 февраля 2013 г. 21:54
  • результат - "не подписанных драйверов не обнаружено"
    25 февраля 2013 г. 21:54
  • результат - "не подписанных драйверов не обнаружено"
    Этого я и боялся. Позже отпишу по подписанным. Включать проверку для всех - можно существенно "нагнуть" систему. Посмотрю в дампе загруженные модули - дам совет.
    26 февраля 2013 г. 3:33
    Отвечающий
  • спасибо, буду ждать, но нагибать систему не желательно, установлено рабочее ПО которое довольно сложное в настройке
    26 февраля 2013 г. 4:14
  • спасибо, буду ждать, но нагибать систему не желательно, установлено рабочее ПО которое довольно сложное в настройке
    Ok. Сделайте полную резервную копию ОС (System State + Диск C:), копию положите на другой компьютер. Настройки Driver Verifier'а в общем случае обратимы через Last Known Good Configuration, но лучше перестраховаться. Далее - запускайте Verifier.
    Сначала выбираете Display existing settings и делаете скриншот - убеждаемся, что у вас не настроено никаких проверок сейчас (т.е. в области справа список пуст). Далее возвращаетесь к началу: Create custom settings -> Select individual settings from a full list -> выбираете строго проверки Special pool и Pool tracking, после чего выбираете опцию Automatically select all drivers installed on this computer. Далее перезапуск ОС - в случае успешного старта воспроизводите проблему и смотрим на BSoD. Если ОС не запускается - записывайте с каким кодом и при старте нажимаете F8 с выбором Last Known Good Configuration. Special pool в нашем случае несколько избыточен, но не лишний. Задача - получить BSoD с кодом 0xC4 :)
    26 февраля 2013 г. 7:56
    Отвечающий
  • спасибо! но все равно мне как-то страшно =) нет ли случаем более безопасного для системы способа выявления ошибки? Потому как работоспособность системы должна сохранятся.


    26 февраля 2013 г. 22:06
  • Удалите Diablo 3 и Все во, что Вы Таи играете. Займетесь делом, почитайте книжку в конце концов ;))))
    27 февраля 2013 г. 4:12
  • но все равно мне как-то страшно =) нет ли случаем более безопасного для системы способа выявления ошибки? Потому как работоспособность системы должна сохранятся.
    Всё-же сохраняется лёгкое (плавно переходящее в тяжёлое) недоумение - вы так печётесь о работоспособности станции, но вас не беспокоит наличие на ней далёкого от системного и рабочего софта. Выбирать Вам - ряд проблем можно поймать, только устанавливая "ловушки" и доп. проверки. С другой стороны - не запускайте там игры и проблема перестанет влиять на работоспособность системы.
    27 февраля 2013 г. 8:28
    Отвечающий
  • понял Вас, спасибо за помощь! 

    Сделаю бэкап и попробую провернуть то, что Вы выше расписали.

    27 февраля 2013 г. 8:42
  • Анализ дампа (не зря же выкладывали), подробно описывать не буду, только основное:

    была вызвана функция следующим образом ExpReleasePoolQuota(85cfb858)

    1: kd> kb
    ChildEBP RetAddr  Args to Child              
    a4b38bbc 8330ce52 000000c2 0000000d 85cfb858 nt!KeBugCheckEx+0x1e
    a4b38be0 8337477f 85cfb858 83384140 00000000 nt!ExpReleasePoolQuota+0x3d

    Это блок пула неподкачиваемой памяти размером 0x28 если в десятичной то 40 байтов, принадлежащий процессу, находящемуся по адресу 86301930

    1: kd> !pool 85cfb858 
    [...]
    Icp  Process: 86309930
     85cfb788 size:   28 previous size:   28  (Allocated)  Icp  Process: 86309930
     85cfb7b0 size:   98 previous size:   28  (Allocated)  WfpH
     85cfb848 size:    8 previous size:   98  (Free)       Icp 
    *85cfb850 size:   28 previous size:    8  (Free ) *Icp  Process: 86301930
    		Pooltag Icp  : I/O completion packets queue on a completion ports
    [...]
     85cfba28 size:   28 previous size:    8  (Allocated)  Icp  Process: 86309930
     85cfba50 size:   28 previous size:   28  (Allocated)  Icp  Process: 86309930
    [...]

    Первые 8 байтов это заголовок пула

    1: kd> dt _pool_header 85cfb850
    nt!_POOL_HEADER
       +0x000 PreviousSize     : 0y000000001 (0x1)
       +0x000 PoolIndex        : 0y0000000 (0)
       +0x002 BlockSize        : 0y000000101 (0x5)
       +0x002 PoolType         : 0y0001100 (0xc)
       +0x000 Ulong1           : 0x18050001
       +0x004 PoolTag          : 0x20706349
       +0x004 AllocatorBackTraceIndex : 0x6349
       +0x006 PoolTagHash      : 0x2070

    В конце пула - последние 4 байта - это тот самый адрес процесса, вычисятеся как начало_пула+8*BlockSize-4

    1: kd> dd 85cfb850 
    85cfb850  18050001 20706349 00000000 85c202d0
    85cfb860  00000002 00000000 00000000 00000000
    85cfb870  00000000 86301930

    А вот что произошло:

    Функция в начале выполняет несколько проверок, в том числе убеждается что по адресу где лежит адрес процесса в блоке пула действительно находится процесс

    1: kd> dt _kprocess 86309930 -r1 
    nt!_KPROCESS
       +0x000 Header           : _DISPATCHER_HEADER
          +0x000 Type             : 0x3 ''

    Потому что первый байт этого типа объектов (процессов) равен 3

    1: kd> u ExpReleasePoolQuota l20
    nt!ExpReleasePoolQuota:
    8330ce15 8bff            mov     edi,edi
    8330ce17 51              push    ecx
    8330ce18 56              push    esi
    8330ce19 8bf0            mov     esi,eax
    8330ce1b 0fb74602        movzx   eax,word ptr [esi+2]
    8330ce1f 57              push    edi
    8330ce20 a900100000      test    eax,1000h
    8330ce25 744e            je      nt!ExpReleasePoolQuota+0x5f (8330ce75)
    8330ce27 b9ff010000      mov     ecx,1FFh
    8330ce2c 23c1            and     eax,ecx
    8330ce2e 8b7cc6fc        mov     edi,dword ptr [esi+eax*8-4]   <--- загружается адрес процесса
    8330ce32 85ff            test    edi,edi
    8330ce34 743f            je      nt!ExpReleasePoolQuota+0x5f (8330ce75)
    8330ce36 8a07            mov     al,byte ptr [edi]  <---- загружается 1й байт по адресу процесса
    8330ce38 247f            and     al,7Fh
    8330ce3a 3c03            cmp     al,3     <------ в этом месте сравнение с 3
    8330ce3c 7415            je      nt!ExpReleasePoolQuota+0x3d (8330ce53)
    8330ce3e 57              push    edi
    8330ce3f ff7604          push    dword ptr [esi+4]
    8330ce42 83c608          add     esi,8
    8330ce45 56              push    esi
    8330ce46 6a0d            push    0Dh
    8330ce48 68c2000000      push    0C2h
    8330ce4d e834500200      call    nt!KeBugCheckEx (83331e86)

    Если значение не равно 3 то честно вызывается синий экран смерти с соответствующими параметрами
    В блоке пула адрес структуры процесса 86301930 - неправильный!

    1: kd> dt _KPROCESS 86301930 -r1
    nt!_KPROCESS
       +0x000 Header           : _DISPATCHER_HEADER
          +0x000 Type             : 0x74 't'

    Правильный адрес 86309930 (как в примере выше)

    Интересно то, что отличаются эти адреса 1 битом.

    1: kd> .formats 86301930
      Binary:  10000110 00110000 00011001 00110000
    1: kd> .formats 86309930
      Binary:  10000110 00110000 10011001 00110000

    Выводы:

    Переворот одного бита - это может быть железная проблема, память, процессор, что угодно. Но тогда проблема должна наблюдаться с определенной периодичностью постоянно а не только на определенных задачах.

    Предлагаемая трассировка пула должна дать окончательный ответ.

    ps

    4й параметр как объясняет MSDN это "Bad quota process pointer", сначала я не понял, как это точно переводистя "Указатель неверной квоты процесса" или "Указатель процесса неверной квоты" или как? и если Bad qouta - это неверная квота, а process pointer - указатель процесса, вроде все понятно, то как переводить все 4 слова вместе.. . Видимо правильный вариант "Неверный квотируемый указатель процесса (указатель на объект процесс)" Не могли тупо написать для дураков -  "Bad process pointer"?


    I'm preparing for the exam 70-660 TS: Windows Internals

    profile for sergmat at Stack Overflow, Q&A for professional and enthusiast programmers

    • Изменено sergmat 28 февраля 2013 г. 10:29
    27 февраля 2013 г. 22:25
  • спасибо за ответ, у меня почему изначально тоже было подозрение на железо, попробую методом "тыка" (поочередной замены отдельных железяк) определить источник проблемы, если это не поможет то попробую вариант товарища AndricoRus. О результатах обязательно отпишусь. 

    Всем спасибо за помощь!

    28 февраля 2013 г. 10:27
  • Методом исключения нашел причину проблемы, bsod появляется в играх, которые проявляют сетевую активность, проверил на игре не требующей сетевой составляющей и все замечательно работает, без каких либо ошибок. 

    В итоге виновником появления bsod'а является программа написанная русскими разработчиками ViPNet со своим "фаерволом". 

    Всем спасибо за помощь!

    • Помечено в качестве ответа AndricoRusEditor 4 марта 2013 г. 6:19
    4 марта 2013 г. 2:51
  • Методом исключения нашел причину проблемы, bsod появляется в играх, которые проявляют сетевую активность, проверил на игре не требующей сетевой составляющей и все замечательно работает, без каких либо ошибок. 
    В итоге виновником появления bsod'а является программа написанная русскими разработчиками ViPNet со своим "фаерволом". 
    Всем спасибо за помощь!
    Ну уже в порядке эксперимента можно в Verifier'е указать стандартный набор проверок для випнетовского драйвера и воспроизвести проблему :)
    Так сказать - уже ради науки :)
    4 марта 2013 г. 6:20
    Отвечающий