阅读:5016回复:11
在IRP_MJ_CREATE中,如何判断当前操作是什么?打开?写?新建?
我原来以为是FILEOBJECT->FLAGS,结果试的拦截,没有什么效果。
是不是靠判断这个FLAGS来判断当前的操作呢? 还是有什么方法? 如果是,有没有资料介绍哪种FLAGS对应哪种操作呢? 谢谢 |
|
驱动老牛
![]() |
沙发#
发布于:2005-04-22 16:22
我原来以为是FILEOBJECT->FLAGS,结果试的拦截,没有什么效果。 有阿,DDK啊 还有就是返回IOSTATUS里的值,是文件已创建还是文件已打开等等。 |
|
板凳#
发布于:2005-04-22 17:06
我正在看DDK中相关的部分,
|
|
地板#
发布于:2005-04-22 17:37
我看了DDK,以及例子中的一些用法。
发现定义的标志宏太多,还是不知道应该判断哪个? 希望老大指条明路。谢谢 |
|
地下室#
发布于:2005-04-22 17:50
Create当中不能判断是否是读写操作,只能判断是否打开或者创建。
具体的操作存放在currentIrpStack->Parameters.Create.Options中,并且 CreateDisposition = (currentIrpStack->Parameters.Create.Options>> 24) & 0x000000ff; 比较CreateDisposition 是否是如下几个值: FILE_CREATE FILE_OPEN_IF FILE_OPEN FILE_OVERWRITE FILE_OVERWRITE_IF 跟创建有关的是FILE_CREATE、FILE_OPEN_IF和FILE_OVERWRITE_IF. 在Create处理例程当中设置完成例程,并在完成创建以后判断: if(NT_SUCCESS(Irp->IoStatus.Status)){ 比较irp->IoStatus.Information是否是FILE_OPENED或者FILE_CREATED } |
|
5楼#
发布于:2005-04-25 09:22
另外,FILE_OPENED FILE_CREATE是不是分别对应打开和创建。那么只在这里(完成例程中)能否判断出打开/创建操作,即不去判断CreateDisposition中的值,而只判断irp->IoStatus.Information,这样行吗?
|
|
6楼#
发布于:2005-04-25 10:25
另外,FILE_OPENED FILE_CREATE是不是分别对应打开和创建。那么只在这里(完成例程中)能否判断出打开/创建操作,即不去判断CreateDisposition中的值,而只判断irp->IoStatus.Information,这样行吗? 可以 |
|
7楼#
发布于:2005-04-25 11:08
我在CREATE里面判断,当发现是我需要LOCK的路径后,我设置完成例程.在完成例程中,代码如下:
NTSTATUS SfCreateLockCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { NTSTATUS status; if(NT_SUCCESS(Irp->IoStatus.Status)) { DbgPrint(\"In Completion SUCCESS\"); if(Irp->IoStatus.Information==FILE_OPENED) DbgPrint(\"FILE_OPENED\"); if(Irp->IoStatus.Information==FILE_CREATED) { DbgPrint(\"FILE_CREATED\"); Irp->IoStatus.Status = STATUS_ACCESS_DENIED; Irp->IoStatus.Information = 0; status = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } } return STATUS_SUCCESS; } 这样,目录下仍然可以创建文件. 另外,禁止删除拦截哪个IRP? |
|
8楼#
发布于:2005-04-25 16:33
到你判断的时候实际上创建请求已经完成了.
判断删除应该拦截IRP_MJ_SET_INFOMATION中判断文件信息类是否等于FileDispositionInformation。 |
|
9楼#
发布于:2005-04-25 16:42
那么楼上的意思是?能写详细一点吗?
谢谢. |
|
10楼#
发布于:2005-04-25 17:06
我是这样认为的:
当我们调用CreateFile并且希望创建一个文件的时候,系统会首先发送一个标志为FILE_OPEN的请求,并且判断底层文件系统的返回值,如果返回成功,则表明文件存在并且已经成功打开,否则如果返回结果是NO SUCH FILE,则紧接着创建一个FILE_OPEN_IF请求,得以将文件创建,所以如果我们在Create的Options当中发现了FILE_CREATE,FILE_OPEN_IF和FILE_OVERWRITE_IF三个标志,则表明一定是在创建而不是打开。 而判断返回值是比较准确的判断是否为打开或者创建,但此时文件系统已经将文件创建了,在禁止它就没有意义了。 |
|
11楼#
发布于:2005-04-25 17:08
删除文件就需要拦截IRP_MJ_SET_INFORMATION这个IRP,然后判断
currentIrpStack->Parameters.SetFile.FileInformationClass == FileDispositionInformation |
|