6788|19

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请问怎么在DDK中实现类似sleep的功能(急,在线等) [复制链接]

如题,实现毫秒级的sleep功能
用了KeWaitForSingleObject,结果蓝屏。
搜索了DDK的帮助,没有找到解决方案

希望高手帮忙,急,在线等。

最新回复

如果设了sleep,用windbg调试的时候,多线程的时间好像并不中断 这种情况怎么处理. VOID CreateThreadTest() {         HANDLE                        hThread;         NTSTATUS                status;         UNICODE_STRING        ustrTest;                 // 初始化         KeInitializeEvent(&kEvent, SynchronizationEvent, TRUE);         RtlInitUnicodeString(&ustrTest, L"This is a string for test!");         // 创建系统线程         status = PsCreateSystemThread(&hThread, 0, NULL, NULL, NULL, MyThreadFunc, (PVOID)(&ustrTest));         if (!NT_SUCCESS(status))         {                 KdPrint(("[Test] CreateThread Test Failed!"));         }                 ZwClose(hThread);         // 等待事件         KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, 0); } VOID MyThreadFunc(                          IN PVOID context                          ) {         PUNICODE_STRING str = (PUNICODE_STRING)context;         KdPrint(("[Test] %d : %wZ", (int)PsGetCurrentProcessId(), str));                 // 设置事件对象         KeSetEvent(&kEvent, 0, FALSE);         // 结束线程         PsTerminateSystemThread(STATUS_SUCCESS); } 复制代码 在DriverEntry里调用CreateThreadTest. 普通情况下运行可以得到想要的结果,但如果用windbg调试的话就不会输出str 这种情况怎么办?  详情 回复 发表于 2009-7-21 09:53
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
就是用KeWaitForSingleObject,不过有所限制:
Callers of KeWaitForSingleObject must be running at IRQL <= DISPATCH_LEVEL. However, if Timeout <> 0, the caller must be running at IRQL  <= APC_LEVEL and in a nonarbitrary thread context.
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
当运行在DISPATCH_LEVEL及以上IRQL时,程序不应该等待,如有必要,可以将IRP设置为pending,然后返回,等待适当的时机再做处理。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
设置为pending后,可以给简单描述一下吗?
谢谢
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
当驱动程序不能立即处理IRP时,可将IRP先保存起来(一般是自己维护一个队列),再用IoMarkIrpPending函数将IRP标记为正在处理,然后返回。驱动程序可以创建系统线程(一般在初始化的时候创建),该线程从队列中取出IRP来处理,处理后完成请求或者派送给下层驱动,再取下一个。(在自己的系统线程中可以等待)
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
测试了 NdisMSleep(20) 和 NdisStallExecution(20)
但是用PING 测试后,发现延时不定,有时候几毫秒,有时候几乎没有延时

不知道什么原因
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
高手帮忙赐教,先谢谢了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
自己顶
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
KeDelayExecutionThread

原型:
NTSTATUS
  KeDelayExecutionThread(
    IN KPROCESSOR_MODE  WaitMode,
    IN BOOLEAN  Alertable,
    IN PLARGE_INTEGER  Interval
    );
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用楼主 jourbin 的帖子:
如题,实现毫秒级的sleep功能
用了KeWaitForSingleObject,结果蓝屏。
搜索了DDK的帮助,没有找到解决方案

希望高手帮忙,急,在线等。


在什么地方调用的,在WDM里面,每个ddk函数都是有运行级别的

蓝屏出错的原因一般有两种,一是函数调用时参数无效,二是该函数运行级别不正确
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
KeStallExecutionProcessor can be running at any IRQL

The KeStallExecutionProcessor routine stalls the caller on the current processor for a specified time interval.
VOID
  KeStallExecutionProcessor(
    IN ULONG  MicroSeconds
    );


KeStallExecutionProcessor is a processor-dependent routine that busy-waits for at least the specified number of microseconds, but not significantly longer.

 
 
 

回复

116

帖子

0

TA的资源

一粒金砂(中级)

12
 
可以与IoMarkIrpPending函数有关
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 
俺去查一下IoMarkIrpPending看看
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

14
 
NTSTATUS
          KeDelayExecutionThread(
            IN KPROCESSOR_MODE  WaitMode,
            IN BOOLEAN  Alertable,
            IN PLARGE_INTEGER  Interval);

        这个函数的参数简单明了。WaitMode请总是填写KernelMode,因为现在是在内核编程中使用。Alertable表示是否允许线程报警(用于重新唤醒)。但是目前没有必要用到这么高级的功能,请总是填写FALSE。剩下的就是Interval了,表明要睡眠多久
但是这个看似简单的参数说明起来却异常的复杂。为此作者建议读者使用下面简单的睡眠函数,这个函数可以指定睡眠多少毫秒,而没有必要自己去换算时间(这个函数中有睡眠时间的转换):
       
        #define DELAY_ONE_MICROSECOND         (-10)
        #define DELAY_ONE_MILLISECOND        (DELAY_ONE_MICROSECOND*1000)
        VOID MySleep(LONG msec)
        {
                LARGE_INTEGER my_interval;
                my_interval.QuadPart = DELAY_ONE_MILLISECOND;
                my_interval.QuadPart *= msec;
                KeDelayExecutionThread(KernelMode,0,&my_interval);
        }
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

15
 
KeDelayExecutionThread最直接了~
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

16
 
#define  DELAY_ONE_MICROSECOND  (-10)
#define  DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
#define  DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)

LARGE_INTEGER interval;
//睡眠3秒
interval.QuadPart = (3*1000 * DELAY_ONE_MILLISECOND);       
KeDelayExecutionThread(KernelMode,FALSE,&interval);
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
如果不会用KeWaitForSingleObject。
就直接用个for循环,不就是延时!
不过for循环控制不了时间!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

18
 

  1. BOOLEAN
  2. Sleep(
  3.         ULONG MillionSecond
  4. )
  5. {
  6.         NTSTATUS Status;
  7.         LARGE_INTEGER DelayTime;

  8.         DelayTime.QuadPart = -10000 * MillionSecond;

  9.         Status = KeDelayExecutionThread(
  10.                                 KernelMode,
  11.                                 FALSE,
  12.                                 &DelayTime);

  13.         return (NT_SUCCESS(Status));
  14. }
复制代码
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 17 楼 bainanrain 的回复:
C/C++ codeBOOLEAN
Sleep(
    ULONG MillionSecond
)
{
    NTSTATUS Status;
    LARGE_INTEGER DelayTime;

    DelayTime.QuadPart=-10000*MillionSecond;

    Status=KeDelayExecutionThread(
                KernelMode,
                FALSE,&DelayTime);return(NT_SUCCESS(Status));
}


临晨三点都不睡觉....
狂人啊...
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

20
 
如果设了sleep,用windbg调试的时候,多线程的时间好像并不中断
这种情况怎么处理.

  1. VOID
  2. CreateThreadTest()
  3. {
  4.         HANDLE                        hThread;
  5.         NTSTATUS                status;
  6.         UNICODE_STRING        ustrTest;
  7.        
  8.         // 初始化
  9.         KeInitializeEvent(&kEvent, SynchronizationEvent, TRUE);
  10.         RtlInitUnicodeString(&ustrTest, L"This is a string for test!");

  11.         // 创建系统线程
  12.         status = PsCreateSystemThread(&hThread, 0, NULL, NULL, NULL, MyThreadFunc, (PVOID)(&ustrTest));
  13.         if (!NT_SUCCESS(status))
  14.         {
  15.                 KdPrint(("[Test] CreateThread Test Failed!"));
  16.         }
  17.        
  18.         ZwClose(hThread);
  19.         // 等待事件
  20.         KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, 0);
  21. }


  22. VOID
  23. MyThreadFunc(
  24.                          IN PVOID context
  25.                          )
  26. {
  27.         PUNICODE_STRING str = (PUNICODE_STRING)context;
  28.         KdPrint(("[Test] %d : %wZ", (int)PsGetCurrentProcessId(), str));
  29.        
  30.         // 设置事件对象
  31.         KeSetEvent(&kEvent, 0, FALSE);

  32.         // 结束线程
  33.         PsTerminateSystemThread(STATUS_SUCCESS);
  34. }
复制代码

在DriverEntry里调用CreateThreadTest.
普通情况下运行可以得到想要的结果,但如果用windbg调试的话就不会输出str
这种情况怎么办?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表