zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
阅读:5015回复:11

在IRP_MJ_CREATE中,如何判断当前操作是什么?打开?写?新建?

楼主#
更多 发布于:2005-04-22 14:01
我原来以为是FILEOBJECT->FLAGS,结果试的拦截,没有什么效果。

是不是靠判断这个FLAGS来判断当前的操作呢?

还是有什么方法?

如果是,有没有资料介绍哪种FLAGS对应哪种操作呢?

谢谢
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-04-22 16:22
我原来以为是FILEOBJECT->FLAGS,结果试的拦截,没有什么效果。

是不是靠判断这个FLAGS来判断当前的操作呢?

还是有什么方法?

如果是,有没有资料介绍哪种FLAGS对应哪种操作呢?

谢谢

有阿,DDK啊
还有就是返回IOSTATUS里的值,是文件已创建还是文件已打开等等。
---内核开发合作或提供基础技术服务QQ:22863668 ---
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-22 17:06
我正在看DDK中相关的部分,
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-04-22 17:37
我看了DDK,以及例子中的一些用法。
发现定义的标志宏太多,还是不知道应该判断哪个?

希望老大指条明路。谢谢
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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
}
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-25 09:22
另外,FILE_OPENED FILE_CREATE是不是分别对应打开和创建。那么只在这里(完成例程中)能否判断出打开/创建操作,即不去判断CreateDisposition中的值,而只判断irp->IoStatus.Information,这样行吗?
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-25 10:25
另外,FILE_OPENED FILE_CREATE是不是分别对应打开和创建。那么只在这里(完成例程中)能否判断出打开/创建操作,即不去判断CreateDisposition中的值,而只判断irp->IoStatus.Information,这样行吗?
 


可以
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
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?
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-04-25 16:33
到你判断的时候实际上创建请求已经完成了.

判断删除应该拦截IRP_MJ_SET_INFOMATION中判断文件信息类是否等于FileDispositionInformation。
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-04-25 16:42
那么楼上的意思是?能写详细一点吗?

谢谢.
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
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三个标志,则表明一定是在创建而不是打开。

而判断返回值是比较准确的判断是否为打开或者创建,但此时文件系统已经将文件创建了,在禁止它就没有意义了。
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-04-25 17:08
删除文件就需要拦截IRP_MJ_SET_INFORMATION这个IRP,然后判断

currentIrpStack->Parameters.SetFile.FileInformationClass == FileDispositionInformation
游客

返回顶部