首页
社区
课程
招聘
[求助]调用KeWaitForSingleObject蓝屏?
发表于: 2009-4-20 15:20 15553

[求助]调用KeWaitForSingleObject蓝屏?

2009-4-20 15:20
15553
这段代码是在IRP_MJ_READ的事件处理函数里面的。
	HANDLE hThread = NULL;
	if (NT_SUCCESS(PsCreateSystemThread(&hThread, 0, NULL, NULL, NULL, TestFunc, NULL)))
	{
		KeWaitForSingleObject(hThread, Executive, KernelMode, FALSE, NULL);
		ZwClose(hThread);
	}

TestFunc里面就是一句PsTerminateSystemThread(STATUS_SUCCESS),调试发现一调用KeWaitForSingleObject就蓝了。
原来以为是用句柄不行,就这样试了一下
	HANDLE hThread = NULL;
	OBJECT_ATTRIBUTES objAttrib;
	InitializeObjectAttributes(&objAttrib, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
	if (NT_SUCCESS(PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, &objAttrib, NULL, NULL, TestFunc, NULL)))
	{
		KeWaitForSingleObject(hThread, Executive, KernelMode, FALSE, NULL);
		ZwClose(hThread);
	}

结果照蓝不误,蓝屏提示IRQL_NOT_LESS_OR_EQUAL,但是我打印KeGetCurrentIrql()却是0。
我查过资料说是,KeWaitForSingleObject可以等待线程HANDLE的,不过正确写法应该是什么呢?
谢谢!!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (13)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
动笔之前,看看MSDN
写驱动之前,打好基础

谁告诉你KeWaitForSingleObject可以等待一个句柄的?
2009-4-20 15:32
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
MSDN提到过:
NTSTATUS
  KeWaitForSingleObject(
    IN PVOID  Object,
    IN KWAIT_REASON  WaitReason,
    IN KPROCESSOR_MODE  WaitMode,
    IN BOOLEAN  Alertable,
    IN PLARGE_INTEGER  Timeout  OPTIONAL
    );
Object
Pointer to an initialized dispatcher object (event, mutex, semaphore, thead, or timer) for which the caller supplies the storage.

还有个啥《Windows驱动编程基础教程》里面提到“实际上等待线程结束并不一定要用事件。线程本身也可以当作一个事件来等待。”

我本身就是初学驱动,原来只会玩玩ring3,ring3创建完线程就是这么等的,所以下意识认为也是这么写。不过根据MSDN的说法,应该是可行的,只是我不知道也找不到正确写法。
2009-4-20 15:41
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
如果等待的对象不是句柄,也请给一个类型说明啊,都是void*,我不知道传什么给它。
2009-4-20 15:44
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
难道没有人用线程本身作参数等待线程结束的么?难道都是自己再创建一个事件对象来同步的么?
2009-4-20 16:21
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
用Zwxx吧或者Object传Thread(PETHREAD)
2009-4-20 17:38
0
雪    币: 44
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Pointer to an initialized dispatcher object
2009-4-20 17:50
0
雪    币: 330
活跃值: (112)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
2楼的说的很清楚了
KeWaitForSingleObject第一个参数不是句柄,是一个对象指针。
比如事件对象
KeWaitForSingleObject(&event,.......);
互斥
KeWaitForSingleObject(&mutex,......);
记得用之前KeInitialize.....等函数初始化对象
2009-4-20 17:53
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
那LS各位的意思是,线程相关的什么东西,都不能用来KeWaitForSingleObject么?

[QUOTE=bozer;609458]Pointer to an initialized dispatcher object[/QUOTE]

注意后面的括号里面有个thread。Pointer to an initialized dispatcher object (event, mutex, semaphore, thead, or timer),这里的thread是什么意思?

本来自己创建一个事件对象也没什么关系,只是是否存在这种可能性:子线程设置事件后,原本在DriverUnload里面处于等待的主线程,早于子线程PsTerminateSystemThread之前就退出了?虽然可能性很小,但如果出现了,会不会有什么后果?

另外如果线程相关的任何东西都不能用来Wait,那么ring3下面对线程句柄进行Wait所等待的事件对象又是哪里来的?
2009-4-20 19:24
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
非常感谢,换成ZwWaitForSingleObject就可以了,原来是要换个API啊。

KeWaitForSingleObject的对象是PETHREAD吗?有什么方法可以获得呢?
2009-4-20 19:37
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
11
ObReferenceObjectByHandle
2009-4-20 20:14
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
非常感谢,用ObReferenceObjectByHandle所得到的Object已经可以正常进行Wait了。不过参数ObjectType不知道填什么才会得到PETHREAD,因为它是OPTIONAL,我就填了个0,运行起来还算正常。
2009-4-20 20:52
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
13
win7。。。。
2009-4-22 12:18
0
雪    币: 12
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了
2022-7-8 11:27
0
游客
登录 | 注册 方可回帖
返回
//