caosuricheng
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2004-09-04
  • 粉丝0
  • 关注0
  • 积分-10分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1615回复:7

CreateFile的问题

楼主#
更多 发布于:2002-07-15 18:05
请问各位,如果需要对一个驱动进行多次CreateFile该如何操作???我的程序第一次正确,以后都报ERROR_ACCESS_DENY
我是草肃日成 有人认识我吗?
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-15 18:11
我不知道对于驱动有无“共享”的概念,但对于文件,则如果不明确共享的话,那么就是由程序独占的,别的CreateFile就无法打开它了 :( :( :(
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
caosuricheng
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2004-09-04
  • 粉丝0
  • 关注0
  • 积分-10分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-15 18:21
我不知道对于驱动有无“共享”的概念,但对于文件,则如果不明确共享的话,那么就是由程序独占的,别的CreateFile就无法打开它了 :( :( :(

我是针对驱动的操作,经过debug发现第一次之后的CreateFile操作都没有对驱动进行操作,也就是说没有执行驱动程序的代码。谢谢你的帮助 :)
我是草肃日成 有人认识我吗?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-15 18:31
驱动的IoCreateDevice()的BOOLEAN  Exclusive参数为TRUE,这样的话你的CreateFile()只能调用一次。用IDA PRO反汇编一下就知道了,还要看一看IRP_MJ_CREATE的处理。
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-15 18:32
可能的原因:
1、IoCreateDevice的倒数第二个参数指定驱动程序是否独占模式。
2、你第一次打开后处理方法有问题。包括IRP_MJ_CREATE和IRP_MJ_CLOSE。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
caosuricheng
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2004-09-04
  • 粉丝0
  • 关注0
  • 积分-10分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-15 18:36
驱动的IoCreateDevice()的BOOLEAN  Exclusive参数为TRUE,这样的话你的CreateFile()只能调用一次。用IDA PRO反汇编一下就知道了,还要看一看IRP_MJ_CREATE的处理。


我的IRP_MJ_CREATE很简单:
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0; // no bytes refered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
应该如何改进呀?
如果把Exclusive设置为false能解决问题吗?
我是草肃日成 有人认识我吗?
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-16 00:17
[quote]驱动的IoCreateDevice()的BOOLEAN  Exclusive参数为TRUE,这样的话你的CreateFile()只能调用一次。用IDA PRO反汇编一下就知道了,还要看一看IRP_MJ_CREATE的处理。


我的IRP_MJ_CREATE很简单:
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0; // no bytes refered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
应该如何改进呀?
如果把Exclusive设置为false能解决问题吗? [/quote]

你的IRP_MJ_CREATE是很简单,允许同时调用多次CreateFile,完善的驱动对处理IRP_MJ_CREATE/IRP_MJ_CLOSE很重要,这看你的驱动的要求,一般都要设置open/close记数(用InterlockedIncrement, InterlockedDecrement),当记数为0或非0时,驱动在适当的时候做相应的处理(一句话难以讲明)。

把Exclusive设置为false能解决问题!
caosuricheng
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2004-09-04
  • 粉丝0
  • 关注0
  • 积分-10分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-16 09:05
谢谢你们的帮助! :)
放分了


[编辑 -  7/16/02 by  caosuricheng]
我是草肃日成 有人认识我吗?
游客

返回顶部