蓝屏,谁之过?

Bug总能在你意想不到的地方给你个措手不及,只是它所带来并不是惊喜,而是Blue Screen Of Death !

既如此,只能兵来将挡。

先介绍一下程序的大体流程:

NTSTATUS
XXXProcessDirents(…)
{    
    do {
        KeEnterCriticalRegion();
        ExAcquireResourceSharedLite(&fcb->Resource, TRUE);

        /* access several members of fcb structure */
        ExReleaseResourceLite(&fcb->Resource);
        KeLeaveCriticalRegion();

         XXXXProcessDirent(…);

    } while (list_is_not_empty(….));

    return status;
}

NTSTATUS
XXXXProcessDirent(…)
{
    HANDLE handle = NULL;
    XXXX_FILE_HEADE fileHead;
    ……

    /* open file */
    status = ZwCreateFile(&handle, GENERIC_READ, &oa, &iosb, NULL, 0,
                          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                          FILE_OPEN, 0, NULL, 0);

    /* read file header*/
    status = ZwReadFile(handle, ioevent, NULL, NULL, &iosb, (PVOID)&fileHead,
                        sizeof(XXXX_FILE_HEADE), &offset, NULL);

    /* check whether file is interesting to us */
    if (status == STATUS_SUCCESS && iosb.Information == sizeof(……)) {
        /* it’s my taste, haha */
    }

    /* close file, not interested in it any more */

    if (handle){
        ZwClose(handle);
    }

    return status;
}

过程比较简单,XXXProcessDirents()会循环调用XXXProcessDirent(),直至列表中所有项全检查完毕。

下面再来看windbg分析吧:

1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

IRQL_NOT_LESS_OR_EQUAL (a)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If a kernel debugger is available get the stack backtrace.
Arguments:
Arg1: 0abc9867, memory referenced
Arg2: 00000002, IRQL
Arg3: 00000001, bitfield :
bit 0 : value 0 = read operation, 1 = write operation
bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
Arg4: 806e7a2a, address which referenced memory

Debugging Details:
------------------

WRITE_ADDRESS:  0abc9867

CURRENT_IRQL:  2

FAULTING_IP:
hal!KeAcquireInStackQueuedSpinLock+3a
806e7a2a 8902            mov     dword ptr [edx],eax

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0xA

PROCESS_NAME:  System

TRAP_FRAME:  b9019bbc -- (.trap 0xffffffffb9019bbc)
ErrCode = 00000002
eax=b9019c40 ebx=00000000 ecx=c0000211 edx=0abc9867 esi=c0000128 edi=8842d268
eip=806e7a2a esp=b9019c30 ebp=b9019c68 iopl=0         nv up ei ng nz na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010286
hal!KeAcquireInStackQueuedSpinLock+0x3a:
806e7a2a 8902            mov     dword ptr [edx],eax  ds:0023:0abc9867=????????
Resetting default scope

LAST_CONTROL_TRANSFER:  from 806e7a2a to 80544768

STACK_TEXT:
b9019bbc 806e7a2a badb0d00 0abc9867 804f4e77 nt!KiTrap0E+0x238
b9019c68 806e7ef2 00000000 00000000 b9019c80 hal!KeAcquireInStackQueuedSpinLock+0x3a
b9019c68 b9019d24 00000000 00000000 b9019c80 hal!HalpApcInterrupt+0xc6
WARNING: Frame IP not in any known module. Following frames may be wrong.
b9019cf0 80535873 00000000 8896fb20 00000000 0xb9019d24
b9019d10 b79d87ff ba668a30 8859b7e8 00000440 nt!ExReleaseResourceLite+0x8d
b9019d2c b79d8a5c 8a3ff2f0 00000003 ba6685f0 XXXXX!XXXProcessDirents+0xef
b9019d88 b79e163a e2f6b170 00000001 00000001 XXXXX!XXXKernelQueryDirectory+0x20c
b9019ddc 8054616e b79e1530 88a8ae00 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

问题出在系统函数ExReleaseResourceLite()及KeAcquireInStackQueuedSpinLock()上,且程序要写的地址为0abc9867 ,明显不对,所以此处可做栈损坏推断。

第一嫌疑要考虑的是,XXXProcessDirents()中有锁保护的部分,此部分是果真是最容易造成栈损坏buffer复制操作。但经过仔细检查及测试,便排除了此部分出错的可能。

在排除第一嫌疑后,就没有明显目标了。只好再接着看windbg log:

