liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1840回复:18

在 Driver 中用哪种方式休眠比较好?

楼主#
更多 发布于:2003-06-13 23:34
在 DriverUnload 时必需等待某个标志清零才能继续往下运行,开始用 KeStallExecutionProcessor,但发现其休眠时,会占用很多 CPU 资源,于是想改用 KeDelayExecutionThread,但在每次调用此方法时,系统总是报 IRQL_NOT_LESS_OR_EQUAL 蓝屏错误。感到很奇怪。

为什么调用 KeDelayExecutionThread 会出现这样的错误呢?我该调用什么方法来休眠呢?
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-16 09:45
用KeWaitForSingleObject 实现休眠,在等待一个内核对象时CPU占有比较低。
你的认可是对我最大的鼓励!
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-16 10:58
先谢谢了,我只是想要 while 循环测试一个值,等它达到某个标志时再往下执行,所以想在 while 里加一个 delay。请问一下 DDK 里没有简单的 Sleep 函数吗?

还有为什么像 KeSetTimer(&timer, -100000000, 0); 这样的调用为什么通不过啊?第三个参数一定要是 Dpc 对象吗?
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-16 11:40
LARGE_INTEGER
KeSetTimer(...)中第三个参数一定要是可选的,可以不要。你的第二个参数写法不对,它是  LARGE_INTEGER 类型,参考下面填写
           LARGE_INTEGER .HighPart = ...;
           LARGE_INTEGER .LowPart = ...;
你的认可是对我最大的鼓励!
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-16 13:03
你好,对不起我搞错了,在 SDK 里面 LARGE_INTEGER 是直接可以用常数代替的,刚才发现原来 KeSetTimer 里面不行。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-06-16 13:45
先谢谢了,我只是想要 while 循环测试一个值,等它达到某个标志时再往下执行,所以想在 while 里加一个 delay。请问一下 DDK 里没有简单的 Sleep 函数吗?

还有为什么像 KeSetTimer(&timer, -100000000, 0); 这样的调用为什么通不过啊?第三个参数一定要是 Dpc 对象吗?


你说KeDelayExecutionThread会死掉,估计你while时在pass_level以上了
用while占CPU,搞不好你等的那个值就轮不上CPU来变化。
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-16 16:26
谢谢 arthurtu 指教,前辈星星好多啊。:D
只是有点不明白,难道在同一个子程序里,IRQL 的值还会改变吗?
我都有点糊涂了,我的调用是在 DriverUnload 那个函数里,我记得在 OSR 上好像有看到过,在这个函数里 IRQL 是 PASSIVE_LEVEL 的啊,但是调用 KeDelayExecutionThread 时老是会出现蓝屏错误,好像是 IRQL_NOT_LESS_OR_EQAUL 之类的吧。现在调用 KeWaitForSingleObject 也出现这个错误了(以前好像没有的),晕死了。
这一个星期动不动就蓝屏,烦啊。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-06-16 18:43
好像是?到底是不是呢?
driverunload是在passive_level
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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:
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-06-16 19:51
蓝屏的错误到底是不是IRQL_NOT_LESS_OR_EQAUL 。。。
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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。
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-17 10:03
原因找到了,是 KeDelayExecutionThread 调用方法的错误,第三个参数竟然是一个指针。 :(  & :D,我一直是传值进去的。
但是这报错也太离谱了吧?竟然报 IRQL_NOT_LESS_OR_EQUAL 之类的错误,完全风马牛不相及的东东,害得我这菜鸟好找。 :mad:
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-17 10:09
怎么没办法给分?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2003-06-17 11:07
晕。。。
xyyln
驱动老牛
驱动老牛
  • 注册日期2003-01-02
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-18 09:24
你发的最初那个帖子下面有给分按钮,:)
[img]http://www.jt99.com/zjbbs/UploadFile/2003113018513643830.gif[/img]
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-18 09:33
小兔崽子不肯给分还装傻,扁他,伙计们。
teddy
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-18 09:49
to siteddy
请你说话客气点。

to xyyln
谢谢,我找找。
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-18 09:51
已结帖,谢谢各位的回答 :) :D
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-06-19 09:16
伙计,开个玩笑而已,表那么认真啊
teddy
游客

返回顶部