前言

在windows中编程。有些文件重新生成,但是被正在运行的程序占用,导致重新生成失败。所以,我希望写个小工具,它实现这样的功能。

  • 扫描当前路径下的文件,查看哪些文件被占用。
  • 杀死占用文件的程序。

PS: 最后的工具FreeFile,需要在配置文件中指定被占用的文件。运行FreeFile,杀死占用文件的程序。


需求分析


概要设计中的难点-如何通过文件查找到占用文件的进程

我对win系统编程基本一窍不通。但既然有这个想法,那撸起袖子干吧。

Windows句柄是什么

参考:深入了解Windows句柄到底是什么What is a Windows Handle?

正确地说,在 Windows 中,句柄是一种抽象,它向 API 用户隐藏真实内存地址,允许系统对程序透明地重新组织物理内存。将句柄解析为指针会锁定内存,释放句柄会使指针无效。在这种情况下,可以将其视为指针表的索引……您将索引用于系统 API 调用,系统可以随意更改表中的指针。

枚举(文件)句柄

参考:

  1. Handle v4.22 - windows工具无源码
  2. yihleego/handle-tools
  3. 用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法
  4. Use Windows Native API to enumerate all handles and find the corresponding file name of the file handle

上面参考给出了两种思路。

第一种是yihleego/handle-tools

  • 使用NtQuerySystemInformation function获取到所有句柄。(但是会用到win开发文档没有的参数。当然这个参数确实有效。似乎是没有作为接口参数暴露出来。)
  • 使用OpenProcess function,根据枚举句柄对应的进程标识符,返回进程的句柄。(如果指定的进程是系统进程或客户端服务器运行时子系统 (CSRSS) 进程之一,此函数将失败)
  • 使用NtDuplicateObject,在当前进程,创建枚举句柄的副本。(上面一步和下面这步,应该是为了跨进程共享对象)
  • 使用NtQueryObject,检索句柄的对象信息。
  • 使用NtQueryObject function,获取句柄的名称和类型信息。

总体是:获取所有句柄;枚举句柄,将当前枚举到的句柄复制到当前进程;打印枚举的句柄信息;(逻辑上应该没有什么问题)

第二种是Handle v4.22 - windows工具无源码。这是win文档中的一个小工具,可以个人使用,但是没有源码。看它的输出,大概的思路应该是:

总体是:和上面的区别不大。


小结

完整代码见:da1234cao/FreeFile
我对win编程不感冒,这个项目也非常简单,不涉及网络,多线程,数据库,图形界面等难点。
但它给我带来了编程中的两个组件:配置文件和日志,详见:

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