貌似KeAcquireInStackQueuedSpinLock()要写的地址是LockHandle的LockQueue->Next,而LockHandle一般都在从当前堆栈分配的,由此可肯定之前对于栈损坏的推断。可问题是,是谁导致的栈损坏。

Stack中有hal!HalpApcInterrupt()调用记录,它是处理APC的软中断。hal!HalpApcInterrupt()会一般会调用nt!KiDeliverApc()来处理线程的APC队列。但当ExReleaseResourceLite()调用的时候,线程还处于临界区内(Critical Section),此时User mode APC及Kernel mode normal APC都会被禁止的,但Kernel mode special APC不会。

Kernel Special APC最常见的情况便是由IoCompleteRequest()添加的:在APC Level中调用IopCompleteRequest()以处理Irp的Stage 2的清理工作。

至此,问题终于有些眉目了。分析代码中唯一有可能导致APC添加的地方就在函数XXXXProcessDirent()中的ZwReadFile()调用,而且fileHead正是于堆栈中分配的。

想到此处,此bug的根据原因便付出水面:

XXXXProcessDirent()没有处理ZwReadFile()返回STATUS_PENDING的情况,此情形下,XXXXProcessDirent()退出并继续执行,而之前的ZwReadFile()的IRP完成操作也在同时进行(还没有完成),并且此完成操作所要写的fileHead地址,正是早已被回收并加以重用的当前栈。

搞清楚之后,便在调用ZwReadFile()后,特别针对STATUS_PENING的情况来调用ZwWaitForSingleObject()以确保读操作全部完成后,再进行下一步操作。

到此,问题解决!

一个蓝屏的问题,竟然如此之绕,不禁让我想起刘震云的《一句顶一万句》,只是这能顶一万句的一句到底是哪句呢?

<下一步打算写写APC相关的东西,操作系统将APC隐藏得太深,总让人捉摸不定!>

