蓝屏,谁之过?

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隐藏得太深,总让人捉摸不定!>

18,543 条评论

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

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

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

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

  5. Медицинский вывод из запоя проводят на дому или в клинике. Нарколог осматривает больного, собирает анамнез, определяет стадию абстиненции и выбирает дальнейшее лечение. При удовлетворительных показателях возможна помощь на дому, а при тяжелых проявлениях специалист может предложить стационарное наблюдение. Красноярский край имеет большую территорию, поэтому при оформлении вызова необходимо назвать город, район и точный адрес. Выездная служба позволяет получить консультацию и начать лечение без самостоятельной поездки в медицинский центр.
    Изучить вопрос подробнее – https://maps.google.com.pa/url?q=https://k.vyvod-iz-zapoya-v-krasnoyarske17.ru

  6. Чтобы заказать услуги, можно позвонить по телефону и описать оператору ситуацию либо оставить заявку на сайте. Администратор уточнит адрес, район, удобное время, жалобы и контактные данные. Если необходимо, специалист перезвонит для уточнения медицинской информации. Москва и Московская область обслуживаются с учетом графика выездных сотрудников, расстояния и текущей загрузки. Конкретные условия, сроки приезда и стоимость следует уточнить перед оформлением вызова.
    Изучить вопрос подробнее – kapelnica-na-dom-anonimno

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

  8. В подобных случаях медицинская помощь помогает снизить вероятность тяжелых последствий. При критических признаках, потере сознания, судорогах, выраженной дыхательной или сердечной недостаточности требуется экстренное обращение в государственную скорую помощь. Вывод из запоя не заменяет реанимационные мероприятия и не должен проводиться самостоятельно при угрожающих жизни состояниях.
    Подробнее – https://vyvod-iz-zapoya-domodedovo3.ru/

  9. Текст посвящён распространённым мифам о зависимости и их развенчанию. Мы предоставим научно обоснованную информацию и дадим рекомендации по выбору эффективного способа борьбы с зависимым поведением.
    Информация доступна здесь – круглосуточный нарколог реутов

  10. Текст посвящён распространённым мифам о зависимости и их развенчанию. Мы предоставим научно обоснованную информацию и дадим рекомендации по выбору эффективного способа борьбы с зависимым поведением.
    Лучшее решение — прямо здесь – экстренный вызов нарколога реутов

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

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

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

  14. And nothing says style quite like driving a luxury car. Not an easy combination to find. Fortunately, I stumbled upon exactly what I was looking for. exotic car rental miami — High-end brands, pristine conditions, and plenty of options. They helped me choose a car that fit my style and budget. It made every journey feel like an adventure. This is definitely the company to choose. miami supercar rental miami supercar rental Check the link for the full fleet and pricing for the area. It’s the easiest way to elevate your trip. Luxury car rental Miami — drive in style, create memories!

  15. Вывод из запоя в Реутове в центре «Похмельная служба» — это профессиональная наркологическая помощь людям, столкнувшимся с длительным употреблением алкоголя, выраженным похмельным синдромом и ухудшением общего самочувствия. Лечение может проводиться на дому или в клинике, а при тяжелых случаях врач рекомендует госпитализацию в стационар. Нарколог оценивает состояние человека, уточняет продолжительность запоя, количество спиртного, наличие хронических заболеваний, принимаемых лекарственных средств и осложнений. На основании этих данных подбираются препараты, растворы, витамины и другие средства, необходимые для безопасного выведения токсинов и стабилизации работы организма.
    Узнать больше – skoraya-pomoshch-vyvoda-iz-zapoya

  16. Выезд нарколога на дому удобен тем, что помощь проводится в спокойной обстановке. Капельница на дому может быть организована круглосуточно, если состояние человека позволяет такой формат; выезд доступен в том числе ночью и по выходным. Нарколог и специалисты выездной службы работают по медицинским стандартам, а сама капельница проводится с наблюдением за самочувствием. Наркологическая служба принимает звонок, уточняет адрес и основные жалобы, затем направляет врача. Капельница назначается с учетом осмотра, а препараты вводятся постепенно. Доктор следит за реакцией пациента и при необходимости меняет темп инфузии.
    Узнать больше – врач на дом капельница от запоя

  17. Вызывать нарколога стоит при заметном ухудшении самочувствия на фоне алкоголя или наркотиков, а также тогда, когда зависимый не способен прекратить употребление самостоятельно. Чем дольше продолжается запой или прием вещества, тем сложнее заранее предсказать реакцию организма.
    Изучить вопрос подробнее – https://6.narcolog-na-dom-voronezh0.ru/

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

  19. When I planned my Miami vacation, I wanted every detail to be perfect. Some companies had nice cars but questionable service. Then I came across exactly what I was looking for. exotic car rental miami — Every vehicle was in perfect condition. No pressure, just great service. Drove along the coast with the sun shining. If you want a car that matches the city’s vibrant energy. miami luxury car rental miami luxury car rental All the details are there for South Beach. If you want a luxury car in Miami — just use the link. Luxury car rental Miami — the ultimate way to experience the city!

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

  21. Главный ориентир для родственников — не только количество выпитого, но и изменения поведения, сознания и физических показателей больного. Если состояние быстро ухудшается, человек плохо ориентируется в обстановке или уже имеет серьезные хронические заболевания, помощь необходимо получить максимально оперативно. Экстренная наркологическая помощь особенно важна при сочетании алкоголя с лекарственными средствами, наркотиками или другими психоактивными веществами.
    Ознакомиться с деталями – https://vyvod-iz-zapoya-reutov4.ru/

  22. Və ya artıq təcrübəniz varsa, amma əlavə bonus əldə etmək istəyirsinizsə. Amma ən etibarlısı və işləyəni bu saytda oldu. 1xbet promo kod — mərclərimə daha çox imkan əldə etdim. Heç bir gizli məqam yoxdur. Bu, mənə əlavə üstünlük verir və uduş şansımı artırır. 1xbet promo kodlar 1xbet promo kodlar Bütün aktiv promo kodlar, bonus şərtləri və istifadə qaydaları buradadır üçün Azərbaycan. 1xbet promo kod ilə əlavə bonus qazanmaq istəyirsinizsə — linkə keçin və aktiv kodu tapın. 1xbet promo kod — daha çox qazanmağınız üçün fürsətdir!

  23. Чем дольше человек употребляет алкоголь, тем больше факторов врач учитывает перед постановкой капельницы. Запой продолжительностью несколько дней и длительного характера способен сопровождаться выраженным обезвоживанием, изменением концентрации натрия, калия и магния, нарушением ритма сердца и обменными проблемами. Капельница в таких условиях требует особенно тщательного выбора компонентов. Врач клиники оценивает не только последние сутки, но и характер регулярного употребления за недели или месяцев, наличие предыдущих эпизодов абстиненции и реакцию организма на лечение.
    Ознакомиться с деталями – https://3.kapelnica-ot-zapoya-v-moskve14.ru/

  24. And for me, that means driving something that matches the vibe. Some had great cars but poor customer service. Then I found a company that had everything I was looking for. luxury car rental miami — Every car was in pristine condition. They guided me through the options without any pressure. I got compliments everywhere I went. This is the company to go with. miami luxury car rentals miami luxury car rentals Save it, share it, don’t lose it for the area. It’s the easiest way to make your trip unforgettable. Luxury car rental Miami — the ultimate driving experience!

  25. Стресс, слёзы, замкнулся в себе. Начали искать варианты. Школа онлайн — и не пожалели. Появились друзья по учёбе, общаются в чатах. Программа такая же, как в обычной школе. Прошло полгода — сын спокоен, оценки хорошие, атмосфера дома нормальная. школа-пансион школа-пансион Сохраните, поделитесь, не потеряйте для столицы. Если переезд или другие обстоятельства мешают обычной школе — посмотрите на онлайн-формат. Школа онлайн — учёба там, где вам удобно!

  26. Врач проводит осмотр и определяет степень тяжести абстиненции. В некоторых случаях стандартная капельница на дому позволяет значительно улучшить самочувствие, однако при серьезно измененных показателях здоровья, психозе, угрозе жизни или сочетанном употреблении различных веществ специалист предложит госпитализацию. Такое решение принимается исходя из безопасности больного, а не только из желания провести лечение дома.
    Подробнее – narkolog-vyvod-iz-zapoya-reutov

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

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

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

  30. Специалисты регулярно помогают при интоксикации, запоях, абстиненции и сложных состояниях зависимости.
    Получить больше информации – https://1.vivod-iz-zapoya-voronezh15.ru/

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

  32. К стандартным ситуациям, в которых врач может рассматривать домашнюю инфузию, относятся следующие случаи:
    Ознакомиться с деталями – vyzvat-kapelnicu-na-dom

  33. Центр «Элегия Мед» организует услуги на дому круглосуточно по Москве и Московской области. Чтобы вызвать врача, достаточно оставить заявку по телефону через оператора или воспользоваться формой записи на сайте. Администратор уточнит адрес, район, удобное время, причину обращения и необходимые данные для организации выезда. Информация о здоровье и обработку персональных данных осуществляют с учетом политики конфиденциальности и требований действующего законодательства. Обращение не требует длительного ожидания: при наличии свободной бригады специалист может приехать срочно, однако точное время зависит от района, дорожной ситуации и текущего графика персонала.
    Подробнее – http://www.nadomu4.kapelnica-ot-zapoya-v-moskve14-1.ru

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

发表回复

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