本发明专利技术公开了一种用于解除文件占用的方法,包括:获取待解除占用的目标文件的所有文件句柄;获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。本发明专利技术同时还公开了一种用于解除文件占用的装置。本发明专利技术解除文件占用时不必复制句柄,不会破坏被打开文件的正常运行。
【技术实现步骤摘要】
本专利技术涉及计算机
,特别是涉及一种用于解除文件占用的方法。本专利技术还涉及一种用于解除文件占用的装置。
技术介绍
解除文件占用是目前一些安全软件 提供的一项功能。由于文件在被进程调用后,将不能手动进行诸如删除改名等操作。利用这个功能可以解除进程对文件的占用,从而让用户可以执行删除文件、更改名称、移动位置等操作。现有视窗(window)操作系统下,一种解除文件占用的方法原理如下如果文件由某个进程打开,那么这个进程就拥有了它的句柄。使用函数ZwQuerySystemInformation()来枚举句柄,将每一个句柄都用DuplicateHandle进行复制,确定句柄属于哪个文件,如果是要找的文件,就将句柄拷贝,然后使用DuplicateHandle去关闭占用的句柄。上述的方法在实践中会遇到两处难点。第一,在对打开的命名管道(named pipe)处理的句柄调用ZwQueryInformationFile ()的时候,调用线程会等待pipe中的消息,而pipe中却可能没有消息,也就是说,调用ZwQueryInformationFile ()的线程实际上永久性地挂起了。第二,在拷贝句柄后,两个句柄(我们进程的和打开文件进程的)将会指向同一个目标文件,从而文件当前的输入输出模式、在文件中的位置以及其它与文件相关的信息就会由两个进程来共享。这时,甚至只是读取文件(复制句柄或者原来句柄)都会引起读取位置的改变,从而破坏了打开文件程序的正常运行。虽然,上述的第一个难点可以通过如下方式解决,即目标文件的获取不用在挑选句柄的主线程中进行,而是启动独立的线程并设置一个超时时间来避免挂起。但是这种方法较为麻烦,而且效率低。上述的第二个难点,需要用停止占用文件进程的线程、拷贝文件或者重新启动占用文件的进程等方式来解决。但是这些方法不能用于许多情形,比如要在运行的系统中拷贝注册表文件,用这种方法就不会成功。因而使用上还是有局限性。
技术实现思路
鉴于上述问题,提出了本专利技术以便提供一种克服上述问题或者至少部分地解决上述问题的用于解除文件占用的方法和相应的用于解除文件占用的装置。依据本专利技术的一个方面,提供了一种用于解除文件占用的方法,包括获取待解除占用的目标文件的所有文件句柄;获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。可选的,所述获取待解除占用的目标文件的所有文件句柄包括获取待解除占用的目标文件的路径;枚举系统打开的所有文件句柄;获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配;将匹配成功的文件句柄作为待解除占用的目标文件的句柄。可选的,所述枚举系统打开的所有文件句柄包括枚举系统的所有进程;犾取每一进程的私有句柄表;集合所有进程的私有句柄表,获得所有进程打开的句柄;在所述所有进程打开的句柄中找出所有的文件句柄。·可选的,所述枚举系统的所有进程至少包括如下步骤通过遍历活动进程链表中每一个进程在系统内核中所表示的数据结构,实现对活动进程的枚举,获得进程表。可选的,所述枚举系统打开的所有文件句柄包括,获取当前进程;获取该当前进程的私有句柄表;遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;对所有获得的进程获取其私有句柄表;集合所获取的私有句柄表,获得所有进程打开的句柄;在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述在所述所有进程打开的句柄中找出所有的文件句柄包括通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;在对象头中读取对象类型数据或者对象类型索引;根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型;筛选出类型为文件句柄的句柄。可选的,将文件句柄对象由进程的句柄表中移除方式包括路径擦除或路径更改。根据本专利技术的另一方面,还提供一种用于解除文件占用的装置,包括目标文件句柄获取单元,用于获取待解除占用的目标文件的所有文件句柄;进程句柄表获取单元,用于获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;文件句柄对象移除单元,用于将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;清零单元,用于将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。可选的,所述目标文件句柄获取单元包括路径获取单元,用于获取待解除占用的目标文件的路径;文件句柄枚举单元,用于枚举系统打开的所有文件句柄;匹配单元,用于获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配。可选的,所述文件句柄枚举单元还包括进程枚举单元,用于枚举系统的所有进程;私有句柄枚举单元,用于获取进程的私有句柄表;私有句柄表集合单元,用于集合所有进程的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述进程枚举单元包括进程遍历执行单元,用于遍历活动进程链表中每一个进程在系统内核中所表示的·数据结构;存储单元,用于存储获得的进程表。可选的,所述文件句柄枚举单元包括指定单元,用于指定当前任一进程;私有句柄枚举单元,用于获取当前进程的私有句柄表;句柄表链遍历执行单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;私有句柄表合并单元,用于集合所获取的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述文件句柄筛选单元还包括对象头确定单元;用于通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;对象类型或类型索引读取单元,用于在对象头中读取对象类型数据或者对象类型索引;判断单元,用于根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型;筛选单元,用于筛选出类型为文件句柄的句柄。可选的,所述文件句柄对象移除单元为文件路径擦除单元或路径更改单元。根据本专利技术提供的具体实施例,本专利技术公开了以下技术效果本专利技术的方法通过找到目标文件的文件句柄,并在句柄表中直接对文件句柄对象进行操作,将其由句柄表中移除,并将文件句柄对象的引用计数从系统中降为零,使得系统认为此对象已经没有任何其它进程所引用;从而达到解除文件被进程占用的目的;相对于
技术介绍
中所述的解除文件占用的方法,本专利技术的方法不必复制句柄,从而也不存在调用ZwQueryInformationFile的线程被永久挂起的问题;其次,由于本专利技术的方法不必复制句柄,自然也不存在两个句柄(复制句柄和原句柄)同时指向同一目标文件的问题,则不存在由于两个进程中的某一个对文件进行操作而破坏打开文件正常运行的问题。上述说明仅是本专利技术技术方案的概述,为了能够更清楚了解本专利技术的技术手段,而可依照说明书的内容予以实施,并且为了让本专利技术的上述和其它目的、特征和优点能够更明显易懂,以下特举本专利技术的具体实施方式。附图说明通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本专利技术的限制。而且在整个附图中本文档来自技高网...
【技术保护点】
一种用于解除文件占用的方法,包括:获取待解除占用的目标文件的所有文件句柄;获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。
【技术特征摘要】
1.一种用于解除文件占用的方法,包括 获取待解除占用的目标文件的所有文件句柄; 获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表; 将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除; 将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。2.根据权利要求I所述的用于解除文件占用的方法,所述获取待解除占用的目标文件的所有文件句柄包括 获取待解除占用的目标文件的路径; 枚举系统打开的所有文件句柄; 获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配; 将匹配成功的文件句柄作为待解除占用的目标文件的句柄。3.根据权利要求2所述的用于解除文件占用的方法,所述枚举系统打开的所有文件句柄包括 枚举系统的所有进程; 获取每一进程的私有句柄表; 集合所有进程的私有句柄表,获得所有进程打开的句柄; 在所述所有进程打开的句柄中找出所有的文件句柄。4.根据权利要求3所述的用于解除文件占用的方法,所述枚举系统的所有进程至少包括如下步骤 通过遍历活动进程链表中每一个进程在系统内核中所表示的数据结构,实现对活动进程的枚举,获得进程表。5.根据权利要求2所述的用于解除文件占用的方法,所述枚举系统打开的所有文件句柄包括, 获取当前进程; 获取该当如进程的私有句柄表; 遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程; 对所有获得的进程获取其私有句柄表; 集合所获取的私有句柄表,获得所有进程打开的句柄; 在所述所有进程打开的句柄中找出所有的文件句柄。6.根据权利要求3或5所述的用于解除文件占用的方法,所述在所述所有进程打开的句柄中找出所有的文件句柄包括 通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头; 在对象头中读取对象类型数据或者对象类型索引; 根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型; 筛选出类型为文件句柄的句柄。7.根据权利要求I所述的用于解除文件占用的方法,将文件句柄对象由进程的句柄表中移除方式包括路径擦除或路径更改。8.一种用于解除文件占用的装置,包括 目标文件句柄获取单元,用于获取待解除占用的目标文件的所有文件句柄; 进程句柄表获取单元,用于获取...
【专利技术属性】
技术研发人员:张辉,
申请(专利权)人:北京奇虎科技有限公司,奇智软件北京有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。