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

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

用WaitForSingleObject可以吗?我查了一下,似乎文件被改变可以监控的到,但是文件被关闭不知道如何去监视
...全文
411 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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程序怎么通讯你都不知道
加载更多回复(20)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