vectra
驱动牛犊
驱动牛犊
  • 注册日期2004-10-12
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1402回复:4

修改FileMon产生的问题

楼主#
更多 发布于:2004-11-24 20:25
我要将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]
toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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

vectra
驱动牛犊
驱动牛犊
  • 注册日期2004-10-12
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-25 16:05
我的目的是当监视记录缓冲区满了以后,阻塞所有文件操作(IRP_MJ_WRITE、IRP_MJ_CREATE等),等待用户读出记录后再继续。所以在LogRecord()函数中将LogFullEvent设为无信号,然后用KeWaitForSingleObject()进入等状态。在用户读记录的函数中FilemonFastIoDeviceControl()(该函数也在驱动程序中),如果成功记出了记录,就出现了空闲的缓冲区,所以将LogFullEvent置为信号态,以结束LogRecord()中的等待。

我刚接触驱动不久,很多东西不熟悉,可以解决这个问题的朋友给点提示,或者给写几行代码。我真的很需要解决这个问题,谢谢大家了。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-25 09:34
如果缓冲区满时,你的logRecord怎么执行,KeWaitForSingleObject调用被设为no wait、no alert,它又实现什么功能??
看得不是很明白,不过我认为,应该在LogRecord里作KeSetEvent、KeWaitForSingleObject,在FilemonFastIoDeviceControl里作KeResetEvent。
呵呵,没有环境测试,只能想想了。
在交流中学习。。。
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-25 09:16
会不会是权限的问题?望高手解题。
游客

返回顶部