阅读:1717回复:7
CreateFile的问题
请问各位,如果需要对一个驱动进行多次CreateFile该如何操作???我的程序第一次正确,以后都报ERROR_ACCESS_DENY
|
|
|
沙发#
发布于:2002-07-15 18:11
我不知道对于驱动有无“共享”的概念,但对于文件,则如果不明确共享的话,那么就是由程序独占的,别的CreateFile就无法打开它了 :( :( :(
|
|
|
板凳#
发布于:2002-07-15 18:21
我不知道对于驱动有无“共享”的概念,但对于文件,则如果不明确共享的话,那么就是由程序独占的,别的CreateFile就无法打开它了 :( :( :( 我是针对驱动的操作,经过debug发现第一次之后的CreateFile操作都没有对驱动进行操作,也就是说没有执行驱动程序的代码。谢谢你的帮助 :) |
|
|
地板#
发布于:2002-07-15 18:31
驱动的IoCreateDevice()的BOOLEAN Exclusive参数为TRUE,这样的话你的CreateFile()只能调用一次。用IDA PRO反汇编一下就知道了,还要看一看IRP_MJ_CREATE的处理。
|
|
地下室#
发布于:2002-07-15 18:32
可能的原因:
1、IoCreateDevice的倒数第二个参数指定驱动程序是否独占模式。 2、你第一次打开后处理方法有问题。包括IRP_MJ_CREATE和IRP_MJ_CLOSE。 |
|
|
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能解决问题吗? |
|
|
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能解决问题! |
|
7楼#
发布于:2002-07-16 09:05
谢谢你们的帮助! :)
放分了 [编辑 - 7/16/02 by caosuricheng] |
|
|