阅读:2088回复:7
关于Programming WDM的源代码
为什么在Programming WDM的代码中,都有这个函数,它是干什么用的?
#if DBG && defined(_X86_) #pragma LOCKEDCODE extern "C" void __declspec(naked) __cdecl _chkesp() { _asm je okay ASSERT(! DRIVERNAME " - Stack pointer mismatch!"); okay: _asm ret } #endif // DBG |
|
|
沙发#
发布于:2001-10-23 12:40
比较堆栈:
在调用某个api之前,将堆栈寄存器(esp)的值保存起来,在调用完此api后,将原来的保存值与新的esp比较,此时调用_chkesp(),如果相等,就会jump okey;(正常情况下应该相等);否则会执行ASSERT()宏。 兄弟,你研究这玩意儿有用吗!_chkesp() 这个api不作任何有用的事,堆栈出错,程序我估计也无法运行了。 其实,涉及到对堆栈的操作都会这么干,而不只是调用api时。 [dazzy 编辑于 2001-10-23 12:46] |
|
板凳#
发布于:2001-10-23 13:16
我并没有看到程序中什么地方调用了这个函数呀?
我没有研究这个冬冬,只是觉得这个东西多余,但高手又把它放在这里,就应该有点道理,所以问一下。。。 |
|
|
地板#
发布于:2001-10-23 17:07
cl 编译选项 GZ 产生运行时调试检测,在产生debug版本时连接会连接一个函数,叫做__chkesp(),这个函数需要你提供。
|
|
地下室#
发布于:2001-10-23 17:14
顺便问一下:LOCKEDCODE是什么意思?
|
|
|
5楼#
发布于:2001-10-24 09:16
你看头文件定义,LOCKEDCODE是 code_seg( ),和起来就是
#pragma code_seg()把其后的代码都放到了非分页内存中。。。 |
|
|
6楼#
发布于:2001-10-24 09:18
Thanks。
|
|
|
7楼#
发布于:2001-10-24 10:43
学到东西
|
|