shaojundao 发表于 2016-7-26 09:47:17

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

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

比如说一首歌曲,被用酷狗打开了,程序要给出提示被调用了,或者是这个歌曲被某个软件调用到程序里播放了,需要自己写的程序给出提示

shaojundao 发表于 2016-7-26 09:47:48

求大神指点迷津

无符号整形 发表于 2016-7-26 11:12:20

CreateFile函数,如果返回INVALID_HANDLE_VALUE则存在
如果返回非零就存在。如果存在就立即调用CloseHandle(hFile)

xietao1233 发表于 2016-7-26 14:19:27

简单的方法是 独占的方式打开文件,如果能打开就表示该文件没有被占用,打开失败就调用GetLastError函数,如果返回ERROR_SHARING_VIOLATION就表示该文件正在被其他文件占用。

高级一点的方法是枚举全局句柄表,查找所有句柄类型为File的句柄,在句柄名里找到了你要查找的文件就表示该文件被打开了,然后再查询该句柄属于哪个进程就可以知道该文件正在被哪个进程所使用。{:10_258:}

shaojundao 发表于 2016-7-26 16:59:26

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

我意思没表达清楚,我想实现的类似一个监控的程序,我不主动打开软件,如果我电脑上的某软件被打开,则弹窗提醒

shaojundao 发表于 2016-7-26 17:00:01

无符号整形 发表于 2016-7-26 11:12
CreateFile函数,如果返回INVALID_HANDLE_VALUE则存在
如果返回非零就存在。如果存在就立即调用CloseHandl ...

我意思没表达清楚,我想实现的类似一个监控的程序,我不主动打开软件,如果我电脑上的某软件被打开,则弹窗提醒

FlyCode 发表于 2016-7-26 19:25:41

不知道你要是监视指定的程序还是要监视所有程序?
1.如果你想检测可执行程序的话,可以考虑从任务管理器的进程列表中读取某程序是否启动了,然后给予提示
2.如果你想检测文件,可以创建一个循环条件使用楼上的方法Createfile进行判断,

freeparty 发表于 2016-7-26 22:05:23

不行,你的意思应该是类似于Xuetr的那种句柄管理,看看编写驱动能不能实现吧。

shaojundao 发表于 2016-7-27 08:56:30

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

监视指定程序

shaojundao 发表于 2016-7-27 08:57:18

freeparty 发表于 2016-7-26 22:05
不行,你的意思应该是类似于Xuetr的那种句柄管理,看看编写驱动能不能实现吧。

我问过好几个人,都说要驱动级别的,小菜鸡表示写不出来

xietao1233 发表于 2016-7-27 09:34:15

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

在驱动里注册一个进程回调函数可以实现, TX也用这种方法检查你打开的程序有没有调试器.

shaojundao 发表于 2016-7-27 10:13:14

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

可否具体一点,有点迷糊{:5_96:}

无符号整形 发表于 2016-7-27 10:17:45

可以!可以把CreateFile函数hook掉,然后另外开个线程,不断检测文件名是不是要打开的文件

xietao1233 发表于 2016-7-27 11:17:01

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

在驱动层调用PsSetCreateProcessNotifyRoutineEx函数可以注册一个进程创建通知回调函数, 没当当前系统打开一个新进程, 系统就会调用你设置的回调函数. 你可以在里面进行过滤判断的动作.

shaojundao 发表于 2016-7-27 11:21:05

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

路漫漫其修远兮,我才学一个礼拜不到,凭我的能力应该还写不出来

无符号整形 发表于 2016-7-27 11:44:01

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

这个的话你要学驱动的。

xietao1233 发表于 2016-7-27 12:15:19

本帖最后由 xietao1233 于 2016-7-27 12:17 编辑

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

监控类的软件功能都相对高级, 应用层也能通过NTDLL的ZW系统函数来实现部分功能, 不过总体来说有点鸡肋

shaojundao 发表于 2016-7-28 08:37:32

无符号整形 发表于 2016-7-27 11:44
这个的话你要学驱动的。

不过还是感谢指点,多谢{:5_110:}

shaojundao 发表于 2016-7-28 08:38:06

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

感谢指点,谢过了{:5_110:}
页: [1]
查看完整版本: WINDOWS API判断一个文件是否被某个程序读取,或者调用