蓝屏,谁之过?

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,508 条评论

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

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

  3. Нарколог на дом в Москве: срочная медицинская помощь, капельницы и восстановление состояния в наркологической клинике «Клиника доктора Калюжной».
    Получить дополнительную информацию – нарколог на дом вывод

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

  5. Nice post. I learn something totally new and challenging on sites I stumbleupon everyday. It’s always interesting to read through content from other writers and practice something from their web sites.
    Wolf Gold

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

  7. Do you have a spam issue on this website; I also am a blogger, and I was wanting to know your situation; many of us have created some nice practices and we are looking to trade techniques with other folks, please shoot me an e-mail if interested.
    Sweet Bonanza

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

  9. Hi to every , for the reason that I am genuinely keen of reading this blog’s post to be updated daily. It consists of nice material.
    tada gaming

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

  11. Pretty element of content. I simply stumbled upon your web site and in accession capital to claim that I acquire actually enjoyed account your weblog posts. Any way I will be subscribing for your feeds and even I success you get admission to persistently rapidly.
    Watch sexual porno video xxx sex adults site

  12. Эта статья предлагает живое освещение актуальной темы с множеством интересных фактов. Мы рассмотрим ключевые моменты, которые делают данную тему важной и актуальной. Подготовьтесь к насыщенному путешествию по неизвестным аспектам и узнайте больше о значимых событиях.
    Всё, что нужно знать – https://maisgazeta.com/ir-2021-receita-libera-consultas-ao-1o-lote-de-restituicao

  13. В обзорной статье вы найдете собрание важных фактов и аналитики по самым разнообразным темам. Мы рассматриваем как современные исследования, так и исторические контексты, чтобы вы могли получить полное представление о предмете. Погрузитесь в мир знаний и сделайте шаг к пониманию!
    Получить дополнительные сведения – https://www.cutralcoalinstante.com/2024/04/22/el-argentinosaurus-huinculensis-de-chocolate-sera-la-novedad-para-el-cumple-de-plaza

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

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

  16. Главная задача — сделать состояние управляемым: уменьшить тошноту, тремор, потливость, головную боль, «туман» в голове, снизить тревогу, выровнять показатели, помочь восстановить сон. При этом важно сохранять реалистичные ожидания: после длительного запоя организм истощён, поэтому слабость и эмоциональная нестабильность могут сохраняться некоторое время. Ключевой показатель качества помощи — не обещание «идеально за час», а безопасная динамика и понятные ориентиры на первые сутки.
    Получить дополнительные сведения – https://vyvod-iz-zapoya-klin12.ru/vyvod-iz-zapoya-kapelnica-v-klinu

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

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

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

  20. Такие состояния требуют не только лечения, но и наблюдения, поскольку динамика может меняться в течение короткого времени. Стационар позволяет минимизировать риски и обеспечить безопасность пациента. При этом услуга может предоставляться анонимно, а цена лечения зависит от состояния пациента.
    Ознакомиться с деталями – врач вывод из запоя

  21. Многие откладывают лечение годами, потому что периодами удаётся «держаться». Но зависимость редко исчезает сама. Обычно она меняет форму: запои становятся длиннее, алкоголь начинает использоваться как «лекарство» от тревоги и бессонницы, утренние дозы превращаются в способ «прийти в себя», а трезвость воспринимается как постоянное напряжение.
    Ознакомиться с деталями – http://lechenie-alkogolizma-sergiev-posad12.ru

  22. Такой подход позволяет достичь устойчивого результата без срывов и рецидивов. Пациенты получают помощь не только на уровне физиологии, но и на уровне личностных изменений, что делает лечение глубоким и эффективным.
    Получить дополнительные сведения – http://narcologicheskaya-clinika-v-rnd19.ru

  23. Медицинская команда контролирует каждый этап лечения, отслеживая динамику и корректируя терапию при необходимости. Благодаря такому подходу удаётся добиться не временного улучшения, а устойчивого восстановления.
    Узнать больше – платная наркологическая клиника ростов-на-дону

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

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

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

  27. Состояние после длительного употребления алкоголя или наркотических веществ сопровождается комплексом симптомов: обезвоживание, нарушение работы сердечно-сосудистой системы, тревожность, бессонница, слабость. В таких случаях важно не откладывать помощь, поскольку самостоятельное восстановление организма может быть затруднено. Наркологическая помощь на дому позволяет быстро стабилизировать показатели и начать контролируемое лечение.
    Разобраться лучше – нарколог на дом вывод в нижнем новгороде

发表回复

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