cococut
驱动牛犊
驱动牛犊
  • 注册日期2005-06-27
  • 最后登录2005-09-23
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1963回复:9

filemon中,怎么判断IRP_JM_CREATE是打开文件还是创建文件?

楼主#
更多 发布于:2005-07-01 15:19
  FilemonHookRoutine例程中,
case IRP_JM_CREAET:
中怎么判断该IRP_JM_CREATE是打开一个文件,还是创建一个文件,我想屏蔽掉打开文件
的日志,只想在创建文件或者目录的时候做日志。
我用IoSetCompletionRoutine设置一个完成例程来判断,可是老是重新启动。
谁帮我解决?顺便问一下,怎么才能给分?

最新喜欢:

hsly110hsly11...
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-07-01 15:51
Options           = IrpSp->Parameters.Create.Options;
CreateDisposition = (Options >> 24) & 0x000000ff;
然后去看ddk的帮助ZwCreateFile,参数CreateDisposition的取值,FILE_CREATE ,FILE_OPEN等等
cococut
驱动牛犊
驱动牛犊
  • 注册日期2005-06-27
  • 最后登录2005-09-23
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-01 15:56
to zhaock :
关键是在那里判断,是不是要加完成例程?
在case IRP_MJ_CREATE:中加上
Options       = IrpSp->Parameters.Create.Options;
CreateDisposition = (Options >> 24) & 0x000000ff;
吗?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-07-01 16:00
在case IRP_MJ_CREATE处理就可以
cococut
驱动牛犊
驱动牛犊
  • 注册日期2005-06-27
  • 最后登录2005-09-23
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-01 16:05
TO zhaock :
Options     = IrpSp->Parameters.Create.Options;
CreateDisposition = (Options >> 24) & 0x000000ff;
难道仅仅判断
if( CreateDisposition  == FILE_CREATE )//表示是文件创建,
if( CreateDisposition  == FILE_OPEN )//表示是文件打开吗?
这样判断就行啦?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-07-01 16:15
对于FILE_OPEN_IF,FILE_OVERWRITE_IF就要在完成里判断了
cococut
驱动牛犊
驱动牛犊
  • 注册日期2005-06-27
  • 最后登录2005-09-23
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-07-01 16:42
to zhaock:
刚刚试过啦,单独的在case IRP_MJ_CREATE做判断是达不到目的的,
能够给我提供一个例程的例子吗?
我的例程:
RtlCopyMemory(NextIrpStack, CurrentIrpStack,
sizeof(IO_STACK_LOCATION));
KeInitializeEvent(&Event, NotificationEvent, FALSE);
IoSetCompletionRoutine(Irp,&OurCloseCompletion,&Event,TRUE,TRUE,T
RUE);
IoMarkIrpPending(Irp);

status = IoCallDriver(Extension->FilteredDeviceObject, Irp);

if (status != STATUS_PENDING) {
if (KeReadStateEvent(&Event) == 0) {
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
} else {

KeWaitForSingleObject(&Event, Executive, KernelMode,
FALSE, 0);
}

if(Irp->IoStatus.Information==FILE_CREATED)
{
    Log("file create success!");
}
return STATUS_PENDING;

OurCloseCompletion(PDEVICE_OBJECT Device Object, PIRP Irp, PVOID
Context)
{
    Event = (PKEVENT)Context;
    KeSetEvent(Event, 0, FALSE);
    return STATUS_MORE_PROCESSING_REQUIRED;
}

不过系统会重启,有时候还会阻塞!
帮我看看以上的代码!
cococut
驱动牛犊
驱动牛犊
  • 注册日期2005-06-27
  • 最后登录2005-09-23
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-01 16:45
另外想问一下,删除某个文件是否触发IRP_MJ_CLEARUP例程,
为什么每次删掉一个文件,都会触发这么多次IRP_MJ_CLEARUP?
谢谢!
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-07-01 18:18
你看看sfilter代码就可以,你的代码明显有问题,如果IoCallDriver返回Pending,
这个irp就没有机会完成了,一直pending,
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2007-04-25 16:40
zhaock斑竹,如果我在写派遣例程中将所有IRP过滤掉,就不能创建文件了啊,这个冲突怎么解决
作一名真实,诚实,优秀的科技工作者!
游客

返回顶部