jasononline
驱动牛犊
驱动牛犊
  • 注册日期2004-05-25
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1577回复:11

FileMon完成例程的Write问题

楼主#
更多 发布于:2008-08-07 10:29
最近研究FileMon,在完成例程里面对IRP_MJ_Write进行跟踪,代码如下:

NTSTATUS
FilemonHookDone(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
{
    PIO_STACK_LOCATION   IrpSp;
#if defined(_IA64_)
    ULONG                seqNum = (ULONG) ((ULONG_PTR)Context);
#else
    ULONG                seqNum = (ULONG) Context;
#endif
    CHAR                 errval[ERRORLEN], errString[ERRORLEN];
    KIRQL                oldirql;
    LARGE_INTEGER        timeStampStart, timeStampComplete, timeResult;
    PFILEMON_WORK        filemonWorkContext;

    //
    // A request completed - look at the result
    //
    IrpSp = IoGetCurrentIrpStackLocation( Irp );    

//这里是自己加的
switch( IrpSp->MajorFunction ) {

            
            case IRP_MJ_WRITE:
                
                        
                LogRecord( FALSE, NULL, NULL, NULL,
                "%s\tCheckWRITE\t%s\tValues: %s",
                "Name", "PATH","TEST");
                
                break;
            
        }
//以上部分是自己加的
    //
    // Log the return status in the output buffer. Tag it with the
    // sequence number so that the GUI can match it with the IRP input information.
    //
    if( FilterOn ) {

        //
        // Quick, get the completion time
        //
        timeStampStart = IrpSp->Parameters.Read.ByteOffset;
        timeStampComplete   = KeQueryPerformanceCounter(NULL);
        timeResult.QuadPart = timeStampComplete.QuadPart - timeStampStart.QuadPart;

        //
        // Queue off to a worker thread if we have to
        //
        if( KeGetCurrentIrql() == DISPATCH_LEVEL ) {

            filemonWorkContext = ExAllocatePool( NonPagedPool, sizeof(FILEMON_WORK));
            if( filemonWorkContext ) {

                filemonWorkContext->Sequence   = seqNum;
                filemonWorkContext->TimeResult = timeResult;
                sprintf( filemonWorkContext->ErrString, "\t\t\t\t%s",
                         ErrorString( Irp->IoStatus.Status, errval ));
                ExInitializeWorkItem( &filemonWorkContext->WorkItem,
                                      FilemonHookDoneWork, filemonWorkContext );
                ExQueueWorkItem( &filemonWorkContext->WorkItem, CriticalWorkQueue );
            }
        } else {

            sprintf( errString, "\t\t\t\t%s", ErrorString( Irp->IoStatus.Status, errval ));
            LogRecord( FALSE, &seqNum, NULL, &timeResult, errString );
        }
    }

#if DBG
    //
    // We have finished processing an IRP so decrement oustanding IRP count
    //
    KeAcquireSpinLock( &CountMutex, &oldirql );
    OutstandingIRPCount--;
    DbgPrint(("-%d: %x\n", OutstandingIRPCount, Irp ));;
    if( !OutstandingIRPCount ) FilemonDriver->DriverUnload = FilemonUnload;
    KeReleaseSpinLock( &CountMutex, oldirql );
#endif

    //
    // Now we have to mark Irp as pending if necessary
    //
    if( Irp->PendingReturned ) {

        IoMarkIrpPending( Irp );
    }
    return Irp->IoStatus.Status;
}

这里面只有switch部分是我加的,只是想看看IRP_MJ_Write在完成例程里面做了什么,可是发现一个问题,就是在Write大文件的时候就会蓝屏(比如拷贝一个大文件到监控的磁盘就会蓝屏),请各位大侠看看是怎么回事!有什么解决办法没有?
我个人猜测可能是LogRecord函数的问题,当拷贝大文件的时候会有大量的System进程的消息,超出了LogRecord的最大的BufferSize,而在超出部分LogRecord处理的时候没有处理好就蓝屏了不知道对不,请各位大侠帮忙看看,小弟在这里拜谢了!
jasononline
驱动牛犊
驱动牛犊
  • 注册日期2004-05-25
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-08-07 18:55
自己顶
greatman
驱动牛犊
驱动牛犊
  • 注册日期2003-03-12
  • 最后登录2008-08-14
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-08-12 16:14
LogRecord() 3、4参数不可置空值
jasononline
驱动牛犊
驱动牛犊
  • 注册日期2004-05-25
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-08-13 15:38
应该跟这个没有关系,我试过不设空值,结果还是一样啊
fhqpdcn
驱动牛犊
驱动牛犊
  • 注册日期2007-06-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望86点
  • 贡献值1点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-08-20 21:07
Filemon 缺陷不少。。。最近我在VISTA 上发现总是死机。。。IRP  阻塞了
我是菜鸟
jasononline
驱动牛犊
驱动牛犊
  • 注册日期2004-05-25
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-08-25 17:35
奇怪的是只有操作大文件的时候才这样
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-08-25 18:30
小文件可能一个PagingIo就结束了,大文件会连续发出多个PagingIo

FileMon已经过时了,研究些新的东西吧
提问归提问,还是只能靠自己
jasononline
驱动牛犊
驱动牛犊
  • 注册日期2004-05-25
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-08-28 09:59
新的东西有什么?楼上老兄有什么好的推荐没有?
lyzhm
驱动牛犊
驱动牛犊
  • 注册日期2007-03-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望151点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2009-05-04 21:50
lz联系我一下,我也遇到这个问题了
qq:83424493
Chinaluo_007
驱动牛犊
驱动牛犊
  • 注册日期2009-04-22
  • 最后登录2010-04-13
  • 粉丝1
  • 关注1
  • 积分40分
  • 威望361点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2009-05-20 00:20
这个和新的东西没有关系,而是针对新的操作系统,需要对部分内容进行优化。
使用新的构架对于老系统同样存在问题。
FileMon的结构还是比较简单的。
misssir
驱动牛犊
驱动牛犊
  • 注册日期2007-10-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分143分
  • 威望183点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2009-05-28 18:49
还是太富足,简化一下就好了
还是原始社会好 / QQ: 13633292
uljtg
驱动牛犊
驱动牛犊
  • 注册日期2006-03-23
  • 最后登录2011-12-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望210点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2009-06-05 12:49
          case IRP_MJ_WRITE:
                
                        
                LogRecord( FALSE, NULL, NULL, NULL,
                "%s\tCheckWRITE\t%s\tValues: %s",
                "Name", "PATH","TEST");

你能保证IRQL < DISPATCH_LEVEL 吗?
游客

返回顶部