阅读:1689回复:11
FileMon完成例程的Write问题
最近研究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处理的时候没有处理好就蓝屏了不知道对不,请各位大侠帮忙看看,小弟在这里拜谢了! |
|
沙发#
发布于:2008-08-07 18:55
自己顶
|
|
板凳#
发布于:2008-08-12 16:14
LogRecord() 3、4参数不可置空值
|
|
地板#
发布于:2008-08-13 15:38
应该跟这个没有关系,我试过不设空值,结果还是一样啊
|
|
地下室#
发布于:2008-08-20 21:07
Filemon 缺陷不少。。。最近我在VISTA 上发现总是死机。。。IRP 阻塞了
|
|
|
5楼#
发布于:2008-08-25 17:35
奇怪的是只有操作大文件的时候才这样
|
|
6楼#
发布于:2008-08-25 18:30
小文件可能一个PagingIo就结束了,大文件会连续发出多个PagingIo
FileMon已经过时了,研究些新的东西吧 |
|
|
7楼#
发布于:2008-08-28 09:59
新的东西有什么?楼上老兄有什么好的推荐没有?
|
|
8楼#
发布于:2009-05-04 21:50
lz联系我一下,我也遇到这个问题了
qq:83424493 |
|
9楼#
发布于:2009-05-20 00:20
这个和新的东西没有关系,而是针对新的操作系统,需要对部分内容进行优化。
使用新的构架对于老系统同样存在问题。 FileMon的结构还是比较简单的。 |
|
10楼#
发布于:2009-05-28 18:49
还是太富足,简化一下就好了
|
|
|
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 吗? |
|