首页
社区
课程
招聘
[求助]还是平台移植的问题
发表于: 2014-3-26 21:15 3600

[求助]还是平台移植的问题

2014-3-26 21:15
3600
最近一直在做移植,从xp到win7,32位下
程序框架是这样:
基于FileMon改写的文件类监控驱动,基于RegMon改写的注册表监控
应用层在一个while里循环发送DeviceIoControl,得到驱动记录的log
两个驱动程序对应上层的两个获取log线程,即两个线程的while。
而驱动层在FileMonFastIoDeviceControl里响应,把log传给应用层。

当要被检测的程序启动后(简称样本),文件类DeviceIoControl的函数很容易出现阻塞(该线程被阻塞,即DeviceIoControl未返回)的情况,换句话说:
一直无法得到log,而注册表的偶尔也会有这种情况。

但是在xp下,DeviceIoControl同步工作得很好。。。

因为改成异步的话,要改太多东西,所以暂时未尝试异步处理,而且不知道阻塞的原因,不一定有效。

想问问各位有没有碰到类似的情况,或者怎么处理的?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 11
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
驱动直接写到日志。。。
2014-3-27 08:54
0
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
简要代码如下:
应用层
	for (;;)
	{
		Sleep(nSleeptime);
		DWORD dwTimeF = GetTickCount();
		for (;;)
		{
			StatsLen = 0;
			OutputDebugString("向下发控制码得到文件日志开始\n");
			if ( ! DeviceIoControl(g_hDevice, IOCTL_FILEMON_GETSTATS,
				NULL, 0, &Stats, sizeof Stats,
				&StatsLen, NULL ) )
			{	
				OutputDebugString("向下发控制码得到文件日志失败\n");
				return 0;
			}
			OutputDebugString("向下发控制码得到文件日志\n");
			// 该判断方法来自于FileMon
			if ( StatsLen < sizeof(int)+2 )
				break;

			g_fnCallBack(StatsLen,Stats,0);

			if( GetTickCount() - dwTimeF > 1000 ) 
			{
				nSleeptime = nSleeptime*2;
				OutputDebugString("我被执行一次了!\n");
				break;
			}
		}
		OutputDebugString("向下发控制码得到文件日志线程空转\n");
	}


驱动层
FilemonFastIoDeviceControl()
{
  case IOCTL_FILEMON_GETSTATS: //获取统计信息,与应用交互,把数据传给应用

            if( LOGBUFSIZE > OutputBufferLength ) 
			{

                IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
                return FALSE;
            }

            //
            // Probe the output buffer
            //
            __try 
	{                 

                ProbeForWrite( OutputBuffer,
                               OutputBufferLength,
                               sizeof( UCHAR ));

            } __except( EXCEPTION_EXECUTE_HANDLER )
	  {

                IoStatus->Status = STATUS_INVALID_PARAMETER;
                return FALSE;
            }            

            //
            // We're okay, lock the buffer pool
            //
            ExAcquireFastMutex( &LogMutex );
            if( CurrentLog->Len  ||  CurrentLog->Next )
		{
                //
                // Start output to a new output buffer
                //
                FilemonAllocateLog();

                //
                // Fetch the oldest to give to user
                //
                oldLog = FilemonGetOldestLog();

                if( oldLog != CurrentLog ) 
		{

                    logMutexReleased = TRUE;
                    ExReleaseFastMutex( &LogMutex );

                } 
				else
				{

                    logMutexReleased = FALSE;
                }

                //
                // Copy it to the caller's buffer
                //
                memcpy( OutputBuffer, oldLog->Data, oldLog->Len );

                //
                // Return length of copied info
                //
                IoStatus->Information = oldLog->Len;

                //
                // Deallocate buffer - unless its the last one
                //
                if( logMutexReleased )
		{ 
                    ExFreePool( oldLog );
                }
		else
		{

                    CurrentLog->Len = 0;
                    ExReleaseFastMutex( &LogMutex );                    
                }

            } 
	   else
	 {

                //
                // There is no unread data
                //
                ExReleaseFastMutex( &LogMutex );
				IoStatus->Information = 0;
            }
            break;
}

2014-3-27 09:19
0
游客
登录 | 注册 方可回帖
返回
//