鱼C论坛

 找回密码
 立即注册
查看: 6439|回复: 19

WINDOWS API判断一个文件是否被某个程序读取,或者调用

[复制链接]
发表于 2016-7-26 09:47:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
判断一个文件是否被某个程序读取,或者调用

比如说一首歌曲,被用酷狗打开了,程序要给出提示被调用了,或者是这个歌曲被某个软件调用到程序里播放了,需要自己写的程序给出提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-26 09:47:48 | 显示全部楼层
求大神指点迷津
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 11:12:20 | 显示全部楼层
CreateFile函数,如果返回INVALID_HANDLE_VALUE则存在
如果返回非零就存在。如果存在就立即调用CloseHandle(hFile)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 14:19:27 | 显示全部楼层
简单的方法是 独占的方式打开文件,如果能打开就表示该文件没有被占用,打开失败就调用GetLastError函数,如果返回ERROR_SHARING_VIOLATION就表示该文件正在被其他文件占用。

高级一点的方法是枚举全局句柄表,查找所有句柄类型为File的句柄,在句柄名里找到了你要查找的文件就表示该文件被打开了,然后再查询该句柄属于哪个进程就可以知道该文件正在被哪个进程所使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-26 16:59:26 | 显示全部楼层
xietao1233 发表于 2016-7-26 14:19
简单的方法是 独占的方式打开文件,如果能打开就表示该文件没有被占用,打开失败就调用GetLastError函数, ...

我意思没表达清楚,我想实现的类似一个监控的程序,我不主动打开软件,如果我电脑上的某软件被打开,则弹窗提醒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-26 17:00:01 | 显示全部楼层
无符号整形 发表于 2016-7-26 11:12
CreateFile函数,如果返回INVALID_HANDLE_VALUE则存在
如果返回非零就存在。如果存在就立即调用CloseHandl ...

我意思没表达清楚,我想实现的类似一个监控的程序,我不主动打开软件,如果我电脑上的某软件被打开,则弹窗提醒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 19:25:41 | 显示全部楼层
不知道你要是监视指定的程序还是要监视所有程序?
1.如果你想检测可执行程序的话,可以考虑从任务管理器的进程列表中读取某程序是否启动了,然后给予提示
2.如果你想检测文件,可以创建一个循环条件使用楼上的方法Createfile进行判断,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 22:05:23 | 显示全部楼层
不行,你的意思应该是类似于Xuetr的那种句柄管理,看看编写驱动能不能实现吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 08:56:30 | 显示全部楼层
FlyCode 发表于 2016-7-26 19:25
不知道你要是监视指定的程序还是要监视所有程序?
1.如果你想检测可执行程序的话,可以考虑从任务管理器的 ...

监视指定程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 08:57:18 | 显示全部楼层
freeparty 发表于 2016-7-26 22:05
不行,你的意思应该是类似于Xuetr的那种句柄管理,看看编写驱动能不能实现吧。

我问过好几个人,都说要驱动级别的,小菜鸡表示写不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:34:15 | 显示全部楼层
shaojundao 发表于 2016-7-26 17:00
我意思没表达清楚,我想实现的类似一个监控的程序,我不主动打开软件,如果我电脑上的某软件被打开,则弹 ...

在驱动里注册一个进程回调函数可以实现, TX也用这种方法检查你打开的程序有没有调试器.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 10:13:14 | 显示全部楼层
xietao1233 发表于 2016-7-27 09:34
在驱动里注册一个进程回调函数可以实现, TX也用这种方法检查你打开的程序有没有调试器.

可否具体一点,有点迷糊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 10:17:45 | 显示全部楼层
可以!可以把CreateFile函数hook掉,然后另外开个线程,不断检测文件名是不是要打开的文件

点评

不过这个是最笨的方法  发表于 2016-7-27 10:18
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 11:17:01 | 显示全部楼层
xietao1233 发表于 2016-7-27 09:34
在驱动里注册一个进程回调函数可以实现, TX也用这种方法检查你打开的程序有没有调试器.

在驱动层调用PsSetCreateProcessNotifyRoutineEx函数可以注册一个进程创建通知回调函数, 没当当前系统打开一个新进程, 系统就会调用你设置的回调函数. 你可以在里面进行过滤判断的动作.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 11:21:05 | 显示全部楼层
xietao1233 发表于 2016-7-27 11:17
在驱动层调用PsSetCreateProcessNotifyRoutineEx函数可以注册一个进程创建通知回调函数, 没当当前系统打 ...

路漫漫其修远兮,我才学一个礼拜不到,凭我的能力应该还写不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 11:44:01 | 显示全部楼层
shaojundao 发表于 2016-7-27 11:21
路漫漫其修远兮,我才学一个礼拜不到,凭我的能力应该还写不出来

这个的话你要学驱动的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 12:15:19 | 显示全部楼层
本帖最后由 xietao1233 于 2016-7-27 12:17 编辑
shaojundao 发表于 2016-7-27 11:21
路漫漫其修远兮,我才学一个礼拜不到,凭我的能力应该还写不出来


监控类的软件功能都相对高级, 应用层也能通过NTDLL的ZW系统函数来实现部分功能, 不过总体来说有点鸡肋
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 08:37:32 | 显示全部楼层
无符号整形 发表于 2016-7-27 11:44
这个的话你要学驱动的。

不过还是感谢指点,多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 08:38:06 | 显示全部楼层
xietao1233 发表于 2016-7-27 12:15
监控类的软件功能都相对高级, 应用层也能通过NTDLL的ZW系统函数来实现部分功能, 不过总体来说有点鸡肋

感谢指点,谢过了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 18:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表