阅读:3189回复:7
请教ndis定时器的问题
翻看了好多帖子,发现有一些也是讨论定时器的问题,后来问题也都解决了,也看了msdn的相关文档,还是无法发现自己代码的问题。
在中间层驱动代码passthru中设置定时器, NDIS_TIMER timer; //全局变量定时器 //在driverentry中初始化 NdisInitializeTimer( &timer, func, NULL ); NdisSetTimer( &timer, 1000 ); //在unload中释放资源 BOOLEAN Canceled ; NdisCancelTimer( &timer, &Canceled ); 现在是只要执行NdisSetTimer( &timer, 1000 );这一条语句,系统就会死机,不管是在driverentry中执行还是在别的地方执行都死机,在driverentry中执行就会导致系统无法启动,但是只要不执行NdisSetTimer( &timer, 1000 );则其它功能一切正常。 看了一些资料,无法确定有什么问题,郁闷…… 请高人指点 |
|
沙发#
发布于:2007-03-28 11:24
你的TimeFun要在IRQL DISPATCH_LEVEL上运行,检查一下你的代码,不要做访问分页内存等动作
|
|
板凳#
发布于:2007-03-28 14:25
谢谢指点。
有访问内存的操作,但是都是使用NdisAllocateMemoryWithTag分配的,应该都不是分配内存的操作,但是在定时器的Timefunc中有NdisAcquireSpinlock的操作,是这个有问题吗? |
|
地板#
发布于:2007-03-28 17:40
据我所知NdisAcquireSpinlock应该是取得权限的,可以试试把定时器放到NdisAcquireSpinlock它结束之后
|
|
地下室#
发布于:2007-03-29 10:46
定时器函数中是可以调用NdisAcquireSpinlock。用windbg看一下蓝屏文件,是什么错误,哪一行代码引起的
|
|
5楼#
发布于:2008-05-24 20:11
引用第1楼zhaock于2007-03-28 11:24发表的 : 如何确保timefun在 dpc级别上运行?请指教 |
|
|
6楼#
发布于:2008-09-11 10:43
sd
|
|
|
7楼#
发布于:2008-09-12 16:25
zhaock的意思应该是:
TimeFun在IRQL DISPATCH_LEVEL上运行是OS帮你保证的, 你要保证的是在TimerFun里不要做IRQL DISPATCH_LEVEL上不能做的操作。 用windbg指定正确的symbol file来双机debug或者看蓝屏后的dump文件,找到错误代码的行数,才是解决蓝屏问题更通用的方法。 |
|