施例,從所有啟動(dòng)的進(jìn)程中查找卸載進(jìn)程的父進(jìn)程,包括但不限于:
[0072]判斷所有啟動(dòng)的進(jìn)程中是否有系統(tǒng)進(jìn)程;
[0073]若所有啟動(dòng)的進(jìn)程中有系統(tǒng)進(jìn)程,則獲取系統(tǒng)進(jìn)程的命令行參數(shù);
[0074]若命令行參數(shù)為預(yù)設(shè)的命令行參數(shù),則將系統(tǒng)進(jìn)程作為查找到的卸載進(jìn)程的父進(jìn)程。
[0075]本發(fā)明實(shí)施例提供的方法以系統(tǒng)進(jìn)程為DllHost.exe為例進(jìn)行說(shuō)明。當(dāng)判斷所有啟動(dòng)的進(jìn)程中有DllHost.exe時(shí),判斷所有啟動(dòng)的進(jìn)程中有系統(tǒng)進(jìn)程,獲取DllHost.exe的命令行參數(shù);當(dāng)判斷獲取到的DllHost.exe的命令行參數(shù)為DllHost.exe/Processid: {FCC74B77-EC3E-4DD8-A80B-008A702075A9}時(shí),將系統(tǒng)進(jìn)程作為查找到的卸載進(jìn)程的父進(jìn)程。
[0076]其中,獲取系統(tǒng)進(jìn)程的命令行參數(shù)的過(guò)程包括但不限于:通過(guò)OpenProcess函數(shù)根據(jù)系統(tǒng)進(jìn)程的ID (Identificat1n,標(biāo)識(shí))打開(kāi)系統(tǒng)進(jìn)程,讀取系統(tǒng)進(jìn)程的peb信息,從peb中提取命令行參數(shù)。
[0077]由于從所有啟動(dòng)的進(jìn)程中查找到卸載進(jìn)程的父進(jìn)程,則可知監(jiān)控到有卸載進(jìn)程啟動(dòng)。在監(jiān)控到有卸載進(jìn)程啟動(dòng)后,本實(shí)施例提供的方法還監(jiān)控卸載進(jìn)程是否退出,包括但不限于:
[0078]獲取所有工作對(duì)象;
[0079]從所有工作對(duì)象中查找卸載進(jìn)程的父進(jìn)程對(duì)應(yīng)的工作對(duì)象;
[0080]若卸載進(jìn)程的父進(jìn)程對(duì)應(yīng)的工作對(duì)象完成,則監(jiān)控到有卸載進(jìn)程退出。
[0081]關(guān)于獲取所有工作對(duì)象的方式,本實(shí)施例不作具體限定。具體實(shí)施時(shí),可使用ntdll 的導(dǎo)出函數(shù) MyNtQuerySystemlnformat1n,并傳入 SystemHandlelnformat1n (值是十進(jìn)制的16)獲取所需要的空間,并分配獲取到的空間,再調(diào)用一次MyNtQuerySystemlnformat1n,從而枚舉所有工作對(duì)象,獲取所有工作對(duì)象。
[0082]在獲取到所有工作對(duì)象后,輪訓(xùn)每個(gè)工作對(duì)象,查找屬于卸載進(jìn)程的父進(jìn)程對(duì)應(yīng)的工作對(duì)象的句柄,請(qǐng)求復(fù)制一份,使用系統(tǒng)用來(lái)等待事件的API (例如,WaitForSingleObject)等待卸載進(jìn)程的父進(jìn)程的工作對(duì)象完成;當(dāng)該卸載進(jìn)程的父進(jìn)程對(duì)應(yīng)的工作對(duì)象完成時(shí),表明監(jiān)控到有卸載進(jìn)程退出。
[0083]通過(guò)監(jiān)控是否有卸載進(jìn)程啟動(dòng)及退出,使得對(duì)卸載的軟件進(jìn)行垃圾清除不受到卸載方式的影響,擴(kuò)展了對(duì)卸載的軟件進(jìn)行垃圾清除的應(yīng)用范圍,并且由于無(wú)需運(yùn)行軟件管理工具或軟件卸載工具卸載軟件,還可提高對(duì)卸載的軟件進(jìn)行垃圾清除的靈活性。當(dāng)監(jiān)控到有卸載進(jìn)程啟動(dòng)及退出時(shí),繼續(xù)執(zhí)行后續(xù)步驟202。
[0084]202:將卸載進(jìn)程對(duì)應(yīng)的軟件作為監(jiān)控到的進(jìn)行卸載的軟件;
[0085]由于監(jiān)控到有卸載進(jìn)程啟動(dòng)及退出,則表明卸載進(jìn)程對(duì)應(yīng)的軟件可能被卸載,將卸載進(jìn)程對(duì)應(yīng)的軟件作為監(jiān)控到的進(jìn)行卸載的軟件;又由于用戶可能在卸載過(guò)程中取消卸載,因此僅監(jiān)控到有卸載進(jìn)程啟動(dòng)及退出不能確定卸載進(jìn)程對(duì)應(yīng)的軟件是否被卸載。
[0086]通過(guò)上述步驟201至步驟202即完成了監(jiān)控進(jìn)行卸載的軟件,為了確定進(jìn)行卸載的軟件是否被卸載,本實(shí)施例提供的方法還包括后續(xù)步驟。
[0087]203:獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí),并將當(dāng)前所有已安裝軟件的標(biāo)識(shí)與保存的已安裝軟件的標(biāo)識(shí)進(jìn)行比較,得到第一比較結(jié)果;
[0088]為了確定進(jìn)行卸載的軟件是否被卸載,本實(shí)施例提供的方法通過(guò)監(jiān)控線程獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí),關(guān)于獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí)的方式可參照上述步驟201中獲取啟動(dòng)監(jiān)控線程時(shí)所有已安裝軟件的標(biāo)識(shí)的方式,此處不再贅述。
[0089]由于卸載的軟件對(duì)應(yīng)的注冊(cè)表會(huì)被刪除,則可將當(dāng)前所有已安裝軟件的標(biāo)識(shí)與保存的已安裝軟件的標(biāo)識(shí)進(jìn)行比較,得到第一比較結(jié)果。其中,保存的已安裝軟件的標(biāo)識(shí)包括但不限于啟動(dòng)監(jiān)控線程時(shí)獲取并保存的所有已安裝軟件的標(biāo)識(shí),第一比較結(jié)果包括但不限于標(biāo)識(shí)增加、標(biāo)識(shí)缺少及標(biāo)識(shí)不變。
[0090]204:根據(jù)第一比較結(jié)果判斷進(jìn)行卸載的軟件是否卸載完成;
[0091]在根據(jù)第一比較結(jié)果判斷進(jìn)行卸載的軟件是否卸載完成時(shí),如果上述步驟203中第一比較結(jié)果為標(biāo)識(shí)減少,則表明減少的標(biāo)識(shí)對(duì)應(yīng)的軟件所對(duì)應(yīng)的注冊(cè)表被刪除,減少的標(biāo)識(shí)對(duì)應(yīng)的軟件卸載完成,即根據(jù)第一比較結(jié)果判斷進(jìn)行卸載的軟件卸載完成;如果第一比較結(jié)果為標(biāo)識(shí)不變,則表明沒(méi)有軟件對(duì)應(yīng)的注冊(cè)表被刪除,沒(méi)有軟件完成卸載,即根據(jù)第一比較結(jié)果判斷進(jìn)行卸載的軟件未卸載完成;如果第一比較結(jié)果為標(biāo)識(shí)增加,則表明可能新安裝了軟件,即根據(jù)第一比較結(jié)果判斷進(jìn)行卸載的軟件未卸載完成。
[0092]進(jìn)一步地,通過(guò)上述步驟203至步驟204即完成了判斷進(jìn)行卸載的軟件是否卸載完成,若進(jìn)行卸載的軟件卸載完成,則繼續(xù)執(zhí)行后續(xù)步驟205。
[0093]205:掃描完成卸載的軟件殘留的垃圾文件,并刪除垃圾文件。
[0094]由于卸載軟件的過(guò)程中可能沒(méi)有將安裝目錄、快捷方式或注冊(cè)表鍵值等刪除,致使軟件卸載完成后,殘留垃圾文件。為了對(duì)卸載的軟件進(jìn)行垃圾清除,本發(fā)明實(shí)施例提供的方法在判斷進(jìn)行卸載的軟件完成卸載后,掃描完成卸載的軟件殘留的垃圾文件,并刪除垃圾文件。
[0095]關(guān)于掃描完成卸載的軟件殘留的垃圾文件的方式,本實(shí)施例不作具體限定。具體實(shí)施時(shí),可根據(jù)完成卸載的軟件的安裝目錄掃描完成卸載的軟件殘留的垃圾文件。在掃描到完成卸載的軟件殘留的垃圾文件后,可刪除垃圾文件,從而優(yōu)化系統(tǒng)。
[0096]本發(fā)明實(shí)施例提供的方法,通過(guò)監(jiān)控進(jìn)行卸載的軟件,并在判斷進(jìn)行卸載的軟件卸載完成后,掃描完成卸載的軟件殘留的垃圾文件,并刪除垃圾文件,從而使對(duì)卸載的軟件進(jìn)行垃圾清除不受到卸載方式的影響,提高了對(duì)卸載的軟件進(jìn)行垃圾清除的靈活性,擴(kuò)展了對(duì)卸載的軟件進(jìn)行垃圾清除的應(yīng)用范圍。
[0097]本發(fā)明實(shí)施例提供了一種對(duì)卸載的軟件進(jìn)行垃圾清除的方法,結(jié)合上述實(shí)施例的內(nèi)容,參見(jiàn)圖3,方法流程包括:
[0098]301:監(jiān)控注冊(cè)表鍵值的修改;
[0099]關(guān)于監(jiān)控注冊(cè)表鍵值的修改的方式,本實(shí)施例不作具體限定。具體實(shí)施時(shí),可啟動(dòng)一個(gè)后臺(tái)線程,將該后臺(tái)線程作為監(jiān)控線程,即啟動(dòng)監(jiān)控線程,通過(guò)監(jiān)控線程監(jiān)控注冊(cè)表鍵值的修改。
[0100]需要說(shuō)明的是,如果系統(tǒng)為64位,還需要同時(shí)監(jiān)控32位對(duì)應(yīng)鍵,可以使用系統(tǒng)提供的API中的RegNotifyChangeKeyValue對(duì)注冊(cè)表鍵值的修改進(jìn)行監(jiān)控。其中,注冊(cè)表鍵值的修改包括但不限于子鍵被刪除;32位對(duì)應(yīng)鍵為:
[0101]HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ffindows\CurrentVers1n\Uninstall ;
[0102]HKEY_CURRENT_USER\SOFTWARE\Microsoft\ffindows\CurrentVers1n\Uninstallο
[0103]當(dāng)通過(guò)監(jiān)控線程監(jiān)控到注冊(cè)表鍵值被修改時(shí),繼續(xù)執(zhí)行后續(xù)步驟302。
[0104]302:獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí);
[0105]本發(fā)明實(shí)施例提供的方法在監(jiān)控到注冊(cè)表鍵值被修改時(shí),觸發(fā)獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí),從而無(wú)需實(shí)時(shí)獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí),減少獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí)的次數(shù)。
[0106]關(guān)于獲取當(dāng)前所有已安裝軟件的標(biāo)識(shí)的方式可參照上一實(shí)施例中步驟201獲取啟動(dòng)監(jiān)控線程時(shí)所有已安裝軟件的標(biāo)識(shí)的方式,此處不再贅述。
[0107]303:將當(dāng)前所有已安裝軟件的標(biāo)識(shí)與保存的已安裝軟件的標(biāo)識(shí)進(jìn)行比較,得到第二比較結(jié)果;
[0108]該步驟的實(shí)現(xiàn)方式可參照上一實(shí)施例中步驟203將當(dāng)前所有已安裝軟件的標(biāo)識(shí)與保存的已安裝軟件的標(biāo)識(shí)進(jìn)行比較的方式,此處不再贅述。在將當(dāng)前所有已安裝軟件的標(biāo)識(shí)與保存的已安裝軟件的標(biāo)識(shí)進(jìn)行比較后,得到第二比較結(jié)果包括但不限于標(biāo)識(shí)增加、標(biāo)識(shí)缺少及標(biāo)識(shí)不變。
[0109]304:根據(jù)第二比較結(jié)果確定刪除的軟件,并將刪除的軟件作為監(jiān)控到的進(jìn)行卸載的軟件;
[0110]在根據(jù)第二比較結(jié)果確定刪除的軟件時(shí),如果上述步驟303中第二比較結(jié)果為標(biāo)識(shí)減少,則表明減少的標(biāo)識(shí)對(duì)應(yīng)的軟件可能被刪除,即將刪除的軟件作為監(jiān)控到的進(jìn)行卸載的軟件。
[0111]通過(guò)上述步驟301至步驟304即完成了監(jiān)控進(jìn)行卸載的軟件,為了確定進(jìn)行卸載的軟件是否被卸載,本實(shí)施例提供的方法還包括后續(xù)步驟。
[0112]305:查找進(jìn)行卸載的軟件的安裝目錄,并監(jiān)控安裝目錄的修改;
[0113]關(guān)于查找進(jìn)行卸載的軟件的安裝目錄的方式,本實(shí)施例不作具體限定。具體實(shí)施時(shí),如果在啟動(dòng)監(jiān)控線程時(shí),已獲取并保存所有已安裝軟件的安裝目錄,則可通過(guò)監(jiān)控線程在保存的所有已安裝軟件的安裝目錄中查找進(jìn)行卸載的軟件的安裝目錄。
[0114]作為一種可選實(shí)施例,在安裝目錄被刪除時(shí),可判斷安裝目錄被修改,則繼續(xù)執(zhí)行后續(xù)步驟306。由于軟件在卸載過(guò)程中,可能會(huì)殘留安裝目錄,則如果安裝目錄在預(yù)設(shè)時(shí)間內(nèi)沒(méi)有被修改,則可繼續(xù)執(zhí)行后續(xù)步驟306。關(guān)于預(yù)設(shè)時(shí)間的長(zhǎng)短,本實(shí)施例不作具體限定。
[0115]306:判斷進(jìn)行卸載的軟件對(duì)應(yīng)的卸載進(jìn)程是否退出;
[0116]為了確定進(jìn)行卸載的軟件是否卸載完成,本實(shí)施例提供的方法在監(jiān)控安裝目錄的被刪除或在預(yù)