6,491 条评论

  1. В этой публикации мы предложим ряд рекомендаций по избавлению от зависимостей и успешному восстановлению. Мы обсудим методы привлечения поддержки и важность самосознания. Эти советы помогут людям вернуться к нормальной жизни и стать на путь выздоровления.
    Подробнее тут – “”вывод из запоя на халтурина – лечение алкоголизма, лечение наркомании

  2. В этом интересном тексте собраны обширные сведения, которые помогут вам понять различные аспекты обсуждаемой темы. Мы разбираем детали и факты, делая акцент на важности каждого элемента. Не упустите возможность расширить свои знания и взглянуть на мир по-новому!
    Ознакомиться с деталями – вызов нарколога на дом круглосуточно

  3. Публикация приглашает вас исследовать неизведанное — от древних тайн до современных достижений науки. Вы узнаете, как случайные находки превращались в революции, а смелые мысли — в новые эры человеческого прогресса.
    Переходите по ссылке ниже – нарколог на дом в клинике москва

  4. Эта статья сочетает познавательный и занимательный контент, что делает ее идеальной для любителей глубоких исследований. Мы рассмотрим увлекательные аспекты различных тем и предоставим вам новые знания, которые могут оказаться полезными в будущем.
    Более того — здесь – лечение от запоя в стационаре

  5. Лечение алкоголизма в Сергиевом Посаде важно рассматривать не как разовую «чистку» или временный перерыв, а как последовательный маршрут. Самый уязвимый период — первые 24–72 часа после прекращения употребления: днём может стать легче, но к вечеру и ночью волной возвращаются тревога и бессонница, усиливается внутреннее напряжение, появляются телесные симптомы. В этот момент человек чаще всего срывается, потому что ему кажется, что «иначе не выдержу». Поэтому качественная помощь строится так, чтобы пациент прошёл вечер и ночь безопасно, с понятными ориентирами и медицинской поддержкой, а затем перешёл к восстановлению и профилактике рецидива.
    Подробнее можно узнать тут – https://lechenie-alkogolizma-sergiev-posad12.ru/prinuditelnoe-lechenie-ot-alkogolizma-v-sergievom-posade

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

  7. В статье представлены ключевые моменты по актуальной теме, дополненные советами экспертов и ссылками на дополнительные ресурсы. Цель материала — дать читателю инструменты для самостоятельного развития и принятия осознанных решений.
    Уточнить детали – сколько стоит прокапаться на дому

  8. В статье представлены ключевые моменты по актуальной теме, дополненные советами экспертов и ссылками на дополнительные ресурсы. Цель материала — дать читателю инструменты для самостоятельного развития и принятия осознанных решений.
    Изучить эмпирические данные – вывожу из запоя екатеринбург

  9. Этот интересный отчет представляет собой сборник полезных фактов, касающихся актуальных тем. Мы проанализируем данные, чтобы вы могли сделать обоснованные выводы. Читайте, чтобы узнать больше о последних трендах и значимых событиях!
    Познакомиться с результатами исследований – вывод из запоя в стационаре санкт-петербург

  10. В статье по вопросам здоровья мы рассматриваем актуальные проблемы, с которыми сталкивается общество. Обсуждаются заболевания, факторы риска и важные аспекты профилактики. Читатели получат полезные советы о том, как сохранить здоровье и улучшить качество жизни.
    Прочесть заключение эксперта – запой самара

  11. Этот обзор сосредоточен на различных подходах к избавлению от зависимости. Мы изучим традиционные и альтернативные методы, а также их сочетание для достижения максимальной эффективности. Читатели смогут открыть для себя новые стратегии и подходы, которые помогут в их борьбе с зависимостями.
    Расширить кругозор по теме – выведение из запоя клиника

  12. Выезд врача — это не «процедура без вопросов», а клиническое решение. На месте оценивают давление, пульс, дыхание, степень обезвоживания, уровень сознания, выраженность тревоги, наличие боли, судорожных проявлений, неврологические симптомы. После этого подбирают схему поддержки, объясняют ограничения и ожидаемую динамику: что должно улучшаться в первые часы, какие симптомы допустимы, а какие требуют немедленного обращения. Важная часть — рекомендации на ближайшие сутки: режим питья и питания, сон, контроль давления, что категорически нельзя смешивать и почему. Такой подход снижает риск осложнений и помогает не «сорваться» в самостоятельные эксперименты.
    Разобраться лучше – наркологическая москва

  13. В этом обзорном материале представлены увлекательные детали, которые находят отражение в различных аспектах жизни. Мы исследуем непонятные и интересные моменты, позволяя читателю увидеть картину целиком. Погрузитесь в мир знаний и удивительных открытий!
    Изучить вопрос глубже – наркология вывод из запоя

  14. Самостоятельный выход часто строится на ошибочных решениях: «уменьшать дозу», смешивать алкоголь со снотворными, принимать седативные без понимания влияния на дыхание и сердце, использовать сомнительные «похмельные» наборы. Такие действия могут временно приглушить симптомы, но повышают риск ухудшения и делают состояние непредсказуемым. Ещё одна проблема — отсутствие контроля: человек не замечает, как давление уходит в опасные цифры, как развивается обезвоживание или как усиливаются неврологические симптомы. В клинике же у врача есть задача не просто «снять неприятное», а стабилизировать организм, защитить сердце и сосуды, восстановить сон и снизить тревогу так, чтобы дальнейшее восстановление стало реальным.
    Подробнее – https://vyvod-iz-zapoya-moskva1-12.ru/

  15. Обзор посвящён процессу восстановления после зависимостей. Мы расскажем о различных этапах реабилитации, поддерживающих ресурсах и важности мотивации в достижении устойчивого выздоровления.
    Почему это важно? – вывести из запоя недорого на дому

  16. Лечение алкоголизма в Сергиевом Посаде важно рассматривать не как разовую «чистку» или временный перерыв, а как последовательный маршрут. Самый уязвимый период — первые 24–72 часа после прекращения употребления: днём может стать легче, но к вечеру и ночью волной возвращаются тревога и бессонница, усиливается внутреннее напряжение, появляются телесные симптомы. В этот момент человек чаще всего срывается, потому что ему кажется, что «иначе не выдержу». Поэтому качественная помощь строится так, чтобы пациент прошёл вечер и ночь безопасно, с понятными ориентирами и медицинской поддержкой, а затем перешёл к восстановлению и профилактике рецидива.
    Выяснить больше – sergiev-posad-lechenie-alkogolizma

  17. Выезд врача на дом рассматривают в ситуациях, когда человеку тяжело добраться до медицинского учреждения, он ослаблен после нескольких дней употребления спиртного или родственникам важно быстро получить очную оценку состояния. После осмотра определяют, допустим ли домашний формат, нужна ли капельница, достаточно ли наблюдения на дому или следует сразу рассматривать другой объем помощи. Если подобные эпизоды повторяются, дальнейшее обсуждение может касаться не только текущего состояния, но и лечения алкоголизма, кодирования, участия психолога, психиатра и реабилитации. В таких случаях наркологическая помощь рассматривается шире, чем разовый вызов на дом.
    Изучить вопрос глубже – нарколог на дом москва

  18. Когда человек или его родственники понимают, что нужен нарколог на дом в Екатеринбурге, время становится решающим фактором. Запой, ломка, тяжёлая интоксикация — в таких ситуациях промедление может привести к необратимым последствиям для здоровья и жизни. Наша клиника создана именно для того, чтобы оказывать эффективную круглосуточную помощь в самых сложных случаях. Мы не заставляем ждать в очередях государственных учреждений, не ставим на учёт и не разглашаем информацию. Всё происходит анонимно, в домашних условиях или в комфортных условиях нашей партнёрской клиники. Пациенты из Екатеринбурга, Свердловской области, а также соседних регионов уже более 12 лет выбирают «НЕО+» благодаря сочетанию скорости, профессионализма, полной анонимности и доказанной результативности. Алкогольной зависимости и проблем с наркотиками подвержены как алкоголиков, так и наркозависимых, и мы помогаем всем.
    Подробнее тут – вызов нарколога на дом екатеринбург

  19. Attractive component to content. I simply stumbled upon your weblog and in accession capital to claim that I get actually enjoyed account your weblog posts. Any way I’ll be subscribing for your augment and even I fulfillment you get entry to consistently rapidly.
    new online casino slots

  20. Помощь на дому рассматривают при состояниях, которые сопровождаются выраженным ухудшением самочувствия после алкоголя. Обычно речь идет о нескольких днях запоя, тяжелом похмелье, бессоннице, тревоге, дрожи в руках, слабости, тошноте, сухости во рту, отсутствии аппетита и признаках обезвоживания. В таких случаях врачебный осмотр нужен для оценки тяжести состояния и выбора безопасной тактики.
    Получить дополнительные сведения – нарколог на дом вывод в москве

  21. В данной обзорной статье представлены интригующие факты, которые не оставят вас равнодушными. Мы критикуем и анализируем события, которые изменили наше восприятие мира. Узнайте, что стоит за новыми открытиями и как они могут изменить ваше восприятие реальности.
    Узнать напрямую – нарколог запой

  22. В данной публикации мы поговорим о процессе восстановления от зависимости, о том, как вернуть себе нормальную жизнь. Мы обсудим преодоление трудностей, значимость поддержки и наличие программ реабилитации. Читатели смогут узнать о ключевых шагах к успешному восстановлению.
    Ознакомиться с отчётом – прокапаться от алкоголя цены

  23. Затяжной запой — это не бытовая слабость, а медицинское состояние, требующее профессионального лечения в условиях стационара. Когда организм истощен длительной интоксикацией, нарушен сон, отсутствует аппетит, а попытки самостоятельно прекратить употребление сопровождаются тремором, тревогой и скачками давления, единственным безопасным решением становится контролируемая детоксикация. Наркологическая клиника «Элегия Мед» в Санкт-Петербурге предоставляет профессиональное лечение с применением сертифицированных протоколов, непрерывный контроль состояния пациента и индивидуальный подбор медикаментозной поддержки. Мы работаем круглосуточно, обеспечивая быстрое реагирование на обращения, четкую диагностику при поступлении и прозрачное взаимодействие с родственниками. Все процедуры выполняются с соблюдением протоколов доказательной медицины, стандартов Минздрава РФ и строгих правил конфиденциальности. Первичная оценка состояния начинается с дистанционной консультации, что позволяет врачам заранее подготовить необходимое оборудование и скорректировать план госпитализации еще до прибытия пациента. При необходимости заказать консультацию или оформить выезд бригады, доступные способы связи включают телефон, мессенджеры и онлайн-форму на сайте.
    Подробнее можно узнать тут – http://www.domen.ru

  24. В этой статье представлен занимательный и актуальный контент, который заставит вас задуматься. Мы обсуждаем насущные вопросы и проблемы, а также освещаем истории, которые вдохновляют на действия и изменения. Узнайте, что стоит за событиями нашего времени!
    Получить дополнительные сведения – капельница на дому в самаре цены

  25. Наркологическая клиника нужна, чтобы разорвать этот сценарий безопасно и без хаотичных решений. В клинике «Баланс Плюс» лечение выстраивается по этапам: оценка состояния и рисков, стабилизация (в том числе детоксикация при показаниях), подбор формата — стационар, амбулаторно или помощь на дому — и обязательно план на первые 24–72 часа. Эти дни критичны: именно в этот период чаще всего усиливаются тревога и бессонница, и без понятных ориентиров человек легко возвращается к алкоголю или веществам «чтобы отпустило».
    Исследовать вопрос подробнее – http://narkologicheskaya-klinika-orekhovo-zuevo2-12.ru/horoshaya-narkologicheskaya-klinika-v-orekhovo-zuevo/

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注