如何得到文件被关闭的消息

sunshine502 2009-08-18 11:29:00
请问如何知道当前有文件被关闭?该文件不一定是用我的程序打开,而是指当前系统中的任意文件

用WaitForSingleObject可以吗?我查了一下,似乎文件被改变可以监控的到,但是文件被关闭不知道如何去监视
...全文
376 点赞 收藏 40
写回复
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunshine502 2009-08-25
感谢!貌似都是技术大牛哈~
回复
vincent_1011 2009-08-24
[Quote=引用 38 楼 tr0j4n 的回复:]
引用 37 楼 vincent_1011 的回复:
引用 36 楼 tr0j4n 的回复:
34#的同学,你不要开玩笑了。那个是监视文件改动的,没文件关闭的,支持的是文件事件 改名,删除等操作,CFileChangeEvent什么意思你知道吗?有CHanddleChangeEvent吗?

看到你代码中的FindFirstChangeNotification,我就知道你的代码是不行的


文件关闭那个,应该和我上面说的意思一样,就是事先打开所有进程的句柄,然后用waitfor....

文件一关闭的时候,句柄就变为可触发状态,我都实现了。你怎么一味说人家不行,最多是不完美。

文件句柄和进程句柄什么关系你知道吗?我没别的意思,你不要误会。大家都是搞IT的,有的事情要追根究底

你打开进程的句柄,然后WaitFor什么呢?

退一步讲,就算是你通过RootKit手段,ZwQuerySystemInformation获得了进程的句柄表,问题是你能保证这个文件没有被别的东西打开?你能保证句柄表中这个FileObject就只有一个句柄吗?如果是几个呢?你WaitFor哪个呢?
[/Quote]

- -|+,言重了,还是你考虑得比较周到

另外我说的那个waitfor只是针对进程关闭,没说啥修改文件
回复
MoXiaoRab 2009-08-24
[Quote=引用 37 楼 vincent_1011 的回复:]
引用 36 楼 tr0j4n 的回复:
34#的同学,你不要开玩笑了。那个是监视文件改动的,没文件关闭的,支持的是文件事件 改名,删除等操作,CFileChangeEvent什么意思你知道吗?有CHanddleChangeEvent吗?

看到你代码中的FindFirstChangeNotification,我就知道你的代码是不行的


文件关闭那个,应该和我上面说的意思一样,就是事先打开所有进程的句柄,然后用waitfor....

文件一关闭的时候,句柄就变为可触发状态,我都实现了。你怎么一味说人家不行,最多是不完美。
[/Quote]
文件句柄和进程句柄什么关系你知道吗?我没别的意思,你不要误会。大家都是搞IT的,有的事情要追根究底

你打开进程的句柄,然后WaitFor什么呢?

退一步讲,就算是你通过RootKit手段,ZwQuerySystemInformation获得了进程的句柄表,问题是你能保证这个文件没有被别的东西打开?你能保证句柄表中这个FileObject就只有一个句柄吗?如果是几个呢?你WaitFor哪个呢?
回复
vincent_1011 2009-08-24
[Quote=引用 36 楼 tr0j4n 的回复:]
34#的同学,你不要开玩笑了。那个是监视文件改动的,没文件关闭的,支持的是文件事件 改名,删除等操作,CFileChangeEvent什么意思你知道吗?有CHanddleChangeEvent吗?

看到你代码中的FindFirstChangeNotification,我就知道你的代码是不行的
[/Quote]

文件关闭那个,应该和我上面说的意思一样,就是事先打开所有进程的句柄,然后用waitfor....

文件一关闭的时候,句柄就变为可触发状态,我都实现了。你怎么一味说人家不行,最多是不完美。
回复
churenxh 2009-08-23
http://www.codeguru.com/Cpp/misc/misc/fileio/article.php/c329#more
文件的打开,关闭的监控原代码
可看看UINT CFileChangeEvent::FileChangeWatch(LPVOID lpParam)
{
CFileChangeEvent *pFileChangeEvent = (CFileChangeEvent *) lpParam;

HANDLE *hChangeHandles = new HANDLE[pFileChangeEvent->m_Paths.size() + 1];

while ( 1 ) //endless loop
{
hChangeHandles[0] = pFileChangeEvent->m_evStopWatch;
for (int i = 0; i < pFileChangeEvent->m_Paths.size(); i++)
{
hChangeHandles[i+1] = FindFirstChangeNotification(pFileChangeEvent->m_Paths[i]->getName().c_str(),
FALSE,
FILE_NOTIFY_CHANGE_LAST_WRITE
| FILE_NOTIFY_CHANGE_SIZE
| FILE_NOTIFY_CHANGE_FILE_NAME
);
}
DWORD dwResult = WaitForMultipleObjects(pFileChangeEvent->m_Paths.size() + 1, hChangeHandles, FALSE, INFINITE);

if ( dwResult == WAIT_OBJECT_0 ) // Watch stopped
{
break;
}

int nPathIdx = dwResult - WAIT_OBJECT_0 - 1;

// Search for changed files

for (FileInfoMap::iterator it = pFileChangeEvent->m_FileInfoMap.begin(); it != pFileChangeEvent->m_FileInfoMap.end(); it++)
{
if ( it->second->getPath() == pFileChangeEvent->m_Paths[nPathIdx]->getName() )
{
HANDLE f = CreateFile(it->second->getName().c_str(),
0,
FILE_SHARE_DELETE
| FILE_SHARE_READ
| FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( f )
{
FILETIME dtFileDate;
GetFileTime (f, NULL, NULL, &dtFileDate);
CloseHandle(f);
COleDateTime dtDate = dtFileDate;
if ( it->second->getDate() < dtDate )
{
it->second->setDate(dtDate);
pFileChangeEvent->OnFileAlarm(FA_CHANGED, it->second->getName());
}
}
else
{
pFileChangeEvent->OnFileAlarm(FA_REMOVED, it->second->getName());
pFileChangeEvent->removeFile(it->second->getName());
}

}
}
}

delete[] hChangeHandles;
return 0;
}
回复
ziplj 2009-08-23
[Quote=引用 6 楼 tr0j4n 的回复:]
SSDT Hook ZwCloseHandle
[/Quote]
....又来???
回复
wwwxkrs 2009-08-23
不止是文件关闭会用ZwClose,要想知道是否是文件句柄还要枚举进程句柄表来判断
还是文件系统过滤驱动简单
回复
MoXiaoRab 2009-08-23
34#的同学,你不要开玩笑了。那个是监视文件改动的,没文件关闭的,支持的是文件事件 改名,删除等操作,CFileChangeEvent什么意思你知道吗?有CHanddleChangeEvent吗?

看到你代码中的FindFirstChangeNotification,我就知道你的代码是不行的
回复
wwwxkrs 2009-08-23
膜拜ls大神,ring3的方法都找得到
回复
vincent_1011 2009-08-20
[Quote=引用 28 楼 tr0j4n 的回复:]
用WH_CALLWNDPROC来钩WM_CLOSE消息
这个肯定不行
使用ReadDirectoryChangesW
这个只能监视
使用waitforsingleobject
这玩意更不靠谱

SSDT Hook还算是比较好学的,不过嘛...你得进修一段时间的驱动啊,不然驱动和Ring3程序怎么通讯你都不知道
[/Quote]

为什么呢?WaitForMultipleObjects前枚举进程。

不过缺点就是要自己不停的在循环,效率不好,循环间隔时间如果太长,就捕获不到那些在你间隔时间内打开又关闭的文件
回复
vincent_1011 2009-08-19
可以open句柄然后waitforsingleobject?
回复
sunshine502 2009-08-19
看上去挺深奥的。。。汗,只是监控文件关闭事件而已,真的需要这么复杂么?
回复
MoXiaoRab 2009-08-19
上面讲错了,不是ZwCloseHandle,是ZwClose,当时头昏了下
回复
MoXiaoRab 2009-08-19
这个是SSDT Hook,驱动里的。
如果你在Ring3下面做的话,只能Hook CloseHandle,还不一定成功,因为应用层下的Hook是依赖于注入的,如果目标作了保护,就Hook不到了
回复
sunshine502 2009-08-19
[Quote=引用 17 楼 tr0j4n 的回复:]
监视文件修改太容易了,但是要能看到文件被关闭的消息你只能通过Hook ZwCloseHandle
[/Quote]

您好,请问能稍微详细一点吗?昨天学习了一天的钩子的知识,现在稍有了解,想实现这个功能是否必须用全局钩子,而全局钩子必须写成DLL?
回复
fly4free 2009-08-19
真不知道捕获到文件被关闭 会有什么用处……
回复
MoXiaoRab 2009-08-19
监视文件修改太容易了,但是要能看到文件被关闭的消息你只能通过Hook ZwCloseHandle
回复
hex502 2009-08-19
UP
回复
sunshine502 2009-08-19
刚才试了下用全局钩子,窗口的销毁事件很容易就能获取,文件的关闭就不知道怎么弄了。。。
回复
MoXiaoRab 2009-08-19
用WH_CALLWNDPROC来钩WM_CLOSE消息
这个肯定不行
使用ReadDirectoryChangesW
这个只能监视
使用waitforsingleobject
这玩意更不靠谱

SSDT Hook还算是比较好学的,不过嘛...你得进修一段时间的驱动啊,不然驱动和Ring3程序怎么通讯你都不知道
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告