aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
阅读:2375回复:8

这个问题怎么办? 关于zwcreatefile的

楼主#
更多 发布于:2007-04-18 18:37
  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函数中中断等级太高,怎么办???

求救
周维彬
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-04-18 19:10
我记得好像可以使用工作队列之类的。
走走看看开源好 Solaris vs Linux
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-18 20:56
对啊,写入缓存,再写入文件.
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-04-19 09:23
我大概知道有个工作队列的 以前看过 但是没研究过
我现在的想法是这样 先在driverentry里面创建一个线程和非分页内存,还有一个event。
然后每次要写什么信息,先写在那块内存里面,然后set event。
在线程里面不停循环waitfor这个event。
在里面进行写文件超作。主要问题要注意一个同步问题,就OK了。

这个想法有问题吗? 欢迎拍砖。
周维彬
dfbb1980
驱动牛犊
驱动牛犊
  • 注册日期2006-07-05
  • 最后登录2007-07-30
  • 粉丝0
  • 关注0
  • 积分820分
  • 威望83点
  • 贡献值0点
  • 好评度82点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-19 09:33
在driverentry创建线程,在线程中waitevent,或者workeritem都可以,用io completation
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
5楼#
发布于:2007-04-19 09:38
你好 那么我这种方法可以吗?

还有在线程中waitevent,应该不用io completation吧

能介绍一下 workitem的用法吗?这个我没搜到。
我记得以前看介绍workitem,是排队一些回调函数。好像没看到io completation。

请多指教
周维彬
dfbb1980
驱动牛犊
驱动牛犊
  • 注册日期2006-07-05
  • 最后登录2007-07-30
  • 粉丝0
  • 关注0
  • 积分820分
  • 威望83点
  • 贡献值0点
  • 好评度82点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-04-20 15:23
线程和workitem只是提供一个passive_level的环境让你可以用event
completion是针对你用createfile,建议你不要用createfile,它有可能会组赛,这样驱动的效率会下降,自己创建irp,用io完成历程可以避免组赛
workitem的例子很多的,ddk里有源代码
另外线成和workitem也可以不用,如果你的irp可以pending的话。。
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
7楼#
发布于:2007-04-23 09:06
谢谢 我已经用 线程 和 工作队列 的方法 解决了
但是没有用你的completion,这个不太会。
周维彬
lanyu826
驱动小牛
驱动小牛
  • 注册日期2006-03-22
  • 最后登录2009-02-27
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望114点
  • 贡献值0点
  • 好评度113点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-04-27 14:21
昨天在调用ZwCreateFile时候机器总是重启,原来是没有在PASSIVE_LEVEL下调用的原因
游客

返回顶部