蓝屏,谁之过?

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

17,729 条评论

  1. Информация об обращении не передается третьим лицам, а детали лечения обсуждаются только с пациентом.
    Подробнее – vyvod-iz-zapoya-nedorogo

  2. Вывод на дому может облегчить выход из запоя, но результат зависит от исходного состояния. Врач не должен обещать моментальный эффект. Быстро улучшить отдельные симптомы иногда возможно, однако полное восстановление требует времени. Важно соблюдать рекомендации и не возвращаться к спиртному.
    Узнать больше – http://www.vyvod-iz-zapoya-krasnoyarsk67.ru

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

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

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

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

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

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

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

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

  11. В этой статье рассматриваются актуальные вопросы, связанные с развитием медицинской науки и её внедрением в повседневную практику. Особое внимание уделено вопросам профилактики, ранней диагностики и использованию технологий для улучшения здоровья человека.
    А что дальше? – вывод из запоя на дому ночью

  12. В большинстве случаев лечение начинается с детокса, затем подключается психотерапия и, при желании пациента, кодирование. Чтобы не столкнуться с рецидивом, важно соблюдать все рекомендации доктора и не отказываться от реабилитационного этапа. Только комплексный подход дает устойчивый результат и помогает избежать повторных запоев. Обращаясь в клинику, вы получаете полный спектр услуг — от вывода из запоя до восстановления и ресоциализации.
    Ознакомиться с деталями – vyvod-iz-zapoya-kruglosutochno

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

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

  15. Чтобы сделать процесс понятным и управляемым, каждый шаг сопровождается измеримыми маркерами безопасности и эффективности. Корректировки — точечные, по правилу «одного изменения», что позволяет видеть вклад каждого действия и сохранять переносимость.
    Ознакомиться с деталями – наркологическая психиатрическая помощь в казани

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

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

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

  19. Наркологическая помощь доступна круглосуточно. Чтобы заказать выезд, можно позвонить по телефону клиники, написать через онлайн-форму или оставить заявку на обратный звонок. Оператор уточняет продолжительность запойного состояния, адрес, возраст пациента и характер жалоб. При стабильных показателях врач приезжает на дом, а при признаках критической ситуации рекомендуется экстренное обращение в профильную службу.
    Получить больше информации – https://vyvod-iz-zapoya-v-ekaterinburge21.ru/

  20. Наркологическая помощь охватывает несколько последовательных этапов. Иногда требуется только медицинский вывод из непродолжительного запоя, однако при хроническом алкоголизме или наркозависимости эффективное лечение обычно имеет комплексный характер. Врач может рекомендовать детоксикацию, дальнейшее лечение алкоголизма, кодирование и реабилитацию. При наркотической зависимости лечение включает снятие ломки, стабилизацию физического состояния, психиатрическую помощь и работу психолога.
    Получить больше информации – http://www.1narkologicheskaya-klinika-balashiha.ru

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

  22. Вывод из запоя осуществляется в несколько этапов, каждый из которых направлен на постепенное восстановление организма. Такой поэтапный подход снижает нагрузку на внутренние органы и повышает эффективность лечения.
    Получить дополнительные сведения – http://vyvod-iz-zapoya-v-rostove-na-donu16.ru

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

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

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

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

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

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

  29. Психотерапия в лечении алкоголизма играет важнейшую роль. Используются когнитивно-поведенческие техники, групповые занятия, а также индивидуальные консультации с психологами и психотерапевтами. Применение методов мотивационного интервьюирования способствует формированию устойчивой мотивации на трезвость, что подробно описано в исследованиях Американской психиатрической ассоциации. Также актуальную информацию можно найти на портале Психологической ассоциации России.
    Получить больше информации – https://lechenie-alkogolizma-krasnodar00.ru

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

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

  32. Капельница от запоя обычно облегчает проявления интоксикации постепенно, а не мгновенно. По мере введения раствора врач наблюдает за реакциями, контролирует показатели и при необходимости корректирует схему. Эффект зависит от тяжести отравления, продолжительности запоя, возраста, особенностей обмена веществ, состояния внутренних органов и количества алкоголя, которое человек употреблял в последние часы и дни.
    Получить больше информации – kapelnica-ot-zapoya-preparaty

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

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

  35. Вывод из запоя — медицинская помощь при длительном приеме спиртного, когда самостоятельно выйти из тяжелого состояния трудно или небезопасно. В Екатеринбурге можно обратиться за консультацией и организовать выезд специалиста круглосуточно. Наркологическая служба оценивает симптомы, длительность запойного периода, общее самочувствие, хронические заболевания и противопоказания. Основная задача — стабилизировать работу организма, уменьшить обезвоживание, восстановить водно-электролитный баланс и снизить вероятность осложнений.
    Дополнительная информация – вывод из запоя в Екатеринбурге

  36. Соблюдаем конфиденциальность, бережно общаемся с пациентом и его близкими на каждом этапе.
    Изучить вопрос подробнее – narkologicheskaya-klinika-otzyvy

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

发表回复

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