上周在XP系统上测试一个驱动的时候,发现驱动加载不上,“net start”命令只是给出一个无意义的错误代码,驱动的DriverEntry()入口程序还没有得到机会运行。
初步怀疑是引入函数的问题,用WDK工具Depends.exe查看了一下驱动文件,果然是由于_chkstk函数无法解析所导致。
_chkstk是个微软C编译器的辅助库函数,MSDN上对其介绍十分简略:
_chkstk Routine is a helper routine for the C compiler. For x86 compilers, _chkstk Routine is called when the local variables exceed 4096 bytes; for x64 compilers it is 8K.
当编译器察觉到局部变量太大超过限值时(X86系统限值是4K,X64t系统上是8K), 编译器会自动插入_chkstk这个函数以保证栈空间所使用页面在内存中。
问题是发现了,但要查出来究竟在哪个函数中还是要费些心思的。从用户层移植过来不少代码,基本锁定问题出在其中,但如果一个函数一个函数寻找实在是个不讨巧的笨办法,也不符合程序人的一贯风格,便用IDA反编译驱动sys文件,于汇编代码中搜索_chkstk字串,直接锁定出了问题函数。此函数所使用的一个结构体中定义了超大数组,对栈的超常使用在内核中是相当危险的。
解决办法很简单,直接将此结构的定义放在一个从内存分配的结构中即可。问题虽已解决,但对于DDK中有关_chkstk的描述,及其相关的疑问一直让我觉得困扰,比如,为什么X86上是4K,而AMD64架构上可以是8K。
这两天终于有了时间,可以彻底地了结这个疑问了。
要想解决这个问题,还要先从用户栈的分配开始。以ReactOS代码为例,当线程创建时,CreateThread()会调用BasepCreateStack()来创建用户栈,具体可以参见ReactOS源码:
~/ReactOS/lib/kernel32/misc/utils.c。
BasepCreateStack()函数主要做三件事:
- 1,分配栈空间所需的虚拟内存,大小为Stack Reserve Size
- 2,根据Stack Commit Size锁定内存页面,如果Stack Commit Size小于Stack Reserve Size的话,需要增加一个Page,这个额外申请的Page用作Guard Page之用。
- 3,将栈底部的Page设定为Guard Page。
当用户栈被用尽时,会访问到栈底部的Guard Page。而对Guard Page的任何访问都会导致Page Fault的发生。Page Fault处理函数MmAccessFault()可以分析出此次Page Fault是由Guard Page导致,便会默认由用户栈处理程序MiCheckForUserStackOverflow()来处理。如果用户栈并没有溢出的话,即Stack Commit Size小于Stack Reserve Size的情况,MiCheckForUserStackOverflow()会自动向下扩展栈空间,扩展大小为GUARD_PAGE_SIZE。 GUARD_PAGE_SIZE针对不同的CPU架构有不同的定义:
X64: #define GUARD_PAGE_SIZE (PAGE_SIZE * 2)
X86: #define GUARD_PAGE_SIZE PAGE_SIZE
这里便解释了为什么X86系统上的限制是4K(即PAGE_SIZE),而X64上却为8K的原因。
说到此处,该是解答_chkstk()倒底是干什么的时候了。Visual Studio中有_chkstk的源码,以x86为例:
输入参数eax是所需堆栈大小(字节)
labelP _chkstk, PUBLIC
push ecx ; save ecx
cmp eax,_PAGESIZE_ ; more than one page requested?
lea ecx,[esp] + 8 ; compute new stack pointer in ecx
; correct for return address and
; saved ecx
jb short lastpage ; no
;------------
probepages:
sub ecx,_PAGESIZE_ ; yes, move down a page
sub eax,_PAGESIZE_ ; adjust request and...
test dword ptr [ecx],eax ; ...probe it (如果是guard page,刚会导致page fault,最终用户栈
; 将向下扩展一个页面)
cmp eax,_PAGESIZE_ ; more than one page requested?
jae short probepages ; no
lastpage:
sub ecx,eax ; move stack down by eax
mov eax,esp ; save current tos and do a...
test dword ptr [ecx],eax ; ...probe in case a page was crossed
; 调用函数将要访问的堆栈底部 ,如果此页面为guard page,同
; 样会导致用户栈的向下延伸
mov esp,ecx ; set the new stack pointer
; 向下更改栈指针,其上直到原ESP的栈空间为调用函数局部变量
mov ecx,dword ptr [eax] ; recover ecx
mov eax,dword ptr [eax + 4] ; recover return address
; 将返回地址(调用函数中)放入eax
push eax ; prepare return address
; 将返回地址(调用函数中)放入当前栈中,准备返回
; ...probe in case a page was crossed
ret
end
_chkstk()的主要作用是保证栈向下连续的生长。如果没有_chkstk(),当局部变量太多并超过guard page下沿时,若再有压栈操作,将会导致Access violation错误。因为此时堆栈内存页面无效,压栈直接将导致page fault的发生,而page fault处理程序因不能识别此fault的发生原因从而不能做出正确判断和有效处理。
相对用户层,内核程序的处理则相当简单,就如Win7内核中_chkstk实际上就是个空函数。其原因就是内核线程的栈空间是固定的。其取值针对X86及X64架构亦有所不同:
X64: #define KERNEL_STACK_SIZE 0x6000 /* 6个内存页面 */
X86: #define KERNEL_STACK_SIZE 12288 /* 3个内存页面 */
内核中栈资源非常紧缺,并驱动程序的编写有较高的要求,特别是有递归的情况下,一定要注意嵌套的层数,否则很容易收到M$发来的蓝屏。
Windows内核中其实还有一种大堆栈机制,以确保一些对堆栈较高消耗的特殊情况能够得到满足,但这部分完全是黑箱,对用户不可见,不是常见情况,此处不再多述。
参考资料:
1, http://support.microsoft.com/kb/100775/en
2, http://msdn.microsoft.com/en-us/library/ms648426(v=vs.85).aspx
3, http://www.reactos.org ReactOS源码
мостбет доступ Киргизия сегодня http://mostbet64028.help/
Процесс лечения капельницей помогает улучшить состояние пациента уже через короткий период. Важно, что процедура не только снимает симптомы похмелья, но и восстанавливает нормальную работу печени, почек и других органов, пострадавших от токсического воздействия алкоголя. Это помогает предотвратить долгосрочные последствия интоксикации, такие как хроническая усталость, проблемы с органами и психоэмоциональные расстройства.
Выяснить больше – http://kapelnicza-ot-pokhmelya-ekaterinburg-8.ru/
Вывод из запоя на дому с быстрым облегчением в Екатеринбурге — это процедура, направленная на быстрое снятие острых симптомов алкогольного абстинентного синдрома и возвращение пациента к нормальному состоянию, включая случаи алкоголизма и наркомании. Такая услуга удобна тем, что позволяет не только эффективно справиться с зависимостью, но и избавиться от неприятных проявлений запоя, таких как головная боль, тошнота, слабость и психоэмоциональное напряжение, в комфортной домашней обстановке, при этом оказывается наркологическая помощь. Быстрое облегчение без необходимости госпитализации делает этот метод популярным среди пациентов, которым важен быстрый и безопасный результат, а при необходимости можно заказать дальнейшее кодирование или лечение в стационаре.
Подробнее можно узнать тут – vyvod-iz-zapoya-na-domu-ekaterinburg-19.ru/
pinup litsenziya pinup84537.help
sweet bonanza depósito en efectivo oxxo México https://www.sweet-bonanza39147.help
мелбет кз линия ставок http://www.melbet17638.help
Диагностика позволяет установить степень интоксикации, выраженность абстинентного синдрома и наличие сопутствующих заболеваний, которые могут влиять на переносимость терапии.
Получить дополнительные сведения – запой наркологическая клиника тольятти
Основные показания для проведения процедуры:
Углубиться в тему – капельница от похмелья воронеж
Нарколог на дом в Нижнем Новгороде с быстрым приездом специалиста, детоксикацией и медицинской поддержкой в наркологической клинике «Частный медик 24»
Выяснить больше – вызов нарколога на дом в нижнем новгороде
рулонные шторы на пластиковые окна с электроприводом рулонные шторы на пластиковые окна с электроприводом
Эта публикация исследует взаимосвязь зависимости и психологии. Мы обсудим, как психологические аспекты влияют на появление зависимостей и процесс выздоровления. Читатели смогут понять важность профессиональной поддержки и применения научных подходов в терапии.
Изучить рекомендации специалистов – капельница от алкоголя на дому цена
Hey this is kind of of off topic but I was wondering if blogs use WYSIWYG editors or if you have to manually code with HTML. I’m starting a blog soon but have no coding knowledge so I wanted to get advice from someone with experience. Any help would be enormously appreciated!
Buy Tadalafil Online anal sex xxx porn pills
Запой сопровождается выраженной интоксикацией, нарушением сна, слабостью и нестабильностью работы сердечно-сосудистой системы, что характерно для алкоголизма и других форм зависимости, включая наркомании. Самостоятельный выход из этого состояния может быть затруднён и сопровождаться усилением симптомов. Медицинская помощь на дому позволяет снизить риски и начать восстановление под контролем специалиста, помогая человеку быстрее стабилизировать состояние.
Ознакомиться с деталями – https://vyvod-iz-zapoya-na-domu-sankt-peterburg-12.ru
Процедура вывода из запоя на дому включает несколько ключевых этапов, которые обеспечивают максимально быстрое и безопасное восстановление пациента. Эти этапы тщательно контролируются врачом, что минимизирует риски и помогает достичь наилучших результатов.
Ознакомиться с деталями – нарколог на дом вывод из запоя екатеринбург
1win descarcare aplicatie casino 1win descarcare aplicatie casino
мостбет мобильные ставки https://mostbet64028.help/
Такой подход обеспечивает не только устранение симптомов зависимости, но и глубокое восстановление личности. Пациенты получают поддержку врачей на каждом этапе, что делает процесс безопасным и контролируемым.
Детальнее – вывод наркологическая клиника ростов-на-дону
Вызов нарколога на дом в Хабаровске осуществляется при наличии клинических показаний, при которых выездная помощь является обоснованной и безопасной. В клинике «Ясный Вектор» решение о формате вмешательства принимается с учётом жалоб, анамнеза и предполагаемой тяжести состояния.
Подробнее можно узнать тут – запой нарколог на дом хабаровск
Мы собрали для вас самые захватывающие факты из мира науки и истории. От малознакомых деталей до грандиозных событий — эта статья расширит ваш кругозор и подарит новое понимание того, как устроен наш мир.
Детальнее – нарколог на дом
casa de pariuri 1win http://1win82406.help
sweet bonanza bono match https://www.sweet-bonanza39147.help
melbet ставки экспресс футбол melbet ставки экспресс футбол
888starz link http://888starz-bet1.com .
برنامج مراهنات 888starz برنامج مراهنات 888starz.
pin-up ilova o‘rnatish pinup84537.help
Вывод из запоя в Хабаровске осуществляется с учетом принципов доказательной медицины и предполагает непрерывный врачебный контроль. Такой формат позволяет обеспечить безопасное снижение токсической нагрузки и стабилизировать состояние пациента без резких колебаний показателей жизнедеятельности.
Разобраться лучше – анонимный вывод из запоя в хабаровске
Результаты первичной оценки формируют основу для выбора лечебной тактики и объёма медицинского вмешательства.
Разобраться лучше – вывод из запоя клиника в тольятти
Этот интересный отчет представляет собой сборник полезных фактов, касающихся актуальных тем. Мы проанализируем данные, чтобы вы могли сделать обоснованные выводы. Читайте, чтобы узнать больше о последних трендах и значимых событиях!
Есть чему поучиться – прокапаться на дому
Первичный этап лечения в наркологической клинике в Тольятти имеет диагностическое значение и определяет дальнейшую тактику медицинского вмешательства. В клинике «Гармония Волги» обследование включает клиническую оценку состояния пациента, анализ жалоб и выявление факторов риска.
Разобраться лучше – http://narkologicheskaya-klinika-v-tolyatti0.ru/narkologicheskaya-bolnicza-tolyatti/
1win metode de plata Moldova https://www.1win82406.help
pet stain sofa cleaning
В этой информационной статье вы найдете интересное содержание, которое поможет вам расширить свои знания. Мы предлагаем увлекательный подход и уникальные взгляды на обсуждаемые темы, побуждая пользователей к активному мышлению и критическому анализу.
Давай разберёмся досконально – наркологическая помощь на дому
К основным показаниям относятся:
Подробнее – https://vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-2.ru
1win http://www.1win82406.help
Если пациент не может самостоятельно выйти из запоя или симптомы похмелья слишком сильны, вызов нарколога для вывода из запоя на дому с детоксикацией помогает избежать осложнений и минимизировать риски для здоровья. Врач на дому подберет индивидуальный план лечения и проведет все необходимые процедуры для безопасного восстановления организма.
Получить дополнительную информацию – вывод из запоя на дому анонимно
mostbet slots https://mostbet64028.help/
Этот текст посвящён сложным аспектам зависимости и её влиянию на жизнь человека. Мы обсудим психологические, физические и социальные последствия зависимого поведения, а также важность своевременного обращения за помощью.
Уникальные данные только сегодня – вызов нарколога на дом стоимость
інша жінка взвести курки
1xbet azerbaijan 1xbet azerbaijan
mostbet sayt http://mostbet76205.help/
Для жителей Екатеринбурга наркологическая клиника «Частный медик 24» предлагает услуги выезда нарколога на дом для проведения капельницы от похмелья. Это удобный и эффективный способ лечения, особенно если пациент испытывает тяжёлые симптомы похмелья и не может поехать в клинику. Выезд нарколога на дом позволяет начать лечение сразу, не тратя время на поездку и ожидания в клинике. Врач приезжает с необходимыми препаратами и оборудованием, проводит осмотр и назначает необходимую терапию.
Исследовать вопрос подробнее – https://kapelnicza-ot-pokhmelya-ekaterinburg-8.ru/
Текст посвящён распространённым мифам о зависимости и их развенчанию. Мы предоставим научно обоснованную информацию и дадим рекомендации по выбору эффективного способа борьбы с зависимым поведением.
Следуйте по ссылке – капельница от запоя
mostbet hesab açmadan oynamaq https://www.mostbet47152.help
Специалисты клиники контролируют состояние пациентов 24/7: фиксируют динамику показателей, корректируют дозы препаратов и обеспечивают безопасность на всех этапах лечения. Такой формат позволяет избежать осложнений, связанных с самостоятельным выходом из запоя или несанкционированным приёмом медикаментов. Врачи клиники помогают пациентам пройти через этапы очищения, стабилизации и восстановления организма максимально комфортно.
Подробнее тут – https://narkologicheskaya-klinika-v-khabarovske0.ru/narkolog-khabarovsk-anonimno
mostbet ilovani yuklab olish apk http://mostbet47190.help
мелбет пополнить через qiwi мелбет пополнить через qiwi
sweet bonanza es confiable México http://www.sweet-bonanza39147.help
рулонные шторы с электроприводом и дистанционным управлением рулонные шторы с электроприводом и дистанционным управлением
Ниже представлена таблица с ключевыми направлениями терапии, применяемыми в клинике, и их особенностями.
Ознакомиться с деталями – запой наркологическая клиника
Домашний формат лечения требует строгого соблюдения медицинских протоколов, так как врач работает вне стационара и должен учитывать ограничения условий. Поэтому ключевое значение имеет предварительная оценка состояния пациента и корректный выбор тактики вмешательства.
Подробнее – https://narkolog-na-dom-khabarovsk0.ru/khabarovsk-narkolog