讨论:关于作一个监视系统文件操作的程序设计问题 在NT/XP/2000下可以考虑使用服务程序的办法比用HOOK要安全得多。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你所说的服务程序即为filemon.vxd/filemon.sys方式吧?也觉得Hook容易导致问题。我有一段调用filemon.vxd/filemon.sys的代码不能得到跟踪结果,为什么?代码如下: SC_HANDLE schService=NULL; SC_HANDLE schSCManager=NULL; char ErrorString[256]; try { unsigned long NTVersion = GetVersion(); IsNT = FALSE; if( NTVersion < 0x80000000 ) { IsNT = TRUE; } char *DeviceName=_T("\\\\.\\FILEMON"); char *DriverName=_T("FILEMON"); char *DriverBin=IsNT?_T("C:\\WINNT\\FILEMON.SYS"):_T("C:\\WINNT\\FILEMON.VXD"); schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); schService = OpenService( schSCManager, DriverName, SERVICE_ALL_ACCESS ); if (schService == NULL ) { schService = CreateService( schSCManager, // SCManager database DriverName, // name of service DriverName, // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_KERNEL_DRIVER,// service type SERVICE_DEMAND_START, // start type SERVICE_ERROR_NORMAL, // error control type DriverBin, // service's binary NULL, // no load ordering group NULL, // no tag identifier NULL, // no dependencies NULL, // LocalSystem account NULL); // no password } if(schService==NULL) { ErrorCode=GetLastError(); wsprintf(ErrorString,_T("Failed 1 Code %xl"),ErrorCode); throw(-1); } StartService(schService,0,NULL); Sleep(10); HANDLE SysHandle=CreateFile(DeviceName, STANDARD_RIGHTS_ALL, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED|FILE_FLAG_DELETE_ON_CLOSE,NULL ); if(SysHandle==INVALID_HANDLE_VALUE) { ErrorCode=GetLastError(); wsprintf(ErrorString,_T("Failed 2 Code %xl"),ErrorCode); throw(-1); } DeviceIoControl(SysHandle, FILEMON_zerostats, NULL, 0, NULL, 0, &WaitResult, NULL );//================================================================== sprintf( FilterDefinition.processfilter, "*" ); sprintf( FilterDefinition.excludeprocess, "" ); sprintf( FilterDefinition.pathfilter, "*" ); sprintf( FilterDefinition.excludefilter, ""); FilterDefinition.logreads = TRUE; FilterDefinition.logwrites = TRUE;//================================================================== bool TimeIsDuration=true; unsigned long StatsLen; unsigned long CurDriveSet=0xfffffffel; DeviceIoControl(SysHandle, FILEMON_setdrives, &CurDriveSet, sizeof CurDriveSet, &CurDriveSet, sizeof CurDriveSet, &WaitResult, NULL ); StatsLen=DeviceIoControl(SysHandle, FILEMON_setfilter, &FilterDefinition, sizeof(FILTER), NULL, 0, &WaitResult, NULL ); StatsLen=DeviceIoControl(SysHandle, FILEMON_timetype, (PVOID) &TimeIsDuration, sizeof(bool), NULL, 0, &WaitResult, NULL ); StatsLen=DeviceIoControl(SysHandle, FILEMON_startfilter, NULL, 0, NULL, 0, &WaitResult, NULL ); StatsLen=0; DeviceIoControl(SysHandle, FILEMON_getstats, NULL, 0, BufferPtr, BufferSize, &StatsLen, NULL ) ; VARIANT var; unsigned short Value=1; var.vt=VT_I2; var.uiVal=1111; if(StatsLen!=0) PostThreadMessage(ThreadID,ME_EVENT,MonitorID,StatsLen); CloseHandle(SysHandle); 各位老大,有没有对FILEMON有所研究的帮忙看看上面的代码啊!!!! hook api只能拦截一般的文件操作如果是程序直接调用低层的文件操作hook api就没有办法了filemon sys程序也有问题在有文件操作时不能停止操作系统所以有可能不会同步最好的办法是拦截系统服务如ZwCreateFile等这样就能保证有文件操作时是同步的上面代码你要什么结果? 匿名管道,用closehandle关闭hWrite写句柄后, 如何再打开? mfc问题 菜单谈出对话框的问题? VC6.0的IDE中的查找结果框是只读的,有办法可以改变吗? mfc42u.lib 文件的问题 请大家帮忙配台电脑 在MDI程序中添加的文档类,在调用时出错? 在Win2000中,如何屏蔽系统热键? 就是保存文件的一个小问题,(100分,简单的很,但我太苯) 搜集一些vc编程资料 我xnmdbz,就是这里的 OnTimer问题,下次要快!可不可以重入?
也觉得Hook容易导致问题。
我有一段调用filemon.vxd/filemon.sys的代码
不能得到跟踪结果,为什么?
代码如下:
SC_HANDLE schService=NULL;
SC_HANDLE schSCManager=NULL;
char ErrorString[256];
try
{
unsigned long NTVersion = GetVersion();
IsNT = FALSE;
if( NTVersion < 0x80000000 )
{
IsNT = TRUE;
}
char *DeviceName=_T("\\\\.\\FILEMON");
char *DriverName=_T("FILEMON");
char *DriverBin=IsNT?_T("C:\\WINNT\\FILEMON.SYS"):_T("C:\\WINNT\\FILEMON.VXD");
schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); schService = OpenService( schSCManager,
DriverName,
SERVICE_ALL_ACCESS
);
if (schService == NULL )
{
schService = CreateService( schSCManager, // SCManager database
DriverName, // name of service
DriverName, // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_KERNEL_DRIVER,// service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
DriverBin, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
}
if(schService==NULL)
{
ErrorCode=GetLastError();
wsprintf(ErrorString,_T("Failed 1 Code %xl"),ErrorCode);
throw(-1);
}
StartService(schService,0,NULL);
Sleep(10);
HANDLE SysHandle=CreateFile(DeviceName,
STANDARD_RIGHTS_ALL, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED|FILE_FLAG_DELETE_ON_CLOSE,NULL );
if(SysHandle==INVALID_HANDLE_VALUE)
{
ErrorCode=GetLastError();
wsprintf(ErrorString,_T("Failed 2 Code %xl"),ErrorCode);
throw(-1);
}
DeviceIoControl(SysHandle, FILEMON_zerostats,
NULL, 0, NULL, 0, &WaitResult, NULL );
//==================================================================
sprintf( FilterDefinition.processfilter, "*" );
sprintf( FilterDefinition.excludeprocess, "" );
sprintf( FilterDefinition.pathfilter, "*" );
sprintf( FilterDefinition.excludefilter, "");
FilterDefinition.logreads = TRUE;
FilterDefinition.logwrites = TRUE;
//==================================================================
bool TimeIsDuration=true;
unsigned long StatsLen;
unsigned long CurDriveSet=0xfffffffel;
DeviceIoControl(SysHandle, FILEMON_setdrives,
&CurDriveSet, sizeof CurDriveSet,
&CurDriveSet, sizeof CurDriveSet,
&WaitResult, NULL );
StatsLen=DeviceIoControl(SysHandle, FILEMON_setfilter,
&FilterDefinition, sizeof(FILTER), NULL,
0, &WaitResult, NULL );
StatsLen=DeviceIoControl(SysHandle, FILEMON_timetype,
(PVOID) &TimeIsDuration, sizeof(bool),
NULL, 0, &WaitResult, NULL );
StatsLen=DeviceIoControl(SysHandle, FILEMON_startfilter,
NULL, 0, NULL, 0, &WaitResult, NULL );
StatsLen=0;
DeviceIoControl(SysHandle, FILEMON_getstats,
NULL, 0, BufferPtr, BufferSize,
&StatsLen, NULL ) ;
VARIANT var;
unsigned short Value=1;
var.vt=VT_I2;
var.uiVal=1111;
if(StatsLen!=0)
PostThreadMessage(ThreadID,ME_EVENT,MonitorID,StatsLen);
CloseHandle(SysHandle);
帮忙看看上面的代码啊!!!!
如果是程序直接调用低层的文件操作
hook api就没有办法了filemon sys程序也有问题
在有文件操作时
不能停止操作系统
所以有可能不会同步最好的办法是拦截系统服务
如ZwCreateFile等
这样就能保证有文件操作时
是同步的上面代码你要什么结果?