一种用于解除文件占用的方法及装置的制作方法

文档序号:6377729阅读:138来源:国知局

专利名称::一种用于解除文件占用的方法及装置的制作方法
技术领域
:本发明涉及计算机
技术领域
,特别是涉及一种用于解除文件占用的方法。本发明还涉及一种用于解除文件占用的装置。
背景技术
:解除文件占用是目前一些安全软件提供的一项功能。由于文件在被进程调用后,将不能手动进行诸如删除改名等操作。利用这个功能可以解除进程对文件的占用,从而让用户可以执行删除文件、更改名称、移动位置等操作。现有视窗(window)操作系统下,一种解除文件占用的方法原理如下如果文件由某个进程打开,那么这个进程就拥有了它的句柄。使用函数ZwQuerySystemInformation()来枚举句柄,将每一个句柄都用DuplicateHandle进行复制,确定句柄属于哪个文件,如果是要找的文件,就将句柄拷贝,然后使用DuplicateHandle去关闭占用的句柄。上述的方法在实践中会遇到两处难点。第一,在对打开的命名管道(namedpipe)处理的句柄调用ZwQueryInformationFile()的时候,调用线程会等待pipe中的消息,而pipe中却可能没有消息,也就是说,调用ZwQueryInformationFile()的线程实际上永久性地挂起了。第二,在拷贝句柄后,两个句柄(我们进程的和打开文件进程的)将会指向同一个目标文件,从而文件当前的输入输出模式、在文件中的位置以及其它与文件相关的信息就会由两个进程来共享。这时,甚至只是读取文件(复制句柄或者原来句柄)都会引起读取位置的改变,从而破坏了打开文件程序的正常运行。虽然,上述的第一个难点可以通过如下方式解决,即目标文件的获取不用在挑选句柄的主线程中进行,而是启动独立的线程并设置一个超时时间来避免挂起。但是这种方法较为麻烦,而且效率低。上述的第二个难点,需要用停止占用文件进程的线程、拷贝文件或者重新启动占用文件的进程等方式来解决。但是这些方法不能用于许多情形,比如要在运行的系统中拷贝注册表文件,用这种方法就不会成功。因而使用上还是有局限性。
发明内容鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的用于解除文件占用的方法和相应的用于解除文件占用的装置。依据本发明的一个方面,提供了一种用于解除文件占用的方法,包括获取待解除占用的目标文件的所有文件句柄;获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。可选的,所述获取待解除占用的目标文件的所有文件句柄包括获取待解除占用的目标文件的路径;枚举系统打开的所有文件句柄;获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配;将匹配成功的文件句柄作为待解除占用的目标文件的句柄。可选的,所述枚举系统打开的所有文件句柄包括枚举系统的所有进程;犾取每一进程的私有句柄表;集合所有进程的私有句柄表,获得所有进程打开的句柄;在所述所有进程打开的句柄中找出所有的文件句柄。·可选的,所述枚举系统的所有进程至少包括如下步骤通过遍历活动进程链表中每一个进程在系统内核中所表示的数据结构,实现对活动进程的枚举,获得进程表。可选的,所述枚举系统打开的所有文件句柄包括,获取当前进程;获取该当前进程的私有句柄表;遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;对所有获得的进程获取其私有句柄表;集合所获取的私有句柄表,获得所有进程打开的句柄;在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述在所述所有进程打开的句柄中找出所有的文件句柄包括通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;在对象头中读取对象类型数据或者对象类型索引;根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型;筛选出类型为文件句柄的句柄。可选的,将文件句柄对象由进程的句柄表中移除方式包括路径擦除或路径更改。根据本发明的另一方面,还提供一种用于解除文件占用的装置,包括目标文件句柄获取单元,用于获取待解除占用的目标文件的所有文件句柄;进程句柄表获取单元,用于获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;文件句柄对象移除单元,用于将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;清零单元,用于将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。可选的,所述目标文件句柄获取单元包括路径获取单元,用于获取待解除占用的目标文件的路径;文件句柄枚举单元,用于枚举系统打开的所有文件句柄;匹配单元,用于获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配。可选的,所述文件句柄枚举单元还包括进程枚举单元,用于枚举系统的所有进程;私有句柄枚举单元,用于获取进程的私有句柄表;私有句柄表集合单元,用于集合所有进程的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述进程枚举单元包括进程遍历执行单元,用于遍历活动进程链表中每一个进程在系统内核中所表示的·数据结构;存储单元,用于存储获得的进程表。可选的,所述文件句柄枚举单元包括指定单元,用于指定当前任一进程;私有句柄枚举单元,用于获取当前进程的私有句柄表;句柄表链遍历执行单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;私有句柄表合并单元,用于集合所获取的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述文件句柄筛选单元还包括对象头确定单元;用于通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;对象类型或类型索引读取单元,用于在对象头中读取对象类型数据或者对象类型索引;判断单元,用于根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型;筛选单元,用于筛选出类型为文件句柄的句柄。可选的,所述文件句柄对象移除单元为文件路径擦除单元或路径更改单元。根据本发明提供的具体实施例,本发明公开了以下技术效果本发明的方法通过找到目标文件的文件句柄,并在句柄表中直接对文件句柄对象进行操作,将其由句柄表中移除,并将文件句柄对象的引用计数从系统中降为零,使得系统认为此对象已经没有任何其它进程所引用;从而达到解除文件被进程占用的目的;相对于
背景技术
中所述的解除文件占用的方法,本发明的方法不必复制句柄,从而也不存在调用ZwQueryInformationFile的线程被永久挂起的问题;其次,由于本发明的方法不必复制句柄,自然也不存在两个句柄(复制句柄和原句柄)同时指向同一目标文件的问题,则不存在由于两个进程中的某一个对文件进行操作而破坏打开文件正常运行的问题。上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中图I为本发明的一种用于解除文件占用的方法的实施例的流程图;图2为本发明的一种用于解除文件占用的装置的实施例的结构示意图。具体实施例方式下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。请参考图1,其为本发明的一种用于解除文件占用的方法的实施例的流程图。本实施例的方法包括如下步骤步骤100,获取待解除占用的目标文件的所有文件句柄。在Windows操作系统中,如果文件被某进程所打开,那么所述进程就拥有了该文件的句柄,该句柄指向所打开的文件。找到该进程,并解除该进程所拥有的指向该文件的句柄,则对该文件的修改、删除、保存等操作不再受该进程的限制。故首先需要在系统中通过枚举进程的方式获取所有与待解除占用的文件相关联的进程,并从该进程所拥有的所有句柄中找出文件句柄,才能解除该进程所拥有的该文件的句柄。本步骤中,所述获取待解除占用的目标文件的所有文件句柄包括:A、获取待解除占用的目标文件的路径、枚举系统打开的所有文件句柄;C、获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配;将匹配成功的文件句柄作为待解除占用的目标文件的句柄。具体而言,首先,获取待解除占用的目标文件的文件存放路径,这一步不难做到。接着,需要枚举系统打开的所有文件句柄。本实施例中列举两种实施方式来说明如何枚举系统打开的所有文件句柄。实施方式一blI,枚举系统的所有进程;bl2获取每一进程的私有句柄表;bl3集合所有进程的私有句柄表,获得所有进程打开的句柄;bl4在所述所有进程打开的句柄中找出所有的文件句柄。所述的枚举系统所有进程的方法有很多中,在这里列举其中的两种第一种方法,通过Windows系统的系统进程和线程对象句柄表(PspCidTable)枚举系统进程。其中,系统进程和线程对象句柄表(PspCidTable)是Windows系统中一种句柄表,其中存放的对象是系统中所有的进线程对象。因此只要能遍历这个PspCidTable句柄表,就可以遍历到系统的所有进程。不难理解,若欲通过PspCidTable来获取枚举进程,则首先需要获取PspCidTable,即定位到所述PspCidTablede的首地址。获取所述PspCidTablede的方法有很多种,在这里列举其中的一种通过函数PsLookupProcessThreadByCidO或者PsLookupProcessByProcessId()、PsLookupThreadByThreadIdO中特征搜索定位系统进程和线程对象句柄表。所谓内存特征搜索是指调用这些函数的时候会用到PspCidTable,但是个系统中的PspCidTable出现的地方不同,可以根据PspCidTable前后的特征来实现搜索。其中,所述特征搜索的特征串在不同的操作系统下有可能不同,Windows2000和2003中为0x35FF和0xe8,Win7中为0x3D8B和0xe8。当然,还可以通过其它方式获取PspCidTable,这里不再一一列举。PspCidtable为_Handle_Table结构,在windows2000系统中,其为固定的三层表结构,TableCode中记录着三层表即一级表(一级表也称为基本表,为最下层表)、二级表和三级表(为最上层表)的基地址。在上述的三层表中,上一层表中存放的地址指针指向与其临近的下一层地址,如三级表中存放的是指向二级表的指针,二级表中存放的是指向基本表的指针,在基本表中存放的才是指向进程对象或线程的指针。而在Windowsxp和Windows2003中,为了节省系统空间,采用了动态可扩展的三层表结构,当句柄数目较少时候仅仅采用基本表,当句柄数目较大时系统才会启用二级表,直至三级表。无论是上述的固定三层表结构还是动态可扩展的三层表结构,都需要根据每一层·表的基地址按照固定的步长遍历每一层存放的地址指针,方能获得该句柄表中所有句柄表项。只不过在动态可扩展的三层表结构中,首先需要判断其真正的句柄表层数是多少,然后再根据该实际的句柄表层数执行相应个层的遍历。其中,在动态可扩展的三层表中,TableCode的后两位是判断句柄表层数的依据,后两位是00则是一层表结构,后两位是01则是两层表结构,后两位是10则是三层表结构。如上所述,在PspCidTable句柄表中,存放的是系统进程和线程的对象句柄。通过遍历能够获得基层表中记录的指向对象指针,但是该指针是指向对象体的,无法判断其是进程还是线程。故还需要通过偏移获取类型为_0BJECT_HEADER的、指向对象头的指针,并由对象头指针中读出其指针类型,方能确定指针指向的是进程还是线程。选出类型为进程的对象头指针,与该对象头指针相应的对象体指针即为进程对象头指针,通过所述进程对象头指针,既可以获得相应的进程。遍历该PspCidTable句柄表,即可获得该句柄表中记录的所述进程,即获得所有进程对象的数据结构_EPR0CESS。本实施例中通过如下方式判断对象头指针中类型为进程的指针类型信息,即通过PsGetCurrentProcessO或IoGetCurrentProcessO等函数获取当前进程,由该当前进程的对象体指针偏移获取其对象头指针;在该对象头指针中读取其指针类型信息。所述枚举系统进程的第二种方法如下首先,获取当前进程的指针,例如可以通过PsGetCurrentProcessO来获取当前进程的PEPR0CESS指针。然后定位到记录该当前进程与其它进程链接信息的Activelist处,具体的操作方式为ActiveList=pCurrentEprocess+0x88,即当前进程指针移动一定的步长。其中0x88为Winxpsp3下Activelist与pCurrentEprocess的步长,在不同win操作系统时该步长并不相同。接着,以所定位的当前进程的Activelist遍历整个进程活动链表(Activelistlink)上每一进程的数据结构,即可获得当前的存在于进程活动链表的所有进程。上述列举了枚举系统进程的两种方法,但并非穷举,任何能够用于枚举系统进程的方法均可应用于此。对于枚举出的每一进程,获取其私有句柄表。获取方式为进程的EPR0CESS首地址偏移固定的步长。以WindowsXP为例,偏移步长为0xc4(十六进制)。在WindowsXP中,对于任何的进程而言,指针pCurrentProcess与私有句柄表之间的偏移步长均为0xc4(十六进制)。在其它不同版本的window系统中,例如window2000、vista、win7等,偏移步长则有所不同,本领域技术人员可以根据各个windows的版本获得相应的步长。将所有进程的私有句柄表集合,获得进程打开的所有句柄。并通过如下方式由所述句柄中找出所有的文件句柄通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;在对象头中读取对象类型数据或者对象类型索引;根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型;筛选出类型为文件句柄的句柄。实施方式之二b21、获取当前进程山22、获取该当前进程的私有句柄表山23、遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;b24、对所有获得的进程获取其私有句柄表山25、集合所获取的私有句柄表,获得所有进程打开的句柄山26、在所述所有进程打开的句柄中找出所有的文件句柄。具体而言,在windows系统中,每一个进程都有一个句柄表(handletable),该句柄表称为进程的私有句柄表。所述进程的私有句柄表是一f_HANDLE_TABLE结构,系统中所有进程的私有句柄表以双向链表的形式链接在一起。故若获取当前进程的私有句柄表,并按照一定的步长遍历所述双向链表,即可获得所有进程的私有句柄表。所述获取当前进程的私有句柄表的一种具体实现方式如下a,获取指向当前进程的指针山,由所述当前进程的指针偏移获得当前进程的私有句柄表指针;c,根据所述当前进程的私有句柄表指针定位到该当前进程的私有句柄表。具体的,可以通过PsGetCurrentProcessO或IoGetCurrentProcessO获得当前进程的指针。在windows系统中,由于受调度资源的限制,同一进程在执行时也会被划分到不同的时间段部分的执行,不同的进程在执行时穿插在一起,固在某一时间区间内,可能有多个进程在同时进行。而在某一时间点上,在多数情形下正在执行的是一个进程(当然也不排除在包括中央处理单元、内存等系统资源充裕的情况下,两个或两个以上的进程并行运行)。通过所述PsGetCurrentProcess()或IoGetCurrentProcess()函数即可得到在调用函数时刻指向正在运行的进程的指针,即指向当前进程的进程结构体_EPR0CESS的指针pCurrentProcess。本实施例中当前进程即指调用所述函数时刻正在运行的进程。所述获得的当前进程可以是windows系统中的任何进程,在获得指向当前任一进程的指针pCurrentProcess后,将所述指针偏移固定的步长,可得到该当前任一进程的私有句柄表。如上所述,在windowsXP系统中,指向当前进程的指针pCurrentProcess偏移0xc4(十六进制),即可得到所述当前进程的私有句柄表,即pHandleTable=pCurrentProcess+0xc4,在Window2000、vista、Win7等系统中,偏移步长则有所不同,本领域技术人员可以根据各个Windows的版本获得相应的步长。根据所述当前进程的私有句柄表指针即可定位到该当前进程的私有句柄表。如如所述,windows系统中,系统中所有进程的私有句柄表以双向链表的形式链接在一起。进程的私有句柄表为_HANDLE_TABLE结构,对于任一句柄表,由pHandleTable偏移Oxlc(十六进制)即可指向其类型为_LIST_ENTRY的成员变量HandleTableList,即句柄表链。每一个HandleTableList都具有Flink和Blink两个成员,Flink成员是一个向前链接,指向下一个_LIST_ENTRY结构;Blink成员则是一个向后链接,指向前一个LIST_ENTRY结构。整个链表形成封闭环形,也就是说,最后一个Flink指向链表中的第一个LIST_ENTRY结构,而第一个Blink则指向最后一个。系统内所有进程的句柄表都是通过_LIST_ENTRY类型的双向链表链接起来的。故按照一定的步长遍历该双向链表,即可获得系统中所有的进程。在遍历所述双向链表时,可以在前述获得的当前进程的私有句柄表基础上,向前或者向后偏移一定的步长(所述偏移的步长根据win系统的版本而确定)获得相邻的HandleTableList,并对每一次偏移获得的HandleTableList的地址偏移-Oxlc(十六进制)即获得其所在的私有句柄表的pHandleTable;也就是获得了HandleTableList所在的私有句柄表。通过遍历可获得所有进程的私有表,集合所述的私有句柄表,获得所有进程所打开的句柄后,可以通过上述实施例一种所描述的方式可找出所有的文件句柄。对所找出的所有文件句柄,获取其对应的文件的具体路径,并与待解除占用的目标文件的路径进行匹配,其中,匹配的方式只是简单的路径字符串的对比,对比时不区分大·小写。若文件句柄的具体路径与待解除占用的目标文件的路径相同,则匹配成功,将匹配成功的文件句柄作为待解除占用的目标文件的句柄。步骤110,获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表。如上所述,文件句柄通过枚举系统进程的方法由进程的私有句柄表中获得,自然,通过文件句柄亦可知其所在的私有句柄表和进程。步骤120,将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除。获取打开该文件的所有进程以及其私有句柄表之后,可直接由其私有句柄表中移除。步骤130,将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。移除之后的文件句柄对象仍然存在于内存中,这时候需要把这个文件句柄对象的引用计数从系统(内存)中降为零,这样使得系统认为此对象已经没有任何其他进程所引用了。本实施例的方法通过找到目标文件的文件句柄,并在句柄表中直接对文件句柄对象进行操作,将其由句柄表中移除,并将文件句柄对象的引用计数从系统中降为零,使得系统认为此对象已经没有任何其它进程所引用;从而达到解除文件被进程占用的目的;相对于
背景技术
中所述的解除文件占用的方法,本发明的方法不必复制句柄,从而也不存在调用ZwQueryInformationFile的线程被永久挂起的问题;其次,由于本发明的方法不必复制句柄,自然也不存在两个句柄(复制句柄和原句柄)同时指向同一目标文件的问题,则不存在由于两个进程中的某一个对文件进行操作而破坏打开文件正常运行的问题。以上公开了本发明的用于解除文件占用的方法的实施例,与此相应的,本发明还公开了一种用于解除文件占用的装置。请参考图2,其为本发明的一种用于解除文件占用的装置的实施例的示意图。由于该装置的实施例与前述的方法的实施例基本相同,下面仅简单描述本实施例中的装置。本发明的一种用于解除文件占用的装置的实施例,包括目标文件句柄获取单元200,用于获取待解除占用的目标文件的所有文件句柄;进程句柄表获取单元202,用于获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;文件句柄对象移除单元204,用于将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;清零单元206,用于将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。可选的,所述目标文件句柄获取单元200包括路径获取单元,用于获取待解除占用的目标文件的路径文件句柄枚举单元,用于枚举系统打开的所有文件句柄匹配单元,用于获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配。可选的,,所述文件句柄枚举单元还包括进程枚举单元,用于枚举系统的所有进程;私有句柄枚举单元,用于获取进程的私有句柄表;私有句柄表集合单元,用于集合所有进程的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述进程枚举单元包括进程遍历执行单元,用于遍历活动进程链表中每一个进程在系统内核中所表示的数据结构;存储单元,用于存储获得的进程表。可选的,所述文件句柄枚举单元包括指定单元,用于指定当前任一进程;私有句柄枚举单元,用于获取当前进程的私有句柄表;句柄表链遍历执行单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;私有句柄表合并单元,用于集合所获取的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。可选的,所述文件句柄筛选单元还包括对象头确定单元;用于通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;对象类型或类型索引读取单元,用于在对象头中读取对象类型数据或者对象类型索引;判断单元,用于根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型筛选单元,用于筛选出类型为文件句柄的句柄。可选的,所述文件句柄对象移除单元为文件路径擦除单元或路径更改单元。应用本发明实施例的装置可获得与上述方法实施例相同的技术效果,这里不再赘述。本申请可以应用于计算机系统/服务器,其可与众多其它通用或专用计算系统环境或配置一起操作。适于与计算机系统/服务器一起使用的众所周知的计算系统、环境和/或配置的例子包括但不限于个人计算机系统、服务器计算机系统、瘦客户机、厚客户机、手持或膝上设备、基于微处理器的系统、机顶盒、可编程消费电子产品、网络个人电脑、小型计算机系统、大型计算机系统和包括上述任何系统的分布式云计算技术环境,等等。计算机系统/服务器可以在由计算机系统执行的计算机系统可执行指令(诸如程序模块)的一般语境下描述。通常,程序模块可以包括例程、程序、目标程序、组件、逻辑、数据结构等等,它们执行特定的任务或者实现特定的抽象数据类型。计算机系统/服务器可以在分布式云计算环境中实施,分布式云计算环境中,任务是由通过通信网络链接的远程处理设备执行的。在分布式云计算环境中,程序模块可以位于包括存储设备的本地或远程计算系统存储介质上。在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的用于解除文件占用的装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。权利要求1.一种用于解除文件占用的方法,包括获取待解除占用的目标文件的所有文件句柄;获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。2.根据权利要求I所述的用于解除文件占用的方法,所述获取待解除占用的目标文件的所有文件句柄包括获取待解除占用的目标文件的路径;枚举系统打开的所有文件句柄;获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配;将匹配成功的文件句柄作为待解除占用的目标文件的句柄。3.根据权利要求2所述的用于解除文件占用的方法,所述枚举系统打开的所有文件句柄包括枚举系统的所有进程;获取每一进程的私有句柄表;集合所有进程的私有句柄表,获得所有进程打开的句柄;在所述所有进程打开的句柄中找出所有的文件句柄。4.根据权利要求3所述的用于解除文件占用的方法,所述枚举系统的所有进程至少包括如下步骤通过遍历活动进程链表中每一个进程在系统内核中所表示的数据结构,实现对活动进程的枚举,获得进程表。5.根据权利要求2所述的用于解除文件占用的方法,所述枚举系统打开的所有文件句柄包括,获取当前进程;获取该当如进程的私有句柄表;遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;对所有获得的进程获取其私有句柄表;集合所获取的私有句柄表,获得所有进程打开的句柄;在所述所有进程打开的句柄中找出所有的文件句柄。6.根据权利要求3或5所述的用于解除文件占用的方法,所述在所述所有进程打开的句柄中找出所有的文件句柄包括通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;在对象头中读取对象类型数据或者对象类型索引;根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型;筛选出类型为文件句柄的句柄。7.根据权利要求I所述的用于解除文件占用的方法,将文件句柄对象由进程的句柄表中移除方式包括路径擦除或路径更改。8.一种用于解除文件占用的装置,包括目标文件句柄获取单元,用于获取待解除占用的目标文件的所有文件句柄;进程句柄表获取单元,用于获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;文件句柄对象移除单元,用于将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;清零单元,用于将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。9.根据权利要求8所述的用于解除文件占用的装置,所述目标文件句柄获取单元包括路径获取单元,用于获取待解除占用的目标文件的路径;文件句柄枚举单元,用于枚举系统打开的所有文件句柄;匹配单元,用于获取所有文件句柄对应文件的具体路径,并与待解除占用的目标文件的路径进行匹配。10.根据权利要求9所述的用于解除文件占用的装置,所述文件句柄枚举单元还包括进程枚举单元,用于枚举系统的所有进程;私有句柄枚举单兀,用于获取进程的私有句柄表;私有句柄表集合单元,用于集合所有进程的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。11.根据权利要求10所述的用于解除文件占用的装置,所述进程枚举单元包括进程遍历执行单元,用于遍历活动进程链表中每一个进程在系统内核中所表示的数据结构;存储单元,用于存储获得的进程表。12.根据权利要求9所述的用于解除文件占用的装置,所述文件句柄枚举单元包括指定单元,用于指定当前任一进程;私有句柄枚举单兀,用于获取当如进程的私有句柄表;句柄表链遍历执行单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程;私有句柄表合并单元,用于集合所获取的私有句柄表,获得所有进程打开的句柄;文件句柄筛选单元,用于在所述所有进程打开的句柄中找出所有的文件句柄。13.根据权利要求10或12所述的用于解除文件占用的装置,所述文件句柄筛选单元还包括对象头确定单元;用于通过内存偏移找到各进程打开的每一句柄的句柄对象的对象头;对象类型或类型索引读取单元,用于在对象头中读取对象类型数据或者对象类型索弓I;判断单元,用于根据对象头中对象类型数据或者对象类型索引指向的对象类型数据判断句柄类型;筛选单元,用于筛选出类型为文件句柄的句柄。14.根据权利要求9所述的用于解除文件占用的装置,所述文件句柄对象移除单元为文件路径擦除单元或路径更改单元。全文摘要本发明公开了一种用于解除文件占用的方法,包括获取待解除占用的目标文件的所有文件句柄;获取所述待解除占用的目标文件的所有文件句柄各自所属的进程私有句柄表;将所述目标文件的所有文件句柄的文件句柄对象由各自的进程私有句柄表中移除;将所述目标文件的所有文件句柄的文件句柄对象的引用计数从系统中清零。本发明同时还公开了一种用于解除文件占用的装置。本发明解除文件占用时不必复制句柄,不会破坏被打开文件的正常运行。文档编号G06F17/30GK102902765SQ20121036192公开日2013年1月30日申请日期2012年9月25日优先权日2012年9月25日发明者张辉申请人:北京奇虎科技有限公司,奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1