阅读:1402回复:4
修改FileMon产生的问题
我要将FileMon用于我的监控程序中,但它有个问题,当读写操作太过频繁,用户程序来不及读,它的监视记录缓冲区满后,很多记录会被丢掉。为了解决这个问题,我在LogRecord加了以下代码,但是程序死在KeWaitForSingleObject()处了。
我的目的是当监视记录缓冲区满了以后,阻塞所有文件操作(IRP_MJ_WRITE、IRP_MJ_CREATE等),等待用户读出记录后再继续。所以在LogRecord()函数中将LogFullEvent设为无信号,然后用KeWaitForSingleObject()进入等状态。在用户读记录的函数中FilemonFastIoDeviceControl()(该函数也在驱动程序中),如果成功记出了记录,就出现了空闲的缓冲区,所以将LogFullEvent置为信号态,以结束LogRecord()中的等待。 我刚接触驱动不久,很多东西不熟悉,可以解决这个问题的朋友给点提示,或者给写几行代码。我真的很需要解决这个问题,谢谢大家了。 还有一个问题是,IRP_MJ_WRITE,IRP_MJ_CREATE这些能阻塞吗? LogRecord(...) { ... if( passedFilters ) { if( MaxLog-1 == NumLog )//记录满了,等待,//添加的 { bLogFull = TRUE; KeResetEvent( &LogFullEvent ); KeWaitForSingleObject( &LogFullEvent, Executive, KernelMode, FALSE, NULL ); } // // Lock the output buffer and Log. // ExAcquireFastMutex( &LogMutex ); ... ExReleaseFastMutex( &LogMutex ); } } 在用户程序读监视记录的函数中 FilemonFastIoDeviceControl(...) { ... case IOCTL_FILEMON_GETSTATS: ExAcquireFastMutex( &LogMutex ); ... //将监视记录复制到用户缓冲区 ExReleaseFastMutex( &LogMutex ); if( bLogFull ) //添加的 { KeSetEvent( &LogFullEvent, 0, FALSE ); bLogFull = FALSE; } } [编辑 - 11/25/04 by vectra] |
|
沙发#
发布于:2004-11-26 02:43
你block了哪些文件I/O? 有的文件I/O你如果BLOCK的话你的LogRecord就可能无法按时完成.于是你的驱动既BLOCK了LogRecord又在等Record完成, 于是DeadLock.
建议 1) 不要BLOCK系统的PAGE I/O 2) 不要BLOCK你自己程序引起的I/O 3) 增加缓冲区的大小 toad |
|
板凳#
发布于:2004-11-25 16:05
我的目的是当监视记录缓冲区满了以后,阻塞所有文件操作(IRP_MJ_WRITE、IRP_MJ_CREATE等),等待用户读出记录后再继续。所以在LogRecord()函数中将LogFullEvent设为无信号,然后用KeWaitForSingleObject()进入等状态。在用户读记录的函数中FilemonFastIoDeviceControl()(该函数也在驱动程序中),如果成功记出了记录,就出现了空闲的缓冲区,所以将LogFullEvent置为信号态,以结束LogRecord()中的等待。
我刚接触驱动不久,很多东西不熟悉,可以解决这个问题的朋友给点提示,或者给写几行代码。我真的很需要解决这个问题,谢谢大家了。 |
|
地板#
发布于:2004-11-25 09:34
如果缓冲区满时,你的logRecord怎么执行,KeWaitForSingleObject调用被设为no wait、no alert,它又实现什么功能??
看得不是很明白,不过我认为,应该在LogRecord里作KeSetEvent、KeWaitForSingleObject,在FilemonFastIoDeviceControl里作KeResetEvent。 呵呵,没有环境测试,只能想想了。 |
|
|
地下室#
发布于:2004-11-25 09:16
会不会是权限的问题?望高手解题。
|
|