上周在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源码
Вывод из запоя на дому в Екатеринбурге — это услуга, которая позволяет пациентам пройти лечение в удобных для них условиях, без необходимости посещать стационар. Процедура включает несколько этапов, каждый из которых направлен на снижение уровня алкогольной интоксикации и стабилизацию состояния пациента. Главным преимуществом вывода из запоя на дому является то, что это не только удобно, но и позволяет избежать лишнего стресса, который может быть вызван госпитализацией.
Узнать больше – https://vyvod-iz-zapoya-na-domu-ekaterinburg-17.ru
mostbet cookie siyasəti mostbet cookie siyasəti
mostbet скачать apk https://mostbet18374.help/
melbet kg https://www.melbet10463.help
Капельница от похмелья — это внутривенное введение специально подобранных растворов, которые помогают ускорить выведение токсинов, восстановить водно-электролитный баланс и нормализовать обмен веществ. В состав капельницы могут входить различные компоненты, такие как солевые растворы, витамины, глюкоза и препараты для детоксикации. Она особенно эффективна при последствиях запоя и хронического алкоголизма.
Разобраться лучше – капельница от похмелья анонимно в нижнем новгороде
Капельница от похмелья — это медицинская процедура, которая помогает организму быстрее восстанавливаться после чрезмерного употребления алкоголя, включая последствия запоя и хронического алкоголизма. Эффект капельницы заключается в быстром восстановлении водно-электролитного баланса, выведении токсинов и устранении неприятных симптомов похмелья, таких как головная боль, тошнота и слабость. В отличие от обычных методов, капельница позволяет минимизировать время восстановления и улучшить состояние пациента значительно быстрее.
Получить дополнительные сведения – капельница от похмелья анонимно
Вывод из запоя в стационаре в Санкт-Петербурге: эффективная помощь при алкоголизме, капельницы и наблюдение врачей в наркологической клинике «Элегия Мед».
Выяснить больше – https://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-17.ru/
mostbet в Киргизии mostbet в Киргизии
melbet aviator киргизия http://melbet10463.help
Дополнительным поводом для вызова врача становится состояние, при котором больному трудно вставать, пить воду, есть, сохранять спокойствие или ориентироваться в самочувствии. В таких случаях осмотр на дому позволяет быстрее определить дальнейший маршрут помощи. Иногда уже первый звонок помогает понять, допустим ли домашний формат или лучше сразу рассматривать вывод в стационаре.
Выяснить больше – вызов нарколога на дом в екатеринбурге
mostbet app для ios mostbet92018.help
Наиболее частыми основаниями для выбора такого формата становятся длительный запой, тяжелое течение похмельного синдрома, выраженный тремор, отсутствие сна, тревога, слабость, обезвоживание и жалобы на сердцебиение. Дополнительное значение имеют хронические заболевания сердца, сосудов, печени и нервной системы, на фоне которых выход из запоя может переноситься тяжелее.
Получить дополнительные сведения – быстрый вывод из запоя в стационаре в санкт-петербурге
mostbet qeydiyyat problemi mostbet qeydiyyat problemi
lucky jet игра mostbet https://mostbet18374.help
melbet приложение для ставок https://www.melbet10463.help
mostbet crash қоида https://www.mostbet05741.help
vavada minimalna uplata aircash https://vavada2006.help
vavada sign up vavada2006.help
Такие симптомы требуют медицинского вмешательства, поскольку могут усиливаться и приводить к ухудшению состояния. Капельница помогает стабилизировать самочувствие и снизить нагрузку на организм. Услуги могут предоставляться анонимно, а при необходимости пациент направляется на лечение в стационаре.
Получить дополнительные сведения – капельница от похмелья на дом воронеж
Капельница от похмелья — это медицинская процедура, направленная на быстрое устранение симптомов интоксикации и восстановление работы организма после употребления алкоголя. В отличие от самостоятельных попыток справиться с состоянием, инфузионная терапия позволяет воздействовать на причину недомогания, а не только на его проявления. В наркологической клинике «Похмельная служба» помощь организуется с учётом состояния пациента и проводится под контролем врача.
Узнать больше – капельница от похмелья цена в воронеже
мелбет live dealer мелбет live dealer
В таких ситуациях стационарный уход позволяет обеспечить безопасность пациента, эффективно справиться с его состоянием и подготовить его к дальнейшему лечению или реабилитации. В случае алкоголизма может быть назначена капельница для снятия острых симптомов интоксикации, а также лечение в специализированном центре для комплексного восстановления и профилактики рецидивов.
Узнать больше – http://narkologicheskij-staczionar-sankt-peterburg-2.ru
vavada verifikacija isplate http://vavada2006.help
Клиника «Клиника Плюс» предлагает комплексную наркологическую помощь в Воронеже, включая выезд нарколога на дом, медикаментозную терапию для вывода из запоя и реабилитацию. Мы понимаем, как важно для пациентов и их близких получить поддержку именно в тот момент, когда она нужна.
Выяснить больше – вызов наркологической помощи воронеж
Капельница от похмелья — это медицинский способ восстановления организма после алкогольной интоксикации, который позволяет быстро устранить симптомы и нормализовать состояние. В отличие от домашних методов, инфузионная терапия воздействует на причину ухудшения самочувствия, а не только на внешние проявления. В наркологической клинике «Похмельная служба» процедура проводится с участием врача, который контролирует состояние пациента на каждом этапе.
Исследовать вопрос подробнее – капельница от похмелья анонимно
Такие состояния требуют медицинского вмешательства, поскольку могут ухудшаться без лечения. Капельница позволяет стабилизировать состояние и снизить нагрузку на организм. Услуги могут предоставляться анонимно, а при тяжёлых случаях рассматривается лечение в стационаре.
Узнать больше – https://kapelnicza-ot-pokhmelya-voronezh-4.ru
mostbet koeffitsiyent pasayishi http://mostbet75930.help
Такие симптомы требуют медицинского вмешательства, поскольку могут приводить к ухудшению состояния. Капельница помогает стабилизировать самочувствие и снизить нагрузку на организм. Услуги могут предоставляться анонимно, а при необходимости пациент направляется на лечение в стационаре.
Подробнее – https://kapelnicza-ot-pokhmelya-voronezh-7.ru/
vavada casino u Hrvatskoj https://vavada2006.help
мелбет apk скачать http://melbet48271.help/
mostbet депозит аз телефон http://mostbet05741.help
vavada bankovni transfer hrvatska https://vavada2006.help
Hey great website! Does running a blog such as this take a great deal of work? I’ve virtually no understanding of coding however I had been hoping to start my own blog soon. Anyways, if you have any ideas or techniques for new blog owners please share. I know this is off subject nevertheless I just had to ask. Many thanks!
мелбет crash в приложении https://melbet48271.help
vavada register http://vavada2006.help
melbet блэкджек http://melbet48271.help
mostbet sayt havolasi https://www.mostbet75930.help
aviator game melbet https://melbet58706.help
vavada url vavada url
melbet ставки на теннис melbet48271.help
crash дар мостбет http://mostbet05741.help/
Наркологический стационар с круглосуточным наблюдением предлагает комплексное лечение и восстановление для людей, страдающих от алкогольной или наркотической зависимости. Пациенты получают помощь в условиях стационара, что позволяет устранить риск срыва и обеспечить безопасное и комфортное выздоровление. В таких клиниках работают квалифицированные наркологи, психологи и другие специалисты, которые контролируют процесс реабилитации на всех этапах. В некоторых случаях может потребоваться вывод из запоя с применением капельниц, а также лечение в специализированном центре для более комплексного восстановления.
Углубиться в тему – наркологическая помощь стационар
Аспро Премьер — современный шаблон для создания мощного интернет-магазина с продуманной структурой, высокой скоростью работы и широкими возможностями для продаж. Переходите по запросу обзор интернет-магазина Аспро Премьер. Решение подходит для бизнеса любого масштаба, поддерживает адаптивный дизайн, удобный каталог, SEO-настройки и интеграции. Купить шаблон Аспро Премьер — значит получить надежную платформу для эффективного онлайн-бизнеса и быстрого запуска проекта.
melbet kaspi gold http://www.melbet48271.help
Капельница от похмелья — это медицинская процедура, направленная на устранение последствий алкогольной интоксикации и восстановление работы организма. В отличие от домашних методов, инфузионная терапия позволяет воздействовать на причину состояния, а не только на его проявления. В наркологической клинике «Похмельная служба» капельная терапия проводится с выездом специалиста на дом, что позволяет начать лечение без задержек и в комфортных условиях.
Получить дополнительную информацию – капельница от похмелья вызов на дом
Наркологический стационар в Санкт-Петербурге: помощь при зависимости, восстановление и круглосуточное наблюдение в наркологической клинике «Похмельная служба»
Узнать больше – частный наркологический стационар санкт-петербург
мелбет регистрация на сайте http://melbet58706.help
Особое внимание мы уделяем психологической составляющей. Нарколог на дом в Екатеринбурге в «НЕО+» — это не только физическое очищение, но и работа с мотивацией, разрушение психологических триггеров зависимости. Зависимость разрушает жизнь, поэтому мы предлагаем психотерапевтическое сопровождение. Родственники получают отдельную поддержку: консультации психолога помогают правильно выстроить общение с зависимым человеком и мотивировать его на дальнейшее лечение. Реабилитация может проходить амбулаторно или в стационаре партнёрских центров с комфортабельными условиями, где пациенты находятся под круглосуточным наблюдением.
Углубиться в тему – нарколог на дом анонимно в екатеринбурге
Запой сопровождается выраженной интоксикацией, нарушением сна, нестабильностью давления и изменениями в работе нервной системы. При длительном течении состояние может ухудшаться, и самостоятельный выход становится затруднённым. В таких случаях стационар рассматривается как пространство, где можно безопасно стабилизировать показатели и обеспечить постепенное восстановление.
Подробнее тут – вывод из запоя клиника нижний новгород
Выбор между домашней помощью и стационарным лечением часто определяется степенью физиологической зависимости и наличием сопутствующих патологий. В условиях клиники исключаются внешние триггеры, обеспечивается изоляция от источников алкоголя и создается контролируемая среда, где медицинские решения принимаются на основе объективных показателей, а не субъективных ощущений пациента. Такой подход критически важен для предотвращения осложнений, минимизации дискомфорта абстиненции и формирования устойчивой базы для дальнейшей противорецидивной работы.
Получить дополнительные сведения – вывод из запоя в стационаре нижний новгород