阅读:2375回复:8
这个问题怎么办? 关于zwcreatefile的
zw***file必须运行在passive_level下
但是我在receive下是高于passive_level的。 这个问题怎么办?有人介绍说: ZwCreateFile 只能在IRQL为PASSIVE_LEVEL调用,而且ZwReadFile,ZwWriteFileye也必须在相同的线程环境下,而PtReceive则运行在IRQL DISPATCH_LEVEL,因此会蓝屏。 解决办法是在DriverEntry 建立一系统工作者线程,在该线程里面 完成ZwXxxFile的调用 示例代码如下: 1建立一系统工作者线程status = PsCreateSystemThread( &ThreadHandle,THREAD_ALL_ACCESS ,0, 0,0, LogToFile,0); 但是我的疑问就来了,PsCreateSystemThread也是只能运行在passive_level的。 在driverentry调用完PsCreateSystemThread后。 有什么办法能在receive中执行zw***file的操作。 其实就是想将receive中的一些信息,通过zwwritefile写入一个文件。 但是receive函数中中断等级太高,怎么办??? 求救 |
|
|
沙发#
发布于:2007-04-18 19:10
我记得好像可以使用工作队列之类的。
|
|
|
驱动小牛
|
板凳#
发布于:2007-04-18 20:56
对啊,写入缓存,再写入文件.
|
地板#
发布于:2007-04-19 09:23
我大概知道有个工作队列的 以前看过 但是没研究过
我现在的想法是这样 先在driverentry里面创建一个线程和非分页内存,还有一个event。 然后每次要写什么信息,先写在那块内存里面,然后set event。 在线程里面不停循环waitfor这个event。 在里面进行写文件超作。主要问题要注意一个同步问题,就OK了。 这个想法有问题吗? 欢迎拍砖。 |
|
|
地下室#
发布于:2007-04-19 09:33
在driverentry创建线程,在线程中waitevent,或者workeritem都可以,用io completation
|
|
5楼#
发布于:2007-04-19 09:38
你好 那么我这种方法可以吗?
还有在线程中waitevent,应该不用io completation吧 能介绍一下 workitem的用法吗?这个我没搜到。 我记得以前看介绍workitem,是排队一些回调函数。好像没看到io completation。 请多指教 |
|
|
6楼#
发布于:2007-04-20 15:23
线程和workitem只是提供一个passive_level的环境让你可以用event
completion是针对你用createfile,建议你不要用createfile,它有可能会组赛,这样驱动的效率会下降,自己创建irp,用io完成历程可以避免组赛 workitem的例子很多的,ddk里有源代码 另外线成和workitem也可以不用,如果你的irp可以pending的话。。 |
|
7楼#
发布于:2007-04-23 09:06
谢谢 我已经用 线程 和 工作队列 的方法 解决了
但是没有用你的completion,这个不太会。 |
|
|
8楼#
发布于:2007-04-27 14:21
昨天在调用ZwCreateFile时候机器总是重启,原来是没有在PASSIVE_LEVEL下调用的原因
|
|