阅读:1840回复:18
在 Driver 中用哪种方式休眠比较好?
在 DriverUnload 时必需等待某个标志清零才能继续往下运行,开始用 KeStallExecutionProcessor,但发现其休眠时,会占用很多 CPU 资源,于是想改用 KeDelayExecutionThread,但在每次调用此方法时,系统总是报 IRQL_NOT_LESS_OR_EQUAL 蓝屏错误。感到很奇怪。
为什么调用 KeDelayExecutionThread 会出现这样的错误呢?我该调用什么方法来休眠呢? |
|
沙发#
发布于:2003-06-16 09:45
用KeWaitForSingleObject 实现休眠,在等待一个内核对象时CPU占有比较低。
|
|
|
板凳#
发布于:2003-06-16 10:58
先谢谢了,我只是想要 while 循环测试一个值,等它达到某个标志时再往下执行,所以想在 while 里加一个 delay。请问一下 DDK 里没有简单的 Sleep 函数吗?
还有为什么像 KeSetTimer(&timer, -100000000, 0); 这样的调用为什么通不过啊?第三个参数一定要是 Dpc 对象吗? |
|
地板#
发布于:2003-06-16 11:40
LARGE_INTEGER
KeSetTimer(...)中第三个参数一定要是可选的,可以不要。你的第二个参数写法不对,它是 LARGE_INTEGER 类型,参考下面填写 LARGE_INTEGER .HighPart = ...; LARGE_INTEGER .LowPart = ...; |
|
|
地下室#
发布于:2003-06-16 13:03
你好,对不起我搞错了,在 SDK 里面 LARGE_INTEGER 是直接可以用常数代替的,刚才发现原来 KeSetTimer 里面不行。
|
|
5楼#
发布于:2003-06-16 13:45
先谢谢了,我只是想要 while 循环测试一个值,等它达到某个标志时再往下执行,所以想在 while 里加一个 delay。请问一下 DDK 里没有简单的 Sleep 函数吗? 你说KeDelayExecutionThread会死掉,估计你while时在pass_level以上了 用while占CPU,搞不好你等的那个值就轮不上CPU来变化。 |
|
6楼#
发布于:2003-06-16 16:26
谢谢 arthurtu 指教,前辈星星好多啊。:D
只是有点不明白,难道在同一个子程序里,IRQL 的值还会改变吗? 我都有点糊涂了,我的调用是在 DriverUnload 那个函数里,我记得在 OSR 上好像有看到过,在这个函数里 IRQL 是 PASSIVE_LEVEL 的啊,但是调用 KeDelayExecutionThread 时老是会出现蓝屏错误,好像是 IRQL_NOT_LESS_OR_EQAUL 之类的吧。现在调用 KeWaitForSingleObject 也出现这个错误了(以前好像没有的),晕死了。 这一个星期动不动就蓝屏,烦啊。 |
|
7楼#
发布于:2003-06-16 18:43
好像是?到底是不是呢?
driverunload是在passive_level |
|
8楼#
发布于:2003-06-16 19:04
是啊,微软 DDK 里面的文档也是说 unload 函数是运行在 PASSIVE_LEVEL 啊:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/intrupts_0kh3.asp
但是我执行 KeDelayExecutionThread 的时候老是会出现蓝屏,难道在程序运行过程中我的 IRQL 竟然会变?有没有办法锁定这个 IRQL 啊? 我再试一下我的程序,唉,又要忍受蓝屏的痛苦了。 :mad: :mad: :mad: |
|
9楼#
发布于:2003-06-16 19:51
蓝屏的错误到底是不是IRQL_NOT_LESS_OR_EQAUL 。。。
|
|
10楼#
发布于:2003-06-17 09:35
千真万确是 IRQL_NOT_LESS_OR_EQUAL。
我把所有杂七杂八的东西都去掉了,只留下 DriverEntry, DriverDispath, DriverUnload 这三个函数,还是有这个错误。 在调用 KeDelayExecutionThread 之前检查 IRQL 为 0,即 PASSIVE_LEVEL,但是在兰屏的报错中却发现 IRQL 为 2,即 DISPACH_LEVEL,真是很奇怪,我中间没有安插任何证句啊。 环境为 Win2k sp3, ddk2000,checked build。 |
|
11楼#
发布于:2003-06-17 10:03
原因找到了,是 KeDelayExecutionThread 调用方法的错误,第三个参数竟然是一个指针。 :( & :D,我一直是传值进去的。
但是这报错也太离谱了吧?竟然报 IRQL_NOT_LESS_OR_EQUAL 之类的错误,完全风马牛不相及的东东,害得我这菜鸟好找。 :mad: |
|
12楼#
发布于:2003-06-17 10:09
怎么没办法给分?
|
|
13楼#
发布于:2003-06-17 11:07
晕。。。
|
|
14楼#
发布于:2003-06-18 09:24
你发的最初那个帖子下面有给分按钮,:)
|
|
|
15楼#
发布于:2003-06-18 09:33
小兔崽子不肯给分还装傻,扁他,伙计们。
|
|
|
16楼#
发布于:2003-06-18 09:49
to siteddy
请你说话客气点。 to xyyln 谢谢,我找找。 |
|
17楼#
发布于:2003-06-18 09:51
已结帖,谢谢各位的回答 :) :D
|
|
18楼#
发布于:2003-06-19 09:16
伙计,开个玩笑而已,表那么认真啊
|
|
|