專利名稱:用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及管理由計算機對軟件應(yīng)用程序的執(zhí)行,并且特別涉及用于降低在不同的應(yīng)用程序之間和由相同的計算機系統(tǒng)執(zhí)行的相同應(yīng)用程序的單獨用戶之間的兼容性并且和社交性問題的方法和設(shè)備。
背景技術(shù):
計算機軟件應(yīng)用程序,在執(zhí)行和安裝期間,充分利用由計算機的操作系統(tǒng)提供的各種本機資源。傳統(tǒng)的單用戶計算機描繪在圖1A中。如圖1A所示的,操作系統(tǒng)100提供的本機資源可能包括文件系統(tǒng)102,注冊表數(shù)據(jù)庫104和對象106。文件系統(tǒng)102為應(yīng)用程序提供打開、創(chuàng)建、讀取、拷貝、修改和刪除數(shù)據(jù)文件150、152的機制。數(shù)據(jù)文件150,152可以被在目錄160、162的邏輯分層結(jié)構(gòu)中編組在一起。注冊表數(shù)據(jù)庫104存儲關(guān)于在物理上附聯(lián)到計算機的硬件、哪些系統(tǒng)選項已經(jīng)被選擇、計算機存儲器怎樣設(shè)立、應(yīng)用程序?qū)S脭?shù)據(jù)的各種項目以及當(dāng)操作系統(tǒng)100被起動之時應(yīng)該存在什么應(yīng)用程序的信息。如圖1A所示的,注冊表數(shù)據(jù)庫104被公共地組織在″鍵″170、172的邏輯分層結(jié)構(gòu),″鍵″170,172是注冊表值的容器。操作系統(tǒng)100還可以提供多個多個通信和同步對象106,包括信號量,分段,互斥體,定時器,變異株(mutant)以及管道。通過操作系統(tǒng)100而變?yōu)榭捎玫奈募到y(tǒng)102、注冊表數(shù)據(jù)庫104、對象106以及任何其他本機資源一起在貫穿本文獻自始至終都將被稱為″系統(tǒng)層″108。由系統(tǒng)層108提供的資源對于任何應(yīng)用程序或者系統(tǒng)程序112、114都是可用的。
然而,當(dāng)試圖去執(zhí)行或者安裝兩個不兼容應(yīng)用程序112,114之時,就會出現(xiàn)問題。如圖1A所示的,兩個應(yīng)用程序APP1 112和APP2 114,在操作系統(tǒng)100的“頂上”執(zhí)行,也就是說,所述應(yīng)用程序充分利用由操作系統(tǒng)提供來訪問本機資源的函數(shù)。當(dāng)所述應(yīng)用程序在執(zhí)行期間或者在安裝過程期間以相互排斥的方式充分利用本機資源102,104,106之時,就說所述應(yīng)用程序相互之間是不兼容的。APP1 112可能需要或者可能嘗試去安裝,位于路徑名為c:\windows\system32\msvcrt.dll的文件,并且APP2 114可能需要或者可能嘗試去安裝位于相同路徑名的第二不同文件。在此情況下,APP1 112和APP2 114無法在相同的計算機上加以執(zhí)行,就說它們相互之間是不兼容的。對于其他本機資源,也可能會遇到類似的問題。這對于需要在相同操作系統(tǒng)100環(huán)境中一起安裝或者執(zhí)行APP1 112和APP2 114這二者的計算機用戶而言,再怎么好也是不方便的。
圖1B描繪了支持代表若干用戶并發(fā)執(zhí)行的應(yīng)用程序112,114,112′,114′的多用戶計算機系統(tǒng)。如圖1B所示的,APP1的第一實例112和APP2的第一實例114在第一用戶會話的上下文110中執(zhí)行,APP1的第二實例112′在第二用戶會話的上下文120中執(zhí)行,并且APP2的第二實例114′在第三用戶會話的上下文130中執(zhí)行。在此環(huán)境中,如果APP1的兩個實例112,112′和APP2的兩個實例114,114′充分利用本機資源102,104,106,就好像只有單個用戶執(zhí)行所述應(yīng)用程序一樣,在此時就會出現(xiàn)問題。例如,APP1 112可以把應(yīng)用程序?qū)S脭?shù)據(jù)存儲在注冊表鍵170中。當(dāng)在第一用戶上下文110中執(zhí)行的APP1的第一實112和在第二用戶上下文120中執(zhí)行的APP1 1第二實例112′的都試圖去把配置數(shù)據(jù)存儲到相同的注冊表鍵170之時,就將會為一個用戶存儲不正確的配置數(shù)據(jù)。對于其他本機資源,也會發(fā)生類似的問題。
本發(fā)明致力于解決這些應(yīng)用程序的兼容性和社交性問題。
發(fā)明內(nèi)容
本發(fā)明允許在單個計算機上安裝和執(zhí)行相互不兼容的應(yīng)用程序和相同應(yīng)用程序的不兼容版本。除此之外,它還允許在多用戶計算機上安裝和執(zhí)行曾為單用戶計算機所創(chuàng)建的或者曾在不考慮當(dāng)在多用戶計算機執(zhí)行之時出現(xiàn)的那些問題的情況下所創(chuàng)建的程序。所描述的方法和設(shè)備可應(yīng)用于單用戶計算環(huán)境,所述單用戶計算環(huán)境包括多個用戶可以相繼地使用單個計算機的環(huán)境以及多個用戶并發(fā)地使用單個計算機的多用戶計算環(huán)境。本發(fā)明虛擬化對本機資源(諸如文件系統(tǒng),注冊表數(shù)據(jù)庫,系統(tǒng)對象,窗口類和窗口名稱)的用戶和應(yīng)用程序訪問,而不用修改應(yīng)用程序或者基礎(chǔ)的操作系統(tǒng)。除此之外,虛擬化的本機資源可以按照本機格式存儲(也就是說,虛擬化的文件被存儲在文件系統(tǒng)中,虛擬化的注冊表條目被存儲在注冊表數(shù)據(jù)庫中,等等),這樣就允許查看和管理虛擬化的資源能夠使用標(biāo)準(zhǔn)工具和技術(shù)來實現(xiàn)。
在一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求由在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行的進程接收。確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求被重定向到所確定的位置。使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
在另一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求被接收。在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行的進程確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求被重定向到所確定的位置。使用駐留在所確定位置中的資源的實例來應(yīng)答對資源的請求。
在再一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求被接收。確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行的進程把對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。使用駐留在所確定的位置中的資源的實例來應(yīng)答對資源的請求。
在再又一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求被接收。確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求被重定向到所確定的位置。在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行的進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
在一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行并且接收對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。第二進程確定該資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。第三進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。第四進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
在另一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程接收對該資源和與該資源相關(guān)聯(lián)標(biāo)識符的請求。第二進程在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行并且確定該資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。第三進程把對該資源和與該資源相關(guān)聯(lián)標(biāo)識符的請求重定向到所確定位置。第四進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
在再一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程接收對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。第二進程確定該資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。第三進程在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行并且把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。第四進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
在再又一個方面中,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程接收對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。第二進程確定該資源駐留在應(yīng)用程序隔離環(huán)境之外的位置。第三進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。第四進程在應(yīng)用程序隔離環(huán)境之內(nèi)執(zhí)行并且使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
在一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求由在應(yīng)用程序隔離環(huán)境之外執(zhí)行的進程接收。確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
在另一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。在應(yīng)用程序隔離環(huán)境之外執(zhí)行的進程確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
在又一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求被接收。確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。在應(yīng)用程序隔離環(huán)境之外執(zhí)行的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
在再又一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法。接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。在應(yīng)用程序隔離環(huán)境之外執(zhí)行的進程使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
在一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程在應(yīng)用程序隔離環(huán)境之外執(zhí)行并且接收對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。第二進程確定該資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。第三進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。第四進程使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
在另一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程接收對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。第二進程在應(yīng)用程序隔離環(huán)境之外執(zhí)行并且確定該資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。第三進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。第四進程使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
在又一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程接收對對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。第二進程確定該資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。第三進程在應(yīng)用程序隔離環(huán)境之外執(zhí)行并且把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。第四進程使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
在再又一個方面,本發(fā)明涉及一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),包括資源,第一進程,第二進程,第三進程和第四進程。第一進程接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。第二進程確定該資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi)。第三進程把對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。第四進程在應(yīng)用程序隔離環(huán)境之外執(zhí)行并且使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
在一個方面,本發(fā)明涉及一種把應(yīng)用程序與隔離環(huán)境相關(guān)聯(lián)的方法。請求的應(yīng)用程序的位置被獲得。在請求的應(yīng)用程序和應(yīng)用程序隔離環(huán)境之間的關(guān)聯(lián)被創(chuàng)建。該關(guān)聯(lián)被存儲。把所請求的應(yīng)用程序啟動到應(yīng)用程序隔離環(huán)境之中。
在一個實施例中,獲得所請求的應(yīng)用程序的位置包括定位在第二應(yīng)用程序隔離環(huán)境上的所請求的應(yīng)用程序。在另一實施例中,把該關(guān)聯(lián)創(chuàng)建在所請求的應(yīng)用程序和第二應(yīng)用程序隔離環(huán)境之間。
在另一個方面,本發(fā)明涉及一種用于把應(yīng)用程序與隔離環(huán)境相關(guān)聯(lián)的環(huán)境,包括應(yīng)用程序隔離環(huán)境,重定向器和關(guān)聯(lián)。該應(yīng)用程序隔離環(huán)境包括應(yīng)用程序隔離范圍和用戶隔離范圍。該重定向器獲得由代表用戶執(zhí)行的進程所做出的對該應(yīng)用程序的請求,獲得該請求的應(yīng)用程序所駐留在的位置,并且把來自所確定的位置的所請求的應(yīng)用程序啟動到應(yīng)用程序隔離環(huán)境之中。在所請求的應(yīng)用程序和應(yīng)用程序隔離環(huán)境之間的關(guān)聯(lián)由重定向器來維持。
在一個實施例中,該重定向器駐留在應(yīng)用程序隔離環(huán)境上。在另一實施例中,該重定向器定位在第二應(yīng)用程序隔離環(huán)境上的所請求的應(yīng)用程序。在又一個實施例中,該重定向器查閱在所請求的應(yīng)用程序和所請求的應(yīng)用程序所駐留在的位置之間的存儲的關(guān)聯(lián),用以確定所請求的應(yīng)用程序所駐留在的位置。在再一個實施例中,該重定向器包括文件系統(tǒng)過濾器驅(qū)動器。
本發(fā)明用后附的權(quán)利要求中特別地點出。以上所描述的本發(fā)明的優(yōu)點以及發(fā)明本的其他優(yōu)點通過參考結(jié)合附圖所給出的以下描述可以得到更好的理解,在附圖中圖1A是支持代表用戶的兩個應(yīng)用程序的執(zhí)行的現(xiàn)有技術(shù)操作系統(tǒng)環(huán)境的框圖;圖1B是支持代表若干用戶的多個應(yīng)用程序的并發(fā)執(zhí)行的現(xiàn)有技術(shù)操作系統(tǒng)環(huán)境的框圖;圖2A是應(yīng)用程序兼容性和社交性問題已經(jīng)降低的計算機系統(tǒng)的實施例的框圖;圖2B是應(yīng)用程序兼容性和社交性問題已經(jīng)降低的計算機系統(tǒng)的實施例的圖;圖2C是示出把進程與隔離范圍關(guān)聯(lián)所采取的步驟的一個實施例的流程圖;圖3A是示出虛擬化對計算機系統(tǒng)中的本機資源的訪問所采取的步驟的一個實施例的流程圖;圖3B是在執(zhí)行模式中識別替換實例所采取的步驟的一個實施例的流程圖;圖3C是描繪當(dāng)接收到一個用于打開本機資源的請求之時(該請求表明該資源正在被打開目的是去修改它)識別文字(literal)資源而在安裝模式下所采取得步驟的一個實施例的流程圖;圖3D是描繪當(dāng)接收到一個創(chuàng)建虛擬資源的請求之時識別文字資源而在安裝模式下所采取的步驟的一個實施例的流程圖。
圖4是描繪在所描述的虛擬化的環(huán)境中打開文件系統(tǒng)中的條目所采取的步驟的一個實施例的流程圖;圖5是描繪在所描述的虛擬化環(huán)境中從文件系統(tǒng)刪除條目所采取的步驟的一個實施例的流程圖;圖6是描繪在所描述的虛擬化環(huán)境中列舉文件系統(tǒng)中的條目所采取的步驟的一個實施例的流程圖;圖7是描繪在所描述的虛擬化環(huán)境在文件系統(tǒng)中創(chuàng)建條目所采取的步驟的一個實施例的流程圖;圖8是描繪在所描述的虛擬化環(huán)境中打開注冊表鍵所采取的步驟的一個實施例的流程圖;
圖9是描繪在所描述的虛擬化環(huán)境中刪除注冊表鍵所采取的步驟的一個實施例的流程圖;圖10是描繪在所描述的虛擬化環(huán)境中列舉注冊表數(shù)據(jù)庫中的鍵的子鍵所采取的步驟的一個實施例的流程圖;圖11是在所描述的虛擬化的環(huán)境中創(chuàng)建注冊表鍵所采取的步驟的一個實施例的流程圖描繪;圖12是描繪虛擬化對命名對象的訪問所采取的步驟的一個實施例的流程圖;圖13是描繪在所描述的環(huán)境中虛擬化窗口名稱和窗口類所采取的步驟的一個實施例的流程圖;圖13A是描繪確定文字窗口名稱和窗口類名稱所采取的步驟的一個實施例的流程圖;圖14是描繪在所描述的虛擬化環(huán)境中調(diào)用進程外COM服務(wù)器所采取的步驟的一個實施例的流程圖;圖15是使用文件類型關(guān)聯(lián)來虛擬化應(yīng)用程序調(diào)用所采取的步驟的一個實施例的流程圖;以及圖16是描繪把進程從源隔離范圍移動到目標(biāo)隔離范圍所采取的步驟的一個實施例的流程圖。
索引索引的目的是幫助讀者遵循對本發(fā)明的論述1.0隔離環(huán)境概念概述1.1應(yīng)用程序隔離1.2用戶隔離1.3本機資源的聚合視圖1.4進程與隔離范圍之間的關(guān)聯(lián)1.4.1范圍外的進程與隔離范圍之間的關(guān)聯(lián)2.0虛擬化機制概述3.0在隔離環(huán)境中的安裝4.0詳細(xì)的虛擬化示例4.1文件系統(tǒng)虛擬化4.1.1文件系統(tǒng)打開操作
4.1.2文件系統(tǒng)刪除操作4.1.3文件系統(tǒng)列舉操作4.1.4文件系統(tǒng)創(chuàng)建操作4.1.5短文件名稱管理4.2注冊表虛擬化4.2.1注冊表鍵打開操作4.2.2注冊表鍵刪除操作4.2.3注冊表鍵列舉操作4.2.4注冊表創(chuàng)建操作4.3命名對象虛擬化操作4.4窗口名稱虛擬化4.5進程外COM服務(wù)器虛擬化4.6虛擬化的文件類型關(guān)聯(lián)4.7進程在隔離環(huán)境之間的動態(tài)移動具體實施方式
1.0隔離環(huán)境概念概述1.1應(yīng)用程序隔離現(xiàn)在參考圖2A,示出了在應(yīng)用程序兼容性和應(yīng)用程序社交性問題已經(jīng)降低了的操作系統(tǒng)100的控制下運行的計算機的一個實施例。操作系統(tǒng)100經(jīng)由它的系統(tǒng)層108使應(yīng)用程序112,114可以使用各種本機資源。系統(tǒng)層108所包括的資源的視圖將被稱為術(shù)語″系統(tǒng)范圍″。為了避免應(yīng)用程序112,114訪問本機資源102,104,106,107產(chǎn)生沖突,就提供了隔離環(huán)境200。如圖2A所示,隔離環(huán)境200包括應(yīng)用程序隔離層220和用戶隔離層240。從概念上講,隔離環(huán)境200經(jīng)由應(yīng)用程序隔離層220給應(yīng)用程序112,114提供唯一的本機資源視圖,所述本機資源諸如文件系統(tǒng)102,注冊表104,對象106和窗口名稱107。每個隔離層修改提供給一個應(yīng)用程序的本機資源視圖。由一個層所提供的本機資源的修改視圖被稱為該層的″隔離范圍″。如圖2A所示的,所述應(yīng)用程序隔離層包括兩個應(yīng)用程序隔離范圍222,224。范圍222代表提供給應(yīng)用程序112的本機資源的視圖,范圍224代表提供給應(yīng)用程序114的本機資源的視圖。因此,在圖2A所示出的實施例中,給APP1 112提供有文件系統(tǒng)102′的專用視圖,同時還給APP2 114提供有文件系統(tǒng)102″的也是專用的另一個視圖。在一些實施例中,應(yīng)用程序隔離層220給執(zhí)行在操作系統(tǒng)100的頂部上的每個單獨應(yīng)用程序提供本機資源102,104,106,107的專用視圖。在其他實施例中,可以把應(yīng)用程序112,114編組成集合,在這些實施例中,應(yīng)用程序隔離層220為每個應(yīng)用程序集合提供本機資源的專用視圖??梢园褯_突的應(yīng)用程序置于到相互獨立的組中,用以增強應(yīng)用程序的兼容性和社交性。在又一些實施例,屬于一個集合的應(yīng)用程序可以由于管理員加以配置。在一些實施例中,″直通″隔離范圍能夠被定義成確切地對應(yīng)于系統(tǒng)范圍。換言之,在直通隔離范圍之內(nèi)執(zhí)行的應(yīng)用程序直接地對系統(tǒng)范圍操作。
在一些實施例中,還把應(yīng)用程序隔離范圍劃分成分層的子范圍。主子范圍包含基礎(chǔ)應(yīng)用程序隔離范圍,附加子范圍包含對這一該應(yīng)用程序的多個執(zhí)行實例可見的范圍的各種修改。例如,子范圍可以對體現(xiàn)應(yīng)用程序的補丁級別或者附加特征的安裝或者除去的變化的范圍的修改。在一些實施例中,可變?yōu)檎趫?zhí)行的應(yīng)用程序的實例可見的附加子范圍的集合是可配置的。在一些實施例中,那個可見的子范圍的集合對于正在執(zhí)行的應(yīng)用程序的所有實例而言都是相同的,不管該應(yīng)用程序正在代表哪個用戶在執(zhí)行著。在其他實施例中,可見的子范圍集合對于正在執(zhí)行該應(yīng)用程序的不同用戶可能會有變化。在另外的實施例,可以定義子范圍的各種集合,并且對于要使用哪個集合,用戶可以作出選擇。在一些實施例中,當(dāng)不再需要子范圍之時,可以丟棄子范圍。在一些實施例中,包含在子范圍的集合中的修改可以歸并在一起而形成單個子范圍。
1.2用戶隔離現(xiàn)在參考圖2B,描繪了應(yīng)用程序兼容性和應(yīng)用程序社交性問題已經(jīng)降低的多用戶計算機。該多用戶計算機在系統(tǒng)層108中包括本機資源102,104,106,107以及緊挨著的上面所論述的隔離環(huán)境200。應(yīng)用程序隔離層220按照上面所描述的那樣發(fā)揮作用,給應(yīng)用程序或者應(yīng)用程序組提供本機資源的修改視圖。用戶隔離層240,在概念上,給應(yīng)用程序112,114提供以下本機資源視圖,該本機資源視圖還根據(jù)應(yīng)用程序代表其執(zhí)行的那個用戶的用戶身份標(biāo)識作出改動。如圖2B所示的,用戶隔離層240可以被視為包括多個用戶隔離范圍242′,242″,242,242′,242″,242(總體上是242)。用戶隔離范圍242提供本機資源的應(yīng)用程序?qū)S靡晥D的用戶專用視圖。例如,給在用戶會話110中代表用戶″a″執(zhí)行的APP1 112提供一個文件系統(tǒng)視圖102′(a),該文件系統(tǒng)視圖由用戶隔離范圍242″和應(yīng)用程序隔離范圍222這二者來改動或者修改。
換言之,用戶隔離層240為每個單獨用戶通過把由用戶隔離范圍242所提供的用戶專用視圖修改”分層”在由應(yīng)用程序隔離范圍222所提供的應(yīng)用程序?qū)S靡晥D修改上(它又被分層在由于系統(tǒng)層所提供的系統(tǒng)范圍寬的本機資源視圖上)來改動本機資源視圖。例如,當(dāng)APP1的第一實例112訪問注冊表數(shù)據(jù)庫104的條目之時,就查閱第一用戶會話和應(yīng)用程序?qū)S玫淖员頂?shù)據(jù)庫104′(a)的視圖。如果所請求的注冊表鍵在注冊表104′(a)的用戶專用視圖中找到了,那么就把該注冊表鍵返回到APP1 112。如果沒有找到,則查閱應(yīng)用程序?qū)S玫淖员頂?shù)據(jù)庫104′的視圖。如果所請求的注冊表鍵在注冊表104′的應(yīng)用程序?qū)S靡晥D中找到了,那么就把該注冊表鍵返回給APP1 112。如果沒有找到,那么就把在系統(tǒng)層108中的注冊表數(shù)據(jù)庫104中所存儲的注冊表鍵(即,本機注冊表鍵)返回給APP1 112。
在一些實施例中,用戶隔離層240為每個單獨用戶提供隔離范圍。在其他實施例中,用戶隔離層240為用戶組提供隔離范圍,其可以用在組織之內(nèi)的角色來定義或者可以由管理員預(yù)先確定。在又一些其他實施例中,不提供任何用戶隔離層240。在這些實施例中,應(yīng)用程序所看見的本機資源視圖是由應(yīng)用程序隔離層220所提供的本機資源視圖。隔離環(huán)境200,盡管相對于支持由各種用戶對應(yīng)用程序的并發(fā)執(zhí)行的多用戶計算機加以描述,但是它也可以使用在單用戶計算機上,用以致力于解決不同的用戶在相同計算機系統(tǒng)上順序的執(zhí)行應(yīng)用程序所導(dǎo)致的應(yīng)用程序兼容性和社交性問題以及相同用戶安裝和執(zhí)行不兼容程序所導(dǎo)致的那些問題。
在一些實施例中,用戶隔離范圍還被劃分成子范圍。由用戶隔離范圍對呈現(xiàn)給在那個范圍執(zhí)行的應(yīng)用程序的視圖的修改是包含在該范圍中的子范圍之內(nèi)的修改的聚合。子范圍被分層在相互的頂上,并且在該聚合視圖中,對更高子范圍中的資源的修改重載對在更低層中相同資源的修改。
在這些實施例中的一些實施例中,這些子范圍中的一個或者多個可以包含對用戶專用的視圖的修改。在這些實施例中的一些實施例中,一個或者多個子范圍可以包含對用戶集合專用的視圖的修改,用戶集合可以由系統(tǒng)管理員定義,或者在操作系統(tǒng)中定義為用戶組。在這些實施例中的一些實施例中,這些子范圍之一可以包含特定的登錄會話專用的視圖的修改,并且因此在當(dāng)該會話結(jié)束之時丟棄它們。在這些實施例中的一些實施例中,與用戶隔離范圍相關(guān)聯(lián)的應(yīng)用程序?qū)嵗龑Ρ緳C資源的改變總是影響這些子范圍之一,并且在其他實施例中,那些變化可以影響不同的子范圍,這取決于所改變的特定資源。
1.3本機資源的聚合視圖以上描述的概念上的體系結(jié)構(gòu)允許向代表用戶執(zhí)行的應(yīng)用程序呈現(xiàn)本機資源的聚合或者統(tǒng)一的虛擬化視圖(該視圖是應(yīng)用程序和用戶的組合專用的)。此聚合的視圖可以被稱為″虛擬的范圍″。向代表用戶執(zhí)行的應(yīng)用程序?qū)嵗尸F(xiàn)反映本機資源的所有可操作的虛擬化實例的本機資源的單個視圖。概念上,此聚合的視圖首先由操作系統(tǒng)在系統(tǒng)范圍所提供的本機資源集合組成,該本機資源集合與包含在適用于執(zhí)行的應(yīng)用程序的應(yīng)用程序隔離范圍中的修改相重疊,還與包含在適用于代表用戶執(zhí)行的應(yīng)用程序的用戶隔離范圍中的修改相重疊。系統(tǒng)范圍中的本機資源特征在于對于該系統(tǒng)上的所有用戶和應(yīng)用程序都是共用的,除了操作系統(tǒng)權(quán)限拒絕對特定用戶或者應(yīng)用程序訪問的地方之外。對包含在應(yīng)用程序隔離范圍中的資源視圖的修改的特征在于對與那個應(yīng)用程序隔離范圍相關(guān)聯(lián)的應(yīng)用程序的所有實例都是共用的。對包含在用戶隔離范圍中的資源視圖的修改的特征在于對與適用的應(yīng)用程序隔離范圍相關(guān)聯(lián)并且代表與用戶隔離范圍相關(guān)聯(lián)的用戶執(zhí)行的所有應(yīng)用程序都是共用的。
此概念能夠擴展到子范圍;對包含在用戶子范圍中的資源視圖的修改對于與適用的隔離子范圍相關(guān)聯(lián)并且代表與用戶隔離子范圍相關(guān)聯(lián)的用戶或者用戶組執(zhí)行的所有應(yīng)用程序都是共用的。在貫穿此說明書自始至終,應(yīng)該理解的是每當(dāng)總體上參考″范圍″之時,在范圍和子范圍都存在之處,它也預(yù)計指子范圍。
當(dāng)應(yīng)用程序請求列舉本機資源(諸如文件系統(tǒng)或者注冊表數(shù)據(jù)庫的一部分)之時,虛擬化的列舉通過首先列舉本機資源的″系統(tǒng)范圍″的實例,即在系統(tǒng)層中可見的實例(如果存在的話)來構(gòu)造。接著,列舉所請求的資源的″應(yīng)用程序范圍″的實例,也即,在適當(dāng)?shù)膽?yīng)用程序隔離范圍中所找到的實例(如果存在的話)。在應(yīng)用程序隔離范圍中所遇見的任何列舉的資源都被添加到該視圖。如果所列舉的資源已經(jīng)存在于該視圖中(因為它過去也存在于該系統(tǒng)范圍中),那么就把它替換成在應(yīng)用程序隔離范圍中所遇見的資源的實例。類似地,列舉所請求的資源的″用戶范圍″的實例,也即,在適當(dāng)?shù)挠脩舾綦x范圍中所找到的實例(如果存在的話)果。再一次把在用戶隔離范圍中所遇見的任何列舉的資源都添加到該視圖。如果該本機資源已經(jīng)存在于該視圖中(因為它過去就存在于該系統(tǒng)范圍中或者存在于該適當(dāng)?shù)膽?yīng)用程序隔離范圍中),那么就把它替換成在用戶隔離范圍中所遇見的資源的實例。照此,本機資源的任何列舉都將正確地反映所列舉的本機資源的虛擬化。概念上,相同的方法也適用于列舉包括多個子范圍的隔離范圍。列舉單獨的子范圍,在聚合視圖中,來自更高子范圍的資源替代來自的更低子范圍的匹配實例。
在其他實施例中,列舉可以從用戶隔離范圍層向下執(zhí)行到系統(tǒng)層,而不是從系統(tǒng)層反過來執(zhí)行到用戶隔離范圍層。在這些實施例中,列舉用戶隔離范圍。然后,列舉應(yīng)用程序隔離范圍并且把出現(xiàn)在應(yīng)用程序隔離范圍中但是未曾在用戶隔離范圍列舉過的任何資源實例添加到構(gòu)造中的該聚合視圖。能夠為僅僅出現(xiàn)在該系統(tǒng)范圍中的資源重復(fù)一個類似的過程。
在又一些實施例中,所有隔離范圍可以同時被列舉并且各自的列舉可以被分別組合。
如果一個應(yīng)用程序試圖去打開本機資源的一個已有實例,但是卻沒有修改該資源的目的,那么返回給該應(yīng)用程序的專用實例就是在虛擬范圍中所見的一個實例,或者等效地是在所請求的資源的雙親的虛擬化的列舉中會出現(xiàn)的實例。根據(jù)隔離環(huán)境,該應(yīng)用程序比方說正在請求去打開一個″虛擬的資源″,并且用于滿足該請求的本機資源的特定實例比方說就是對應(yīng)于所請求的資源的“文字資源″。
如果一個代表用戶執(zhí)行的應(yīng)用程序試圖去打開資源并且表明它正在這樣做且目的是去修改該資源,那么應(yīng)用程序?qū)嵗ǔ>捅唤o與一個要修改的那個資源的私有拷貝,原因在于在應(yīng)用程序隔離范圍和系統(tǒng)范圍中的資源對于代表其他用戶執(zhí)行的應(yīng)用程序而言是共用的。典型地,產(chǎn)生該資源的用戶范圍的拷貝,除非該用戶范圍的實例已經(jīng)存在了。對由虛擬范圍所提供的聚合視圖的定義意味著把應(yīng)用程序范圍的或者系統(tǒng)范圍的資源拷貝到用戶隔離范圍的動作并不為所關(guān)注的用戶和應(yīng)用,不為任何其他用戶,不為任何其他應(yīng)用程序?qū)嵗淖冇商摂M范圍所提供的聚合視圖。由代表用戶執(zhí)行的應(yīng)用程序?qū)嵗龑λ截惖馁Y源所做的后續(xù)的修改并不影響任何其他不共享相同的用戶隔離范圍的應(yīng)用程序?qū)嵗木酆弦晥D。換言之,那些修改并不為其他用戶,也不為與相同的應(yīng)用程序隔離范圍不相關(guān)聯(lián)的應(yīng)用程序?qū)嵗淖儽緳C資源的聚合視圖。
1.4進程與隔離范圍之間的關(guān)聯(lián)應(yīng)用程序可以被安裝到特定的隔離范圍中(以下更加詳細(xì)地加以描述)。安裝到隔離范圍中的應(yīng)用程序總是被與該范圍相關(guān)聯(lián)。作為選擇,可以把應(yīng)用程序啟動到特定的隔離范圍之中,或者啟動到多個隔離范圍中。實際上,一個應(yīng)用程序被啟動并且被與一個或者多個隔離范圍相關(guān)聯(lián)。該相關(guān)聯(lián)的隔離范圍,或者范圍,給進程提供本機資源的特定視圖。也可以把應(yīng)用程序啟動到系統(tǒng)范圍之中,也就是說,可以不把它們與任何隔離范圍相關(guān)聯(lián)。這兼顧了在隔離環(huán)境之內(nèi)選擇性地執(zhí)行操作系統(tǒng)應(yīng)用程序(諸如Internet Explorer)以及第三方應(yīng)用程序。
不管把應(yīng)用程序安裝在哪里而把應(yīng)用程序啟動到到隔離范圍之內(nèi)的這種能力減輕了應(yīng)用程序兼容性和社交性問題,而不需要在隔離范圍之內(nèi)獨立地安裝該應(yīng)用程序。這種選擇性地把所安裝的應(yīng)用程序啟動到不同的隔離范圍中的能力提供了讓需要助手應(yīng)用程序的應(yīng)用程序(諸如Word,Notepad等)具有讓那些助手應(yīng)用程序用相同的規(guī)則集合來啟動的能力。
進而,把應(yīng)用程序啟動到多個隔離的環(huán)境之內(nèi)的這種能力兼顧到在隔離的應(yīng)用程序和公共應(yīng)用程序之間能有更好地整合。
現(xiàn)在參考圖2C,在簡潔的總觀中,一種用于把進程與隔離范圍相關(guān)聯(lián)的方法,包括把進程啟動到掛起狀態(tài)中(步驟282)的步驟。與所希望的隔離范圍相關(guān)聯(lián)的規(guī)則被獲取(步驟284),并且把該進程的標(biāo)識符并且所獲取的規(guī)則存儲在存儲器元件中(步驟286),然后恢復(fù)所掛起的進程(步驟288)。攔截或者鉤住由該進程所作出的對訪問本機資源的后續(xù)的調(diào)用(步驟290),并且與該進程標(biāo)識符相關(guān)聯(lián)的規(guī)則(如果存在的話)被使用來虛擬化對所請求的資源的訪問(步驟292)。
還參考圖2C,更詳細(xì)地,把一個進程啟動到掛起狀態(tài)中(步驟282)。在一些實施例中,使用客戶發(fā)動器程序來完成此任務(wù)。在這些實施例的一些中,該發(fā)動器特別地被設(shè)計成用于把一個進程啟動到選定的隔離范圍中。在其他實施例中,該發(fā)動器例如通過命令行選項接受所希望的隔離范圍的規(guī)定而作為輸入,。
與希望的隔離范圍相關(guān)聯(lián)的規(guī)則被獲取(步驟284)。在一些實施例中,所述規(guī)則被從持久的存儲元件(諸如硬盤驅(qū)動器或者其他固態(tài)存儲器元件)中所獲取。所述規(guī)則可以被存儲為關(guān)系數(shù)據(jù)庫,平面文件數(shù)據(jù)庫,樹形結(jié)構(gòu)的數(shù)據(jù)庫,二進制樹結(jié)構(gòu),或者其他持久的數(shù)據(jù)結(jié)構(gòu)。在其他實施例中,所述規(guī)則可以被存儲在特別配置來存儲它們的數(shù)據(jù)結(jié)構(gòu)中。
進程的標(biāo)識符,諸如進程id(PID)和所獲取的規(guī)則被存儲在存儲器元件中(步驟286)。在一些實施例中,一個核心模式驅(qū)動器被提供,該核心模式驅(qū)動器接收關(guān)于新進程創(chuàng)建的操作系統(tǒng)消息。在這些實施例中,PID和所獲取的規(guī)則可以被存儲在驅(qū)動器上下文中。在其他實施例中,提供文件系統(tǒng)過濾器驅(qū)動器,或者微型過濾器,它攔截本機資源請求。在這些實施例中,PID和所獲取的規(guī)則可以存儲在該過濾器中。在其他實施例中,所有的攔截都通過用戶模式掛鉤來執(zhí)行,并且根本就不存儲任何PID。所述規(guī)則由用戶模式掛鉤設(shè)備在進程初始化期間來加載,并且任何其他組件都不需要去知道施加到該PID的規(guī)則,原因在于規(guī)則關(guān)聯(lián)整個地是在進程中執(zhí)行的。
所掛起的進程被恢復(fù)(步驟288),并且攔截或者鉤住由該進程作出的對訪問本機資源的后續(xù)調(diào)用(步驟290),并且與進程標(biāo)識符相關(guān)聯(lián)的規(guī)則(如果存在的話)被使用來虛擬化對所請求的資源的訪問(步驟292)。在一些實施例中,文件系統(tǒng)過濾器驅(qū)動器或者微型過濾器,攔截對訪問本機資源的請求并且確定與所攔截的請求相關(guān)聯(lián)的進程標(biāo)識符是否已經(jīng)與一個規(guī)則集合相關(guān)聯(lián)。如果已經(jīng)相關(guān)聯(lián)了,那么就使用與所存儲的進程標(biāo)識符相關(guān)聯(lián)的規(guī)則來虛擬化請求訪問本機資源的請求。如果還沒有,那么就不加修改地讓請求訪問本機資源的請求通過。在其他實施例中,把動態(tài)鏈接庫加載到新創(chuàng)建的進程中,并且該庫加載隔離規(guī)則。在再一些其他的實施例中,核心模式技術(shù)(掛鉤,過濾器驅(qū)動器,微型過濾器)和用戶模式技術(shù)這二者都被使用來攔截對訪問本機資源的調(diào)用。對于文件系統(tǒng)過濾器驅(qū)動器存儲所述規(guī)則的實施例而言,該庫可以從所述文件系統(tǒng)過濾器驅(qū)動器加載所述規(guī)則。
作為是與隔離范圍相關(guān)聯(lián)的進程的“孩子”的進程與它們的″雙親″進程的隔離范圍相關(guān)聯(lián)。在一些實施例中,當(dāng)創(chuàng)建孩子進程之時,這是由核心模式驅(qū)動器通知文件系統(tǒng)過濾器驅(qū)動器來實現(xiàn)的。在這些實施例中,文件系統(tǒng)過濾器驅(qū)動器確定雙親進程的進程標(biāo)識符是否與隔離范圍相關(guān)聯(lián)。如果是這樣,那么文件系統(tǒng)過濾器驅(qū)動器就存儲在新創(chuàng)建的孩子進程的進程標(biāo)識符和雙親進程的隔離范圍之間的關(guān)聯(lián)。在其他實施例中,該文件系統(tǒng)過濾器驅(qū)動器能夠被直接地從該系統(tǒng)調(diào)用,而不使用核心模式驅(qū)動器。在其他實施例中,在與隔離范圍相關(guān)聯(lián)的進程中,用于創(chuàng)建新進程的操作系統(tǒng)函數(shù)就被鉤住或者攔截。當(dāng)從這樣的進程中接收到請求創(chuàng)建新進程的請求之時,在新孩子進程和雙親的隔離范圍之間的關(guān)聯(lián)就被存儲。
在一些實施例中,范圍或者子范圍可以與單獨的線程而不是整個進程相關(guān)聯(lián),這樣就允許隔離以每個線程為基礎(chǔ)地執(zhí)行。在一些實施例中,可以為服務(wù)和COM+服務(wù)器使用每個線程的隔離。
1.4.1把范圍外的進程與隔離范圍相關(guān)聯(lián)本發(fā)明的另一個方面在于能夠把任何應(yīng)用程序?qū)嵗c任何應(yīng)用程序隔離范圍相關(guān)聯(lián)起來,而不用管所述應(yīng)用程序是安裝到該應(yīng)用程序隔離范圍,安裝到另一個應(yīng)用程序隔離范圍中還是沒有安裝在任何的應(yīng)用程序隔離范圍中。然而,沒有被安裝到特定應(yīng)用程序范圍中的應(yīng)用程序在應(yīng)用程序隔離范圍和相應(yīng)的用戶隔離范圍的上下文中也能夠代表用戶執(zhí)行,原因在于它們的本機資源通過由用戶隔離范圍,應(yīng)用程序隔離范圍和系統(tǒng)范圍所形成的聚合的虛擬范圍可以由它們使用。在希望去在隔離范圍中運行應(yīng)用程序的情況下,這樣就提供使直接地安裝到系統(tǒng)范圍中的應(yīng)用程序能夠在隔離范圍之內(nèi)運行而不需要相獨立地把應(yīng)用程序安裝在隔離范圍之內(nèi)的能力。這樣也提供能夠在任何隔離范圍的上下文中把直接地安裝到系統(tǒng)范圍中的應(yīng)用程序用作助手應(yīng)用程序。
每個應(yīng)用程序?qū)嵗?,包括組成執(zhí)行的應(yīng)用程序的所有進程,與零個或者一個應(yīng)用程序隔離范圍相關(guān)聯(lián),并且通過擴展確切地與零個或者一個對應(yīng)的用戶隔離范圍相關(guān)聯(lián)。此關(guān)聯(lián)由規(guī)則引擎在確定要把哪個規(guī)則(如果有的話)施加到資源請求之時使用。關(guān)聯(lián)不必是針對應(yīng)用程序安裝到的那個應(yīng)用程序隔離范圍(如果有的話)。安裝到隔離范圍中的許多應(yīng)用程序當(dāng)運行在不同的隔離范圍或者沒有運行在隔離范圍中之時將不能夠正確地發(fā)揮作用,原因在于它們無法找到必要的本機資源。然而,因為隔離范圍是包括系統(tǒng)范圍的資源視圖的聚合,所以安裝在系統(tǒng)范圍中的應(yīng)用程序在任何應(yīng)用程序隔離范圍之內(nèi)一般都能夠發(fā)揮正確的作用。這就意味著助手程序以及進程外COM服務(wù)器,都能夠由代表用戶在特定隔離范圍中執(zhí)行的應(yīng)用程序加以調(diào)用和執(zhí)行。
在一些實施例中,安裝在系統(tǒng)范圍中的應(yīng)用程序執(zhí)行在隔離范圍中,目的是為了把對計算機的文件和配置設(shè)定做了哪些改變識別為此執(zhí)行的結(jié)果。因為所有受到影響的文件和配置設(shè)定被在用戶隔離范圍中隔離開,所以這些文件和配置設(shè)定是很容易就被識別的。在這些實施例的一些實施例中,這一點用在報告對由應(yīng)用程序?qū)ξ募团渲迷O(shè)定所作出的改變上。在一些實施例中,所述文件和配置設(shè)定被在應(yīng)用程序執(zhí)行結(jié)束之時刪除,這樣就有效地確保了對計算機的文件和配置設(shè)定的任何改變都不會被存儲為應(yīng)用程序執(zhí)行的結(jié)果。在再一些其他的實施例中,所述文件和配置設(shè)定被選擇性地刪除,或者在應(yīng)用程序的執(zhí)行結(jié)束之時不被刪除,這就有效地確保了對計算機的文件和配置設(shè)定的變化僅有一些才被存儲為應(yīng)用程序執(zhí)行的結(jié)果。
2.0虛擬化機制概述現(xiàn)在參考圖3A,示出了在執(zhí)行模式中虛擬化對本機資源的訪問所要采取的步驟的一個實施例,所述執(zhí)行模式在以下將區(qū)別于安裝模式。在簡短的概述中,攔截或者接收用以訪問本機資源的請求(步驟302)。所述請求標(biāo)識訪問要尋找的那個本機資源。確定關(guān)于如何對待所接收的訪問請求的適用規(guī)則(步驟304)。如果該規(guī)則表明該請求應(yīng)該被忽略,那么就讓該訪問請求通過,而不對系統(tǒng)層做修改(步驟306),然后把返回給請求者(步驟310)。如果該規(guī)則表明對于該訪問請求應(yīng)該被重定向或者被隔離,那么就識別滿足該請求的資源的文字實例(步驟308),把對文字資源的修改或者替換請求傳遞到系統(tǒng)層(步驟306),然后把該結(jié)果返回給請求者(步驟310)。
還參考圖3,更詳細(xì)地,攔截或者接收標(biāo)識本機資源的請求(步驟302)。在一些實施例中,對本機資源的請求通過由操作系統(tǒng)為應(yīng)用程序提供的用以產(chǎn)生本機資源請求的″掛鉤″函數(shù)所攔截。在特定的實施例中,這被實現(xiàn)為動態(tài)鏈接庫,該動態(tài)鏈接庫被加載到由操作系統(tǒng)所創(chuàng)建的每個新進程的地址空間中,并且它在其初始化例程期間執(zhí)行掛鉤。把DLL加載到每一個進程中可以經(jīng)由操作系統(tǒng)所提供的工具來實現(xiàn),或者作為選擇,通過修改DLL的可執(zhí)行映象列表以便導(dǎo)入到磁盤文件中或者當(dāng)該進程的可執(zhí)行映象被從磁盤中加載之時導(dǎo)入到存儲器中來實現(xiàn)。在其他實施例中,功能掛鉤由服務(wù),驅(qū)動器或者守護進程(daemon)來執(zhí)行。在其他實施例中,對由操作系統(tǒng)所提供的可執(zhí)行映象(包括共享庫和可執(zhí)行文件)可以做修改或者打補丁,以便提供功能掛鉤或者直接地包括本發(fā)明的邏輯。對于該操作系統(tǒng)是微軟WINDWOS操作系統(tǒng)系列中的一個操作系統(tǒng)的特定實施例而言,攔截可以通過核心模式驅(qū)動器掛鉤系統(tǒng)服務(wù)分派表來執(zhí)行。在再一些其他的實施例中,該操作系統(tǒng)可以提供允許第三方能夠去掛鉤用于請求訪問本機資源的函數(shù)的工具。在這些實施例的一些實施例中,該操作系統(tǒng)可以經(jīng)由應(yīng)用程序編程接口(API)或者調(diào)試工具提供此工具。
在其他實施例中,本機資源請求被與本機資源相關(guān)聯(lián)的驅(qū)動器堆棧或者處理程序堆棧中的過濾器攔截。例如,微軟WINDOWS操作系統(tǒng)系列中的一些操作系統(tǒng)具有能力來把第三方過濾器驅(qū)動器或者微型過濾器插入到文件系統(tǒng)驅(qū)動器堆棧中,并且文件系統(tǒng)過濾器驅(qū)動器或者微型過濾器可以被是用來提供以下描述的隔離功能。在再一些其他的實施例中,本發(fā)明包括能夠直接地并入本發(fā)明的邏輯的文件系統(tǒng)實現(xiàn)方案。作為選擇,可以改寫操作系統(tǒng)以便能夠直接地提供以下描述的功能。在一些實施例中,以上列出的用于攔截或者接收對資源的請求的方法的一些或者全部的組合可以被同時使用。
在許多實施例中,只有那些用于打開現(xiàn)有的本機資源或者創(chuàng)建新本機資源的請求才被鉤住或者攔截。在這些實施例中,對本機資源的初始訪問就是引起資源被虛擬化的訪問。在初始訪問之后,正在請求的應(yīng)用程序能夠使用操作系統(tǒng)所提供的直接地識別文字資源的句柄或者指針或者其他標(biāo)識符與操作系統(tǒng)就虛擬化資源而相互通信。在其他實施例中,請求對虛擬化的本機資源操作的其他類型的請求也被鉤住或者攔截。在這些實施例的一些實施例中,由應(yīng)用程序打開或者創(chuàng)建虛擬資源的請求返回不直接地識別文字資源的虛擬句柄,并且該隔離環(huán)境負(fù)責(zé)針對虛擬句柄把后續(xù)的請求翻譯成對應(yīng)的文字資源。在那些實施例的一些實施例中,附加虛擬化操作能夠被推遲,一直到證明確實需要才進行。例如,把資源的私有可修改的拷貝提供到隔離范圍的操作就能夠能夠推遲,直到用于改變該資源的請求被產(chǎn)生為止,而不是當(dāng)在允許后續(xù)修改的模式下該資源被打開之時就開始該操作。
一旦本機資源請求被攔截或者接收,那么用于確定關(guān)于如何處理該特定的請求的適用規(guī)則就被確定(步驟304)。最適用的規(guī)則可以通過參考規(guī)則引擎,數(shù)據(jù)庫規(guī)則或者包含使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)(諸如列表或者樹結(jié)構(gòu))所組織的規(guī)則的平面文件來確定。在一些實施例中,給與優(yōu)先級賦予規(guī)則,用于當(dāng)施加兩個或者多個規(guī)則之時優(yōu)先級確定哪條規(guī)則將被視為是最適用的。在這些實施例的一些實施例中,規(guī)則優(yōu)先級被包括在規(guī)則它們自身中,或者,作為選擇,規(guī)則優(yōu)先級可以被嵌入在用于存儲規(guī)則的數(shù)據(jù)結(jié)構(gòu),例如,規(guī)則優(yōu)先級可以用規(guī)則在樹結(jié)構(gòu)的位置來指示。所確定的規(guī)則可以包括關(guān)于如何去處理虛擬化的資源請求(諸如像,要把請求重定向到哪些文字資源)的附加信息。在特定的實施例中,規(guī)則是三元項,包括過濾器字段,動作字段以及數(shù)據(jù)字段。在此實施例中,過濾器字段包括是用來匹配接收的本機資源請求以便確定該規(guī)則對于所請求的資源名稱是否是有效的過濾器。動作字段能夠是″忽略″,″重定向″或者″隔離″。數(shù)據(jù)字段可以是關(guān)于當(dāng)規(guī)則是有效的之時要采取的動作的任何附加信息,包括當(dāng)規(guī)則是有效的之時要使用的功能。
規(guī)則動作″忽略″意味著該請求直接地對系統(tǒng)范圍中所請求的本機資源操作。也就是說,該請求被不加改動地傳遞到系統(tǒng)層108(步驟306),并且對該請求的完成,就好像不存在任何的隔離環(huán)境200一樣。在此情況下,就說隔離環(huán)境是具有一個″洞″,或者該請求可以被稱為″直通″請求。
如果該規(guī)則動作表明本機資源請求應(yīng)該被重定向或者隔離,那么就識別滿足該請求的文字資源(步驟308)。
規(guī)則動作″重定向″意味著該請求直接地對系統(tǒng)范圍的本機資源操作,不過該本機資源與在該請求中所指定的資源不同。文字資源通過把所確定的規(guī)則的數(shù)據(jù)字段中所指定的或者所隱含的映射功能施加到所請求的本機資源的名稱來識別。在最一般的情況下,可以把文字本機資源定位在系統(tǒng)范圍中的任何地方。舉一個簡單的例子,規(guī)則{prefix_match(″c:\temp\,資源名稱),REDIRECT,replace_prefix(″c:\temp\″,″d:\wutemp\″,資源名稱)}將把對文件c:\temp\examples\d1.txt的請求的訪問重定向到文字文件d:\wutemp\examples\d1.txt。包括在規(guī)則的數(shù)據(jù)字段的映射功能和匹配功能還可以推廣,以例如通過使用正則表達式來支持復(fù)雜的行為。一些實施例可以提供規(guī)定用于在用戶隔離范圍或者適用于代表用戶執(zhí)行的應(yīng)用程序的子范圍或者應(yīng)用程序隔離范圍或者適用于應(yīng)用程序的子范圍之內(nèi)定位文字資源的映射功能的能力。進一步實施例可以提供指定在在適用于不同的應(yīng)用的應(yīng)用程序隔離范圍之內(nèi)定位文字資源的映射功能以便提供在隔離應(yīng)用程序之間受控的交互形式的能力。在一些特別的實施例中,″重定向″動作能夠被配置成提供等效于″忽略″規(guī)則動作的行為。在這些實施例中,文字資源恰好就是所請求的本機資源。當(dāng)此條件被配置之時,隔離環(huán)境可以說是具有一個″洞,″或者是請求可以被稱為″直通″請求。
″隔離″規(guī)則動作意味著該請求對使用適當(dāng)?shù)挠脩舾綦x范圍和應(yīng)用程序隔離范圍所識別的文字資源操作。也就是說,該文字資源的標(biāo)識符通過使用用戶隔離范圍,應(yīng)用程序隔離范圍,這兩個范圍,或者任意范圍都不使用地修改所請求的本機資源的標(biāo)識符來加以確定。所識別的特定文字資源依賴于所請求訪問的類型和所請求的本機資源的實例是否已經(jīng)存在于適用的用戶隔離范圍,適用的應(yīng)用程序隔離范圍以及系統(tǒng)范圍中。
圖3B描繪當(dāng)接收到用以打開本機資源的請求表明了該資源正在被打開目的是要修改它之時識別文字資源(圖3A中的步驟306)所要采取的步驟的一個實施例。簡言之,確定所請求的本機資源的用戶范圍的實例,也即,存在于適用的用戶范圍或者用戶子范圍中的實例是否存在(步驟354)。如果存在,那么用戶范圍的實例就被標(biāo)識為是對該請求的文字資源(步驟372),并且該實例被打開然后被返回給請求者。如果用戶范圍的實例不存在,那么就確定所請求的本機資源的應(yīng)用程序范圍的實例是否存在(步驟356)。如果應(yīng)用程序范圍的實例存在,那么就把它標(biāo)識為是″候選″資源實例(步驟359),然后檢查與候選實例相關(guān)聯(lián)的權(quán)限數(shù)據(jù),以便確定是否允許修改該實例(步驟362)。如果不存在任何應(yīng)用程序范圍的實例,那么就確定所請求的本機資源的系統(tǒng)范圍的實例是否存在(步驟358)。如果它不存在,那么就把錯誤條件返回給請求者,表明所請求的虛擬化資源并不存在于虛擬范圍中(步驟360)。然而,如果系統(tǒng)范圍的資源存在,那么就把它標(biāo)識為是候選資源實例(步驟361),并且檢查與候選實例相關(guān)聯(lián)的權(quán)限數(shù)據(jù)以便確定是否允許修改該實例(步驟362)。如果它不存在,那么就把錯誤條件返回給請求者(步驟364),表明是否允許修改該虛擬化的資源。如果該權(quán)限數(shù)據(jù)表明可以修改候選資源,那么就對本機資源的候選實例做用戶范圍的拷貝(步驟370),把用戶范圍的實例標(biāo)識為是對該請求的文字實例(步驟372),打開它然后把它返回給請求者。
還參考圖3,更詳細(xì)地,確定用戶范圍的資源是否存在,或者換言之,所請求的資源是否存在于適用的用戶范圍或者子范圍中(步驟354)。適用的用戶范圍或者子范圍就是被分層在與產(chǎn)生該請求的應(yīng)用程序相關(guān)聯(lián)的應(yīng)用程序隔離范圍上的與用戶相關(guān)聯(lián)的范圍。用戶隔離范圍或者子范圍,在文件系統(tǒng)的情況下,可以是存在于用戶隔離范圍中的所有文件所存儲在的目錄。在這些實施例的一些實施例中,在用戶隔離目錄下的目錄樹結(jié)構(gòu)反映所請求的資源的路徑。例如,如果所請求的文件是c:\temp\test.txt并且用戶隔離范圍目錄是d:\user1\APP1\,那么到用戶范圍的文字文件的路徑就可能是d:\user1\APP1\c\temp\test.txt。在其他實施例中,到用戶范圍的文字的路徑可以按照本機命名慣例來定義。例如,到用戶范圍文字文件的路徑可以d:user1\APP1\device\harddisk1\temp\test.txt。在再一些其他的實施例中,用戶范圍的文件都可以被存儲在具有挑選成是唯一的名稱的單個目錄中,并且數(shù)據(jù)庫可以被是用來存儲在所請求的文件名稱和在該目錄中所存儲的對應(yīng)的文字文件的名稱之間的映射。在再一些其他的實施例中,文字文件的內(nèi)容可以被存儲在數(shù)據(jù)庫中。在再一些其他的實施例中,本機文件系統(tǒng)為單個文件提供工具,用以包含多個獨立命名的″流″,并且用戶范圍文件的內(nèi)容被存儲在系統(tǒng)范圍中的相關(guān)聯(lián)文件的附加流。作為選擇,文字文件可以被存儲在顧客文件系統(tǒng)中,該顧客文件系統(tǒng)可以被設(shè)計成優(yōu)化磁盤使用率或者感興趣的其他準(zhǔn)則。
如果用戶范圍的資源實例不存在,那么就確定應(yīng)用程序范圍的資源是否存在,或者換言之確定所請求的資源是否存在于應(yīng)用程序隔離范圍中(步驟356)。以上所描述的方法被使用來做此確定。例如,如果所請求的文件是c:\temp\test.txt并且應(yīng)用程序隔離范圍目錄是e:\APP1\,那么到應(yīng)用程序范圍的文件的路徑就可以是e:\APP1\c\temp\test.txt。如上,到應(yīng)用程序范圍的文件的路徑可以被按照本機命名慣例存儲。上述的實施例也可以應(yīng)用到應(yīng)用程序隔離范圍。
如果應(yīng)用程序范圍的資源不存在,那么就確定系統(tǒng)范圍的資源是否存在,或者換言之,確定所請求的資源是否存在于系統(tǒng)范圍中(步驟358)。例如,如果所請求的文件是c:\temp\test.txt,那么到系統(tǒng)范圍的文件的路徑是c:\temp\test.txt。如果所請求的資源不存在于系統(tǒng)范圍中,就把所請求的資源不存在于虛擬范圍中的指示返回給請求者(步驟360)。
不管所請求的資源的候選資源實例被定位在應(yīng)用程序隔離范圍中還是定位在系統(tǒng)范圍中,都確定是否允許修改候選資源實例(步驟362)。例如,候選本機資源實例可以具有相關(guān)聯(lián)的本機權(quán)限數(shù)據(jù),本機權(quán)限數(shù)據(jù)指示不允許那個用戶修改候選實例。另外,規(guī)則引擎可以包括配置設(shè)定,配置設(shè)定用于指示隔離環(huán)境去遵從或者重載資源的虛擬化拷貝的本機權(quán)限數(shù)據(jù)。在一些實施例中,規(guī)則可以為為一些虛擬資源指定要在其中發(fā)生修改的范圍,例如系統(tǒng)范圍或者應(yīng)用程序隔離范圍或者子范圍,或者用戶隔離范圍或者子范圍。在一些實施例中,規(guī)則引擎可以根據(jù)分層結(jié)構(gòu)或者根據(jù)所訪問的資源類型指定施加到虛擬化的本機資源的子集的配置設(shè)定。在這些實施例的一些實施例中,配置設(shè)定對每個原子本機資源可以是專用的。在另一個例子中,規(guī)則引擎可以包括配置數(shù)據(jù),配置數(shù)據(jù)用于禁止或者允許修改某些類文件(諸如可執(zhí)行代碼或者MIME類型或者操作系統(tǒng)所定義文件類型)。
如果在步驟362確定不允許修改候選資源實例,那么就把錯誤條件返回給請求者,表明不允許對虛擬資源的寫訪問(步驟364)。如果在步驟362確定允許修改候選資源實例,那么就把候選實例拷貝到適當(dāng)?shù)挠脩舾綦x范圍或者子范圍(步驟370)。對于在把所請求的本機資源的邏輯分層結(jié)構(gòu)維持在隔離范圍中的實施例而言,把資源的候選實例拷貝到用戶隔離范圍可能需要在用戶隔離范圍中創(chuàng)建分層結(jié)構(gòu)占位符(placeholder)。分層結(jié)構(gòu)占位符是一個被置于分層結(jié)構(gòu)中用以正確在隔離范圍中定位拷貝的資源的節(jié)點。分層結(jié)構(gòu)占位符不存儲任何數(shù)據(jù),被標(biāo)識為是占位符節(jié)點,并且從它不能夠是返回給請求者的文字資源這個意義上講,它是″不存在的″。在一些實施例中,通過把事實記錄在附聯(lián)到一個節(jié)點或者該節(jié)點的雙親或者附聯(lián)到系統(tǒng)層中的某個其他相關(guān)實體的元數(shù)據(jù)來完成把該節(jié)點標(biāo)識為占位符節(jié)點。在其他實施例中,占位符節(jié)點名稱的相獨立知識庫被維持。
在一些實施例中,規(guī)則可以指定可以在特定范圍(諸如應(yīng)用程序隔離范圍)修改特定資源。在那些情況下,擴展在步驟370的拷貝操作,以確定是否允許在找到候選資源實例的范圍或者子范圍中修改候選資源實例。如果不允許,那么就把候選資源實例拷貝到在其中允許修改它的范圍或者子范圍,該范圍或者子范圍可能不總是用戶隔離范圍,并且把新拷貝標(biāo)識為是文字資源實例(步驟372)。如果是這樣,就把候選資源實例標(biāo)識為是文字實例(步驟372),并且打開它并且把結(jié)果返回給請求者(步驟306)。
向回參考圖3A,文字資源實例,不管它是在步驟354中被定位的還是在步驟370被創(chuàng)建的,都打開它(步驟306)并且和把它返回給請求者(步驟310)。在一些實施例中,這一點是通過向操作系統(tǒng)發(fā)出一個″打開″命令并且把來自操作系統(tǒng)對″打開″命令的響應(yīng)返回給請求者來實現(xiàn)的。
如果代表用戶執(zhí)行的應(yīng)用程序刪除了本機資源,那么就把本機資源的聚合視圖呈現(xiàn)給該應(yīng)用程序(因為該虛擬范圍必須反映該刪除)。用于刪除資源請求是用于特殊類型修改的請求,一個通過把資源的存在完全除去來修改資源的請求也是。概念上,用以刪除資源的請求以類似于在圖3A中所概述的方式來進行,包括按照在圖3B中所概述的那樣確定文字資源。然而,步驟306對于隔離的資源和對重定向或者忽略的資源有不同的操作。對于重定向和忽略而言,文字資源被從系統(tǒng)范圍刪除。對于隔離,文字資源被″虛擬地″刪除,或者換言之,把它已經(jīng)被刪除這一事實記錄在用戶隔離范圍中。刪除的節(jié)點不包含任何數(shù)據(jù),被標(biāo)識為是刪除的,并且它和它的所有后繼都“不存在”。換言之,如果它是該資源或者是另外會滿足資源請求的資源的祖先,那么″資源沒有找到″錯誤就被返回給請求者。進一步的細(xì)節(jié)將在第4節(jié)中概述4。在一些實施例中,通過把事實記錄在附聯(lián)到一個節(jié)點或者該節(jié)點的雙親或者附聯(lián)到系統(tǒng)層中的某個其他相關(guān)實體的元數(shù)據(jù)來完成把該節(jié)點標(biāo)識為的刪除節(jié)點。在其他實施例中,刪除的節(jié)點名稱的相獨立的知識庫被維持在例如相獨立的子范圍中。
3.0在隔離環(huán)境中的安裝上述的應(yīng)用程序隔離范圍能夠被視為在其中相關(guān)聯(lián)應(yīng)用程序?qū)嵗毩⒂谌魏斡脩?,或者代表所有可能用戶的等效物而共享資源的范圍,該資源包括那些應(yīng)用程序?qū)嵗齽?chuàng)建的資源。這種資源的主類是當(dāng)應(yīng)用程序被安裝到操作系統(tǒng)上之時所創(chuàng)建的集合。如圖1A所示的,兩個不兼容應(yīng)用程序不能被安裝在相同的系統(tǒng)范圍中,但是此問題卻能夠通過把那些應(yīng)用程序中的至少一個安裝到隔離環(huán)境中來解決。
隔離范圍,或者與隔離范圍相關(guān)聯(lián)的應(yīng)用程序?qū)嵗?,能夠在″安裝模式″中被操作來支持對應(yīng)用程序的安裝。這與以下結(jié)合圖4-16描述的″執(zhí)行模式″形成相對比。在安裝模式下,應(yīng)用程序安裝程序與應(yīng)用程序隔離范圍相關(guān)聯(lián)并且假設(shè)是代表所有用戶在執(zhí)行。應(yīng)用程序隔離范圍對那個應(yīng)用程序?qū)嵗膭幼鳎秃孟袼恰逅杏脩簟宓挠脩舾綦x范圍,并且對于那個應(yīng)用程序?qū)嵗瑳]有任何用戶隔離范圍是活動的。
圖3C描繪當(dāng)接收到用以打開本機資源的請求表明文字資源正在被打開目的是為了修改它之時識別文字資源而在安裝模式中所采取的步驟的一個實施例。簡言之,因為沒有任何用戶隔離范圍是活動的,所就首先確定所請求的本機資源的應(yīng)用程序范圍的實例是否存在(步驟374)。如果應(yīng)用程序范圍的實例存在,那么就把它標(biāo)識文字資源實例(步驟384)。如果沒有任何應(yīng)用程序范圍的實例存在,那么就確定所請求的本機資源的系統(tǒng)范圍的實例是否存在(步驟376)。如果它不存在,那么就把錯誤條件返回給請求者,表明所請求的虛擬化資源不存在于虛擬范圍中(步驟377)。然而,如果系統(tǒng)范圍的資源存在,那么就把它標(biāo)識為候選資源實例(步驟378),并且檢查與候選實例相關(guān)聯(lián)的權(quán)限數(shù)據(jù)以確定是否允許修改那個實例(步驟380)。如果不允許,那么就把錯誤條件返回給請求者(步驟381),表明不允許修改虛擬化的資源。如果權(quán)限數(shù)據(jù)表明可以修改候選資源,那么因為用戶隔離范圍是活動的,就進行本機資源的候選實例的應(yīng)用程序范圍的拷貝(步驟382),并且把應(yīng)用程序范圍的實例標(biāo)識為對該請求的文字實例(步驟384)。在一些實施例中,把候選文件拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以指定把該文件拷貝到應(yīng)用程序隔離范圍。在其他實施例中,規(guī)則可以指定應(yīng)該把文件拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。沒有出現(xiàn)把文件拷貝到的那個隔離范圍中的所請求的文件的任何祖先都被創(chuàng)建為是在隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位拷貝的實例。
圖3D示出當(dāng)接收到一個創(chuàng)建本機資源的請求之時識別文字資源而在安裝模式下所采取的步驟的一個實施例。簡言之,因為沒有任何用戶隔離范圍是活動的,所以首先確定請求的本機資源的應(yīng)用程序范圍的實例是否存在(步驟390)。如果應(yīng)用程序范圍的實例存在,那么就可以把錯誤條件返回給請求者,表明該資源不能被創(chuàng)建(因為它已經(jīng)存在)(步驟392)。如果不存在任何應(yīng)用程序范圍的實例,那么可以確定請求的本機資源的系統(tǒng)范圍的實例是否存在(步驟394)。如果系統(tǒng)范圍的實例存在,那么就可以把錯誤條件返回給請求者,表明該資源不能夠被創(chuàng)建(因為它已經(jīng)存在)(步驟392)。在一些實施例中,使用來打開資源的請求可以指定該資源的任何現(xiàn)存的系統(tǒng)范圍的實例都可以被重寫。如果系統(tǒng)范圍的資源實例不存在,那么就可以應(yīng)用程序范圍的資源實例標(biāo)識為是將為完成該請求而創(chuàng)建的文字實例(步驟396)。
通過比較圖3B、圖3C和3D,能夠看出安裝模式是以和執(zhí)行模式相似的方式來操作的,伴隨有應(yīng)用程序隔離范圍代替用戶隔離范圍。換言之,修改持久的資源,包括創(chuàng)建新資源,發(fā)生在適當(dāng)?shù)膽?yīng)用程序隔離范圍中,而不是發(fā)生在適當(dāng)?shù)挠脩舾綦x范圍中。而且,對訪問現(xiàn)有的隔離的資源的虛擬化也忽略適當(dāng)?shù)挠脩舾綦x范圍并且開始搜索在應(yīng)用程序隔離范圍中的候選文字資源。
有兩個另外的情況,其中應(yīng)用程序隔離范圍以此方式操作以包含對現(xiàn)有的資源的修改和創(chuàng)建新資源。首先,可以是配置成在沒有用戶隔離層的情況下操作的隔離環(huán)境,或者是配置成在沒有用戶隔離范圍的情況下操作的虛擬范圍。在此情況下,應(yīng)用程序隔離范圍就是能夠隔離修改和新創(chuàng)建的資源的僅有的隔離范圍。其次,支配虛擬資源的特定集合的規(guī)則可以指定它們要被隔離到適當(dāng)?shù)膽?yīng)用程序隔離范圍而不是隔離到適當(dāng)?shù)挠脩舾綦x范圍中。此外,這意味著遵從該規(guī)則對資源的修改和創(chuàng)建將被隔離到適當(dāng)?shù)膽?yīng)用程序隔離范圍中,其中它們對于共享那個范圍的所有應(yīng)用程序?qū)嵗际强梢姷模皇潜桓綦x到用戶隔離范圍中,其中它們僅僅對執(zhí)行那些應(yīng)用程序?qū)嵗挠脩羰遣乓姷摹?br>
在再一些其他的實施例中,隔離環(huán)境可以被配置成允許某些資源在系統(tǒng)范圍中是被共享的,也就是說,隔離環(huán)境可以對于一個或者多個系統(tǒng)資源都有效,就好像不存在任何的用戶隔離范圍和應(yīng)用程序隔離范圍存在一樣。當(dāng)以修改為目的而訪問在系統(tǒng)范圍中共享的系統(tǒng)資源之時,就決不拷貝它們,因為它們被所有的應(yīng)用程序和所有的用戶共享著,即,它們是全局對象。
4.0詳細(xì)的虛擬化示例上述的方法和設(shè)備可以使用來虛擬化范圍寬的多種本機資源108。以下詳細(xì)地描述它們。
4.1文件系統(tǒng)虛擬化上述的方法和設(shè)備可以使用來虛擬化對文件系統(tǒng)的訪問。如上所述,文件系統(tǒng)普遍被組織在目錄的邏輯分層結(jié)構(gòu),目錄自身也是文件并且還可以包含其他目錄和數(shù)據(jù)。
4.1.1文件系統(tǒng)打開操作在簡要的概述中,圖4描繪在上述的虛擬化的環(huán)境中打開文件所采取的步驟的一個實施例。請求打開文件的請求被接收或者攔截(步驟402)。該請求包含文件名稱,它被隔離環(huán)境當(dāng)作虛擬文件名稱對待。適用于文件系統(tǒng)打開請求目標(biāo)的處理規(guī)則被確定(步驟404)。如果規(guī)則動作是″重定向″(步驟406),那么在該請求中所提供的虛擬文件名稱就被依照適用的規(guī)則映射到文字文件名稱(步驟408)。把用以使用文字文件名稱打開文字文件的請求傳遞到操作系統(tǒng)并且把來自來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟410)。如果取而代之規(guī)則動作是″忽略″(步驟406),那么該文字文件名稱就被確定為恰好是虛擬文件名稱(步驟412),并且把打開文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟410)。如果在步驟406該規(guī)則動作是″隔離″,那么就把對應(yīng)于在用戶隔離范圍中的虛擬文件名稱的文件名稱標(biāo)識為候選文件名稱(步驟414)。換言之,候選文件名稱通過把映射虛擬文件名稱適用的用戶隔離范圍專用的對應(yīng)本機文件名稱來形成。候選文件的存在的類別通過檢查用戶隔離范圍和與候選文件相關(guān)聯(lián)的任何元數(shù)據(jù)來確定(步驟416)。如果候選文件被確定具有″負(fù)存在″(因為候選文件或者它的在用戶隔離范圍中的祖先目錄之一被標(biāo)記為是刪除的),那么這就意味著請求的虛擬文件已知是不存在的。在此情況下,就把表明請求的文件沒有找到的錯誤條件返回給請求者(步驟422)。如果取而代之在步驟416候選文件被確定為具有″正存在″(因為候選文件存在于用戶隔離范圍中并且沒有被標(biāo)記為是占位符節(jié)點),那么該請求的虛擬文件就已知是存在的。把該候選文件標(biāo)識為是對該請求的文字文件(步驟418),并且把所發(fā)出的用于打開文字文件的請求和結(jié)果返回給請求者(步驟420)。然而,如果在步驟416,候選文件具有″中性存在″(因為候選文件不存在或者因為候選文件存在,但是卻被標(biāo)記為是占位符節(jié)點),那么就還不知道該虛擬文件存在還是不存在。在此種情況下,就把對應(yīng)于虛擬文件名稱的應(yīng)用程序范圍的文件名稱標(biāo)識為候選文件名稱(步驟424)。換言之,候選文件名稱通過把虛擬文件名稱映射對適用的應(yīng)用程序隔離范圍專用的對應(yīng)本機文件名稱來形成。候選文件的存在的類別通過檢查應(yīng)用程序隔離范圍和與候選文件相關(guān)聯(lián)的任何元數(shù)據(jù)來確定(步驟426)。如果候選文件被確定為具有″負(fù)存在″(因為候選文件或者它在應(yīng)用程序隔離范圍中祖先目錄被標(biāo)記為是刪除的),那么這就意味著所請求的虛擬文件已知是不存在的。在此情況下,把表明所請求的文件沒有被發(fā)現(xiàn)錯誤條件返回給請求者(步驟422)。如果取而代之在步驟426候選文件被確定為具有″正存在″(因為候選文件存在于應(yīng)用程序隔離范圍中并且沒有被標(biāo)記為是占位符節(jié)點),那么請求的虛擬文件就已知是存在的。檢查該請求以確定打開請求是否表明目的是修改文件(步驟428)。如果不是,那么就把該候選文件標(biāo)識為對該請求的文字文件(步驟418),并且把所發(fā)出的打開文字文件的請求和結(jié)果返回給請求者(步驟420)。然而,在步驟428,如果確定出打開請求表明目的是修改該文件,那么就檢查與該文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)以確定是否允許修改該文件(步驟436)。如果不允許,那么就把錯誤條件返回給請求者(步驟438)表明不允許修改該文件。如果權(quán)限數(shù)據(jù)表明可以修改該文件,那么就把候選文件拷貝到用戶隔離范圍(步驟440)。在一些實施例中,把候選文件拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以指定把該文件拷貝到應(yīng)用程序隔離范圍。在其他實施例中,規(guī)則可以指定應(yīng)該把該文件拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。沒有出現(xiàn)在把該文件拷貝到的那個隔離范圍中的請求的文件的任何祖先都被創(chuàng)建為是在隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位拷貝的實例。該范圍的實例被標(biāo)識為是文字文件(步驟442)并且把發(fā)出的打開文字文件的請求和結(jié)果返回給請求者(步驟420)。返回到步驟426,如果候選文件具有中性存在(因為候選文件不存在,或者因為候選文件被查找到來但是卻被標(biāo)記為是占位符節(jié)點),那么還尚不知道虛擬文件是存在還是不存在。在此情況下,把對應(yīng)于虛擬文件名稱的系統(tǒng)范圍的文件名稱標(biāo)識為是候選文件名稱(步驟430)。換言之,該候選文件名稱確切地就是虛擬文件名稱。如果候選文件不存在(步驟432),那么就把表明虛擬文件未被找到的錯誤條件返回給請求者(步驟434)。如果相反候選文件存在(步驟432),就檢查該請求以確定打開請求是否表明目的是修改該文件(步驟428)。如果不是,就把候選文件標(biāo)識為是對該請求的文字文件(步驟418),并且把所發(fā)出的打開文字文件的請求和結(jié)果返回給請求者(步驟420)。然而,如果,在步驟428,確定出該打開請求表明目的是修改該文件,那么就檢查與該文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)以確定是否允許修改該文件(步驟436)。如果不允許,就把錯誤條件返回給請求者(步驟438),表明不允許修改該文件。如果該權(quán)限數(shù)據(jù)表明可以修改該文件,就把候選文件拷貝到用戶隔離范圍(步驟440)。在一些實施例中,把該候選文件拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以指定把該文件拷貝到應(yīng)用程序隔離范圍。在其他實施例中,規(guī)則可以指定應(yīng)該把該文件拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。沒有出現(xiàn)在隔離范圍中請求的文件的任何祖先被創(chuàng)建為是在隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位拷貝的實例。該范圍的實例被標(biāo)識為是文字文件(步驟442)并且把所發(fā)出的打開文字文件請求和結(jié)果返回給請求者(步驟420)。
此實施例能夠稍做修改,用以檢查文件的存在而不是打開文件。把在步驟420中嘗試打開文字文件替換成檢查該文字文件的存在并且把狀態(tài)返回給請求者。
還參考圖4,并且現(xiàn)在更詳細(xì)地,打開虛擬文件的請求被接收或者攔截(步驟402)。對應(yīng)的文字文件可以屬于用戶隔離范圍,應(yīng)用程序隔離范圍或者系統(tǒng)范圍,或者可以把它的范圍定到應(yīng)用程序隔離子范圍或者用戶隔離子范圍。在一些實施例中,該請求被代替操作系統(tǒng)功能或者代替用于打開文件的功能的功能鉤住。在另一個實施例,掛鉤動態(tài)鏈接庫被使用來攔截該請求。掛鉤函數(shù)可以執(zhí)行在用戶模式中或者執(zhí)行在核心模式中。對于掛鉤函數(shù)執(zhí)行在用戶模式中的實施例而言,當(dāng)創(chuàng)建一個進程之時,掛鉤函數(shù)可以被加載到該進程的地址空間中。對于掛鉤函數(shù)執(zhí)行在核心模式中的實施例而言,掛鉤函數(shù)可以與在分派對本機文件的請求中使用的操作系統(tǒng)資源相關(guān)聯(lián)。對于為每種類型的文件操作都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)都可以被相獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),用以攔截對若干類型的文件操作的創(chuàng)建或者打開調(diào)用。
該請求包含文件名稱,該文件名稱被隔離環(huán)境作為虛擬文件名稱來對待處理。通過查閱規(guī)則引擎來確定適用于文件系統(tǒng)打開請求的處理規(guī)則(步驟404)。在一些實施例中,使用包括在打開請求中的虛擬名稱來確定適用于打開請求的處理規(guī)則。在一些實施例中,可以把規(guī)則引擎提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,規(guī)則引擎可以是樹形結(jié)構(gòu)的數(shù)據(jù)庫,哈希表,或者平面文件數(shù)據(jù)庫。在一些實施例中,把為請求的文件所提供的虛擬文件名稱用作進入規(guī)則引擎中用以定位施加到該請求的一個或者多個規(guī)則的索引。在這些實施例的特別實施例中,對于特別的文件,多個規(guī)則可以存在于規(guī)則引擎中,并且,在這些實施例中,與虛擬文件名稱具有最長前綴匹配的規(guī)則就是施加到該請求的規(guī)則。在其他實施例中,進程標(biāo)識符被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則(前提是如果存在一條規(guī)則的話)。與一個請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。盡管在圖4示為單個數(shù)據(jù)庫事務(wù)或者在一個文件中的單個查找,但是規(guī)則查找可以作為一個規(guī)則查找系列來執(zhí)行。
如果規(guī)則動作是″重定向″(步驟406),那么就依照適用的規(guī)則把在該請求中所提供的虛擬文件名稱映射到文字文件名稱(步驟408)。把用于打開用文字文件名稱所標(biāo)識的文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟410)。例如,打開名稱為″file_1″的文件的請求可以導(dǎo)致打開名稱為″Different_file_1″的文字文件。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把形成的文字名稱傳遞給該函數(shù)作為參數(shù)來實現(xiàn)的。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,使用虛擬名稱打開文件的第一請求導(dǎo)致從文件系統(tǒng)過濾器驅(qū)動器返回STATUS_REPARSE的響應(yīng),表明所確定的文字名稱。I/O管理器然后用包括在STATUS_REPARSE響應(yīng)中的確定的文字名稱來重新發(fā)出文件打開請求。
如果取而代之規(guī)則動作是″忽略″(步驟406),那么文字文件名稱就被確定為確切地是虛擬文件名稱(步驟412),并且把打開文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟410)。例如,打開名稱為″file_1″的文件的請求將導(dǎo)致打開實際上名稱為″file_1″的文件。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。
如果在步驟406規(guī)則動作是″隔離″,那么就把對應(yīng)于虛擬文件名稱的用戶范圍的文件名稱標(biāo)識為是候選文件名稱(步驟414)。換言之,候選文件名稱是通過把虛擬文件名稱映射到適用的用戶隔離范圍專用的對應(yīng)本機文件名稱來形成的。例如,打開名稱為″file_1″的文件的請求可能導(dǎo)致打開實際上名稱為″Isolated_file_1″的文件。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把形成的文字名稱傳遞給該函數(shù)作為參數(shù)來實現(xiàn)的。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,使用虛擬名稱打開文件的第一請求導(dǎo)致從文件系統(tǒng)過濾器驅(qū)動器返回STATUS_REPARSE響應(yīng),表明確定的文字名稱。I/O管理器然后使用包括在REPARSE響應(yīng)中的確定的文字名稱重新發(fā)出文件打開請求。
在一些實施例中,為隔離請求的系統(tǒng)文件而形成的文字名稱可以基于所接收的虛擬文件名稱和范圍專用的標(biāo)識符。范圍專用的標(biāo)識符可以是與應(yīng)用程序隔離范圍、用戶隔離范圍、會話隔離范圍、應(yīng)用程序隔離子范圍、用戶隔離子范圍或者以上各項的某一組合相關(guān)聯(lián)的標(biāo)識符。范圍專用的標(biāo)識符被使用來″弄亂(mangle)″在該請求中所接收的虛擬名稱。
在其他實施例中,用戶隔離范圍或者子范圍可以是一個目錄,在該目錄下存儲存在于用戶隔離范圍中的所有文件。在這些實施例的一些實施例中,用戶隔離目錄之下的目錄樹結(jié)構(gòu)反映所請求的資源的路徑。換言之,文字文件路徑是通過把虛擬文件路徑映射到用戶隔離范圍來形成。例如,如果所請求的文件是c:\temp\test.txt并且用戶隔離范圍目錄是d:\user1\APP1\,那么到用戶范圍的文字文件的路徑就可以是d:\user1\APP1\c\temp\test.txt。在其他實施例中,到用戶范圍的文字的路徑可以按照本機命名慣例加以定義。例如,到用戶范圍的文字文件的路徑可以是d:\user1\APP1\device\harddisk1\ternp\test.txt。在再一些其他的實施例中,用戶范圍的文件都可以被存儲具有挑選成是唯一的名稱的單個目錄,并且數(shù)據(jù)庫可以被使用來存儲在請求的文件名稱和存儲在該目錄中的對應(yīng)文字文件的名稱之間的映射。在再一些其他的實施例中,文字文件的內(nèi)容可以被存儲在數(shù)據(jù)庫中。在再一些其他的實施例中,本機文件系統(tǒng)為單個文件提供工具,用以包含多個獨立命名的″流″,并且用戶范圍的文件的內(nèi)容被存儲為在系統(tǒng)范圍中的相關(guān)聯(lián)文件的附加流。作為選擇,文字文件可以被存儲在顧客文件系統(tǒng)中,該顧客文件系統(tǒng)可以被設(shè)計成用于優(yōu)化磁盤使用率或者感興趣的其他準(zhǔn)則。
通過檢查用戶隔離范圍和與候選文件相關(guān)聯(lián)的任何元數(shù)據(jù)來確定候選文件的存在的類別(步驟416)。如果候選文件被確定具有″負(fù)存在″(因為候選文件或者它在用戶隔離范圍中的祖先目錄之一被標(biāo)記為是刪除的),那么這意味著請求的虛擬文件已知是不存在。在此情況下,把表明請求的文件沒有被發(fā)現(xiàn)的錯誤條件返回給請求者(步驟422)。
在一些實施例中,關(guān)于文件的少量元數(shù)據(jù)可以被直接地存儲在文字文件名稱中,諸如通過用元數(shù)據(jù)指示符給該虛擬名稱加上后綴,此處元數(shù)據(jù)指示符是唯一與特定的元數(shù)據(jù)狀態(tài)相關(guān)聯(lián)的字符串。元數(shù)據(jù)指示符可以指明元數(shù)據(jù)的一個或者若干比特或者對其編碼。用虛擬文件名訪問文件以檢查由于存在元數(shù)據(jù)指示符的原因而導(dǎo)致可能的文字文件名的變化的請求,和獲取文件自身的名稱的請求被鉤住或者攔截,以便用文字名稱作出應(yīng)答。在其他實施例中,該文件的一個或者多個備用名稱可以根據(jù)虛擬文件名稱并且元數(shù)據(jù)指示符來形成,并且可以使用由文件系統(tǒng)所提供的硬鏈路或者軟鏈路工具來創(chuàng)建。如果給出了一個請求用以使用鏈路的名稱來訪問文件,那么隔離環(huán)境可以通過表明該文件沒有被發(fā)現(xiàn)而向應(yīng)用程序隱瞞這些鏈路的存在。特定鏈路的存在或者缺失可以為每個元數(shù)據(jù)指示符指明元數(shù)據(jù)的一個比特,或者可以有一個這樣的鏈路,具有能夠表現(xiàn)為多個狀態(tài)以指明元數(shù)據(jù)的若干比特的元數(shù)據(jù)指示符。在再一些其他的實施例中,其中文件系統(tǒng)支持備用文件流,備用文件流可以被創(chuàng)建出來以包括元數(shù)據(jù),流的大小表明元數(shù)據(jù)的若干比特。在再一些其他的實施例中,文件系統(tǒng)可以直接地提供為文件系統(tǒng)中的每個文件都存儲某個第三方元數(shù)據(jù)的能力。
在這些實施例中的特定的一些實施例中,刪除的文件或者文件系統(tǒng)元素的列表可以被維持并且可以被查閱,用以優(yōu)化對刪除的文件的這一檢查。在這些實施例中,如果刪除文件被重新創(chuàng)建,那么該文件名稱就可以被從刪除的文件的列表中除去。在這些實施例的其他實施例中,如果該列表增長到超過某一大小,那么就可以從該列表中除去文件名稱。
如果取而代之在步驟416候選文件被確定為具有″正存在″(因為候選文件存在于用戶隔離范圍中并且沒有被標(biāo)記為是占位符節(jié)點),那么該請求的虛擬文件就已知是存在的。把候選文件標(biāo)識為是對該為該請求的文字文件(步驟418),并且把所發(fā)出的用以打開文字文件的請求和結(jié)果返回給請求者(步驟420)。
然而,如果在步驟416,候選文件具由有″中性存在″(因為候選文件不存在,或者因為候選文件存在但是卻被標(biāo)記為是占位符節(jié)點),那么就還尚不知道虛擬文件是存在還是不存在。在此情況下,把對應(yīng)于虛擬文件名稱的應(yīng)用程序范圍的文件名稱標(biāo)識為是候選文件名稱(步驟424)。換言之,候選文件名稱是通過把虛擬文件名稱映射到適用的應(yīng)用程序隔離范圍專用的本機文件名稱來形成。候選文件的存在的類別通過檢查應(yīng)用程序隔離范圍和與候選文件相關(guān)聯(lián)的任何元數(shù)據(jù)來確定(步驟426)。
如果應(yīng)用程序范圍的候選文件被確定為具有″負(fù)存在″(因為候選文件或者它在應(yīng)用程序隔離范圍中的祖先目錄之一被標(biāo)記為是刪除的),這就意味著請求的虛擬文件已知是不存在的。在此情況下,把表明請求的文件沒有被發(fā)現(xiàn)的錯誤條件返回給請求者(步驟422)。
如果在步驟426候選文件被確定為具有″正存在″(因為候選文件存在于應(yīng)用程序隔離范圍并且沒有被標(biāo)記為是占位符節(jié)點),那么該請求的虛擬文件就已知是存在的。檢查該請求以確定該打開請求是否表明目的是修改文件(步驟428)。如果不是,那么就把候選文件標(biāo)識為是對該請求的文字文件(步驟418),并且把所發(fā)出的用以打開文字文件的請求和結(jié)果返回給請求者(步驟420)。
然而,如果在步驟428,確定出打開請求表明目的是修改該文件,那么就檢查與該文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)以確定是否允許修改該文件(步驟436)。在一些實施例中,該權(quán)限數(shù)據(jù)被與應(yīng)用程序范圍的候選文件相關(guān)聯(lián)。在這些實施例的一些實施例中,把權(quán)限數(shù)據(jù)存儲在規(guī)則引擎中或者存儲在與該候選文件相關(guān)聯(lián)的元數(shù)據(jù)。在其他實施例中,與候選文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)由操作系統(tǒng)提供。另外,規(guī)則引擎可以包括配置設(shè)定,用于指示隔離環(huán)境遵從或者重載對資源的虛擬化拷貝的本機權(quán)限數(shù)據(jù)。在一些實施例中,規(guī)則可以為一些虛擬資源指定要在其中發(fā)生修改的范圍,例如系統(tǒng)范圍或者應(yīng)用程序隔離范圍或者子范圍,或者用戶隔離范圍或者子范圍。在一些實施例中,規(guī)則引擎可以根據(jù)分層結(jié)構(gòu)或者所訪問的資源類型指定施加到虛擬化的本機資源的子集的配置設(shè)定。在這些實施例的一些實施例中,配置設(shè)定對每個原子本機資源可以是專用的。在另一個例子中,規(guī)則引擎可以包括配置數(shù)據(jù),用于禁止或者允許修改某些類文件(諸如可執(zhí)行代碼或者MIME類型或者由操作系統(tǒng)所定義的文件類型)。
如果與候選文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)表明它不可以被修改,那么就把錯誤條件返回給請求者(步驟438),表明修改文件不被允許。如果權(quán)限數(shù)據(jù)表明該文件可以被修改,那么將把該候選文件拷貝到用戶隔離范圍(步驟440)。在一些實施例中,把候選文件拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以指定把該文件拷貝到另一個應(yīng)用程序隔離范圍。在其他實施例中,規(guī)則可以指定應(yīng)該把文件拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。沒有出現(xiàn)在把該文件拷貝到的那個隔離范圍中的請求的文件的任何祖先都被創(chuàng)建為是在隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位該拷貝的實例。
在一些實施例中,元數(shù)據(jù)被與拷貝到隔離范圍的文件相關(guān)聯(lián),它標(biāo)識拷貝該文件的日期和時間。此信息可以被使用來比較與該文件的拷貝的實例相關(guān)聯(lián)的時間標(biāo)記和上次修改該文件的原始實例的時間標(biāo)記或者上次修改位于更低隔離范圍中的該文件的另一個實例的時間標(biāo)記。在這些實施例中,如果該文件的原始實例或者位于更低隔離范圍中的該文件的實例與晚于該拷貝的時間標(biāo)記的時間標(biāo)記相關(guān)聯(lián),那么就可以把該文件拷貝到隔離范圍,用以更新該候選文件。在其他實施例中,該文件在隔離范圍中的拷貝可以與標(biāo)識包含被拷貝過的原始文件的范圍的元數(shù)據(jù)相關(guān)聯(lián)。
在進一步的實施例中,可以監(jiān)視拷貝到隔離范圍的文件(因為該文件已經(jīng)被打開目的是修改它們),以確定它們實際上是否被修改了。在一個實施例中,拷貝的文件可以被與當(dāng)該文件被實際地修改之時所指定的標(biāo)志相關(guān)聯(lián)。在這些實施例中,如果拷貝的文件實際上沒有被修改,那么就可以在把它關(guān)閉之后把它從它被拷貝到的范圍以及與該拷貝的文件相關(guān)聯(lián)的任何占位符中除去。
該范圍的實例被標(biāo)識為是文字文件(步驟442)并且把所發(fā)出的用以打開文字文件的請求和結(jié)果返回給請求者(步驟420)。
返回到步驟426,如果該候選文件具有中性存在(因為候選文件不存在,或者如果該候選文件被找到但是被標(biāo)記為是占位符節(jié)點,那么還尚不知道虛擬文件是存在還是不存在。在此情況下,把對應(yīng)于虛擬文件名稱的系統(tǒng)范圍的文件名稱標(biāo)識為是候選文件名稱(步驟430)。換言之,候選文件名稱恰好虛擬文件名稱。
如果該候選文件不存在(步驟432),就把表明虛擬文件未被找到的錯誤條件返回給請求者(步驟434)。如果相反該候選文件存在(步驟432),那么將檢查該請求以確定該打開請求是否表明目的是去修改該文件(步驟428)。
如上所述,如果候選文件正在被打開而目的不是去修改它,那么就把系統(tǒng)范圍的候選文件標(biāo)識為是對該請求的文字文件(步驟418),并且把所發(fā)出的用以打開文字文件的請求和結(jié)果返回給請求者(步驟420)。然而,如果在步驟428,確定該打開請求表明目的是去修改該文件,那么就檢查與該文件相關(guān)聯(lián)權(quán)限數(shù)據(jù),以確定是否允許修改該文件(步驟436)。在一些實施例中,權(quán)限數(shù)據(jù)與系統(tǒng)范圍的候選文件相關(guān)聯(lián)。在這些實施例的一些實施例中,權(quán)限數(shù)據(jù)被存儲在規(guī)則引擎中或者被存儲在與該候選文件相關(guān)聯(lián)的元數(shù)據(jù)中。在其他實施例中,與候選文件相關(guān)聯(lián)權(quán)限數(shù)據(jù)由操作系統(tǒng)提供。
如果與系統(tǒng)范圍的候選文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)表明該文件不可以被修改,那么就把錯誤條件返回給請求者(步驟438),表明不允許修改該文件。然而,如果該權(quán)限數(shù)據(jù)表明文件可以被修改,那么就把該候選文件拷貝到用戶隔離范圍(步驟440)。在一些實施例中,把該候選文件拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以指定把該文件拷貝到應(yīng)用程序隔離范圍或者可以把它留在系統(tǒng)范圍中。在其他實施例中,規(guī)則可以指定應(yīng)該把該文件拷貝到的那個特別的應(yīng)用程序隔離子范圍或者用戶隔離子范圍。沒有出現(xiàn)在隔離范圍中的該請求的文件的任何祖先被創(chuàng)建為是在隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位該拷貝的實例。
在一些實施例中,元數(shù)據(jù)與拷貝到隔離范圍的文件相關(guān)聯(lián),它標(biāo)識拷貝該文件之時的日期和時間。此信息可以被使用來比較與該文件的拷貝實例相關(guān)聯(lián)的時間標(biāo)記和上次修改該文件的原始實例時間標(biāo)記。在這些實施例中,如果該文件的原始實例與晚于該拷貝文件的時間標(biāo)記的時間標(biāo)記相關(guān)聯(lián),那么原始文件就可以被拷貝到隔離范圍,以更新該候選文件。在其他實施例中,拷貝到隔離范圍的候選文件可以與標(biāo)識從其拷貝了該原始文件的范圍的元數(shù)據(jù)相關(guān)聯(lián)。
在進一步實施例中,可以監(jiān)視拷貝到隔離范圍的文件(因為該文件已經(jīng)被打開目的是修改它們),以確定它們實際上是否被修改了。在一個實施例中,拷貝的文件可以被與當(dāng)該文件被實際地修改之時所設(shè)定的標(biāo)志相關(guān)聯(lián)。在這些實施例中,如果拷貝的文件實際上沒有被修改,那么就可以在把它關(guān)閉之后把它從它被拷貝到的范圍以及與該拷貝的文件相關(guān)聯(lián)的任何占位符中除去。在再一個實施例中,僅僅當(dāng)該文件被實際地修改之時才把該文件拷貝到適當(dāng)?shù)母綦x范圍。
把該范圍實例標(biāo)識為是文字文件(步驟442)并且把所發(fā)出的用以打開文字文件的請求和結(jié)果返回給請求者(步驟420)。
4.1.2文件系統(tǒng)刪除操作現(xiàn)在參考圖5,在一個簡潔的概況中,描繪了刪除文件所采取的步驟的一個實施例。用以刪除文件的請求被接收或者攔截(步驟502)。該請求包含文件名稱,該文件名稱被隔離環(huán)境當(dāng)作虛擬文件名稱對待處理。規(guī)則確定如何來處理文件操作(步驟504)。如果規(guī)則動作是″重定向″(步驟506),那么就依照該規(guī)則把該虛擬文件名稱直接地映射到文字文件名稱(步驟508)。把用以刪除文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟510)。如果該規(guī)則動作是″忽略″(步驟506),那么就把文字文件名稱標(biāo)識為確切地就是虛擬文件名稱(步驟513),并且把刪除文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟510)。如果該規(guī)則動作是″隔離″(步驟506),那么就確定該虛擬文件的存在(步驟514)。如果該虛擬文件不存在,那么就把錯誤條件返回給請求者,表明該虛擬文件不存在(步驟516)。如果該虛擬文件存在,并且如果該虛擬化的文件指定目錄而不是指定通常的文件,那么就查閱虛擬目錄以確定它是否包含任何虛擬文件或者虛擬子目錄(步驟518)。如果所請求的虛擬化文件是一個包含任何虛擬文件或者虛擬子目錄的虛擬目錄,那么該就不能夠刪除該虛擬目錄并且返回一個錯誤消息(步驟520)。如果該請求的虛擬化文件是通常的文件或者是一個不包含任何虛擬文件也不包含任何虛擬子目錄的虛擬目錄,那么就標(biāo)識對應(yīng)于該虛擬文件的文字文件(步驟522)。檢查與該文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)以確定是否允許刪除(步驟524)。如果不允許,那么就返回一個權(quán)限錯誤消息(步驟526)。然而,如果允許刪除該文件,并且如果該文字文件就處在適當(dāng)?shù)挠脩舾綦x范圍中(步驟528),那么就刪除該文字文件(步驟534)并且在該適當(dāng)?shù)挠脩舾綦x范圍中創(chuàng)建代表該刪除的虛擬文件的″刪除″節(jié)點(步驟536)。然而,如果在步驟528確定出該文字文件不處于用戶隔離范圍中,但是卻處于適當(dāng)?shù)膽?yīng)用程序隔離范圍或者系統(tǒng)范圍中,那么就創(chuàng)建不存在的請求文件的用戶范圍的實例的每個用戶范圍的祖先的實例并且把該它標(biāo)記為是占位符(步驟532)。這么做是為了在用戶隔離范圍中維持目錄結(jié)構(gòu)的邏輯分層結(jié)構(gòu)。然后在適當(dāng)?shù)挠脩舾綦x范圍中創(chuàng)建代表該刪除的虛擬文件的用戶范圍的″刪除″節(jié)點(步驟536)。
還參考圖5,更詳細(xì)地,用于刪除文件的請求被接收或者攔截(步驟502)。該文件可能屬于用戶隔離范圍,應(yīng)用程序隔離范圍,系統(tǒng)范圍,或者某個適用的隔離子范圍。在一些實施例中,該請求被代替操作系統(tǒng)函數(shù)或者用以刪除文件的函數(shù)的函數(shù)鉤住。在另一個實施例中,掛鉤動態(tài)鏈接庫被使用來攔截該請求。掛鉤函數(shù)可以執(zhí)行在用戶模式下,也可以執(zhí)行在核心模式下。對于掛鉤函數(shù)執(zhí)行在用戶模式下的實施例而言,當(dāng)創(chuàng)建一個進程之時,該掛鉤函數(shù)可以被加載到該進程的地址空間中。對于在該掛鉤函數(shù)執(zhí)行在核心模式下的實施例而言,該掛鉤函數(shù)可以被與在分派對本機文件的請求中所使用的操作系統(tǒng)資源相關(guān)聯(lián)。對于在為每一類型的文件都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)可以被獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它攔截對若干類型文件的創(chuàng)建或者打開調(diào)用。
該請求包含文件名稱,它被隔離環(huán)境當(dāng)做虛擬文件名稱對待處理。通過查閱規(guī)則引擎來確定適用于刪除操作的處理規(guī)則(步驟504)。在一些實施例中,為該請求的文件所提供的虛擬文件名稱被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例中的特別實施例中,對特別的文件,多個規(guī)則可以存在于規(guī)則引擎,在這些實施例中,與虛擬文件名稱具有最長前綴匹配的規(guī)則就是施加到該請求的規(guī)則。在一些實施例中,規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,規(guī)則引擎可以是樹形結(jié)構(gòu)的數(shù)據(jù)庫,哈希表或者平面文件數(shù)據(jù)庫。在一些實施例中,在該請求中所提供的虛擬文件名稱被用作進入到規(guī)則引擎中用以定位施加到該請求的一個或者多個規(guī)則的索引。在其他實施例中,進程標(biāo)識符被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則(如果存在一條規(guī)則的話)。與一個請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。盡管在圖5中示為一系列的判定,但是規(guī)則查找可以作為單個數(shù)據(jù)庫事務(wù)而發(fā)生。
如果該規(guī)則動作是″重定向″(步驟506),那么就依照適用的規(guī)則把該虛擬文件名稱直接地映射到文字文件名稱(步驟508)。把刪除文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟510)。例如,用以刪除名稱為″file_1″的文件的請求可以導(dǎo)致刪除實際上名稱為″Different_file_1″的文件。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且該所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,使用虛擬名稱刪除文件的第一請求導(dǎo)致從文件系統(tǒng)過濾器驅(qū)動器返回STATUS_REPARSE響應(yīng),表明確定的文字名稱。I/O管理器然后用包括在STATUS_REPARSE響應(yīng)中的確定文字名稱重新發(fā)出文件刪除請求。
在一些實施例中,與文字文件″Different_file_1″相關(guān)聯(lián)的操作系統(tǒng)權(quán)限可以防止刪除該文字文件。在這些實施例中,返回一條錯誤消息該文件不會被刪除。
如果該規(guī)則動作是″忽略″(步驟506),那么就把文字文件名稱標(biāo)識為確切就是虛擬文件名稱(步驟513),并且把刪除文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟510)。例如,刪除名稱為″file_1″是文件的請求導(dǎo)致刪除實際上名稱為″file_1″的文件。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,使用虛擬名稱來刪除該文件的第一請求導(dǎo)致從文件系統(tǒng)過濾器驅(qū)動器返回STATUS_REPARSE響應(yīng),表明文字名稱。I/O管理器然后使用包括在STATUS_REPARSE響應(yīng)中的確定的文字名稱重新發(fā)出文件刪除請求。
在一些實施例中,與文字文件″file_1″相關(guān)聯(lián)的操作系統(tǒng)權(quán)限可以防止刪除文字文件。在這些實施例中,返回一條錯誤消息該文件不會被刪除。
如果該規(guī)則動作是″隔離″(步驟506),那么就確定該虛擬文件的存在(步驟514)。如果該文件不存在,那么就返回錯誤表明該文件沒有被發(fā)現(xiàn)(步驟516)。
然而,如果在步驟518確定該文件存在但是它并不是通常的文件并且不是空的虛擬目錄,即,它包含虛擬文件或者虛擬子目錄,那么就返回一條錯誤消息表明該文件不可以被刪除(步驟520)。
然而,如果確定該文件是存在的并且該請求的虛擬化文件就是通常的文件或者是空虛擬目錄,即,它不包含任何虛擬文件也不包含任何虛擬子目錄(步驟518),那么就標(biāo)識對應(yīng)于該虛擬文件的文字文件(步驟522)。該文字文件名稱是根據(jù)由隔離規(guī)則所指定的虛擬文件名稱確定的。例如,刪除名稱為″file_1″的文件的請求可能導(dǎo)致刪除實際上名稱為″Isolated_file_1″的文件。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,使用虛擬名稱刪除文件的第一請求導(dǎo)致從文件系統(tǒng)過濾器驅(qū)動器返回STATUS_REPARSE響應(yīng),表明文字名稱。I/O管理器然后使用包括在STATUS_REPARSE響應(yīng)中的確定的文字名稱重新發(fā)出文件刪除請求。
一旦識別了該虛擬文件的文字文件,就確定該文字文件是否被可以刪除(步驟524)。如果該文件不可以被刪除,那么就返回一條錯誤表明該文件不會被刪除(步驟524)。在一些實施例中,權(quán)限數(shù)據(jù)與系統(tǒng)范圍的候選文件相關(guān)聯(lián)。在這些實施例的一些實施例中,權(quán)限數(shù)據(jù)被存儲在規(guī)則引擎中或者被存儲在與候選文件相關(guān)聯(lián)的元數(shù)據(jù)中。在其他實施例中,與該候選文件相關(guān)聯(lián)的權(quán)限數(shù)據(jù)由操作系統(tǒng)來提供。
然而,如果允許刪除文件,并且如果該文字文件就處于適當(dāng)?shù)挠脩舾綦x范圍中(步驟528),那么就刪除該文字文件(步驟534)并且在適當(dāng)?shù)挠脩舾綦x范圍中創(chuàng)建代表該刪除的虛擬文件的″刪除″節(jié)點(步驟536)。
然而,如果在步驟528確定出該文字文件不處于用戶隔離范圍中但卻處于適當(dāng)?shù)膽?yīng)用程序隔離范圍中或者處于系統(tǒng)范圍中,那么就創(chuàng)建不存在的請求的文件的用戶范圍的實例的每個用戶范圍的祖先的實例并且把該示例標(biāo)記為是占位符(步驟532)。這樣做是為了在用戶隔離范圍中維持目錄結(jié)構(gòu)的邏輯分層結(jié)構(gòu)。然后,在適當(dāng)?shù)挠脩舾綦x范圍中創(chuàng)建代表該刪除的虛擬文件的用戶范圍的″刪除″節(jié)點(步驟536)。在一些實施例中,把刪除的文件的身份標(biāo)識存儲在文件或者其他高速緩存存儲器中用以優(yōu)化對刪除的文件的檢查。
在一些實施例中,所定位的虛擬化文件可以與表明該虛擬化文件已經(jīng)被刪除的元數(shù)據(jù)相關(guān)聯(lián)。在某一別的實施例中,虛擬化文件的祖先(例如,包含該文件的更高目錄)與表明它被刪除的元數(shù)據(jù)相關(guān)聯(lián)。在這些實施例中,可以返回一條錯誤消息,表明該虛擬化文件確實不存在。在這些實施例的特定實施例中,刪除的文件或者文件系統(tǒng)元素的列表可以被維持并且被查閱用以優(yōu)化對刪除的文件的這一檢查。
4.1.3文件系統(tǒng)列舉操作現(xiàn)在參考圖6,在簡單的概況中,示出在描述的虛擬化環(huán)境中列舉目錄所采取的步驟的一個實施例。用于列舉的請求被接收或者攔截(步驟602)。該請求包含目錄名稱,該目錄名稱被隔離環(huán)境當(dāng)做虛擬目錄名稱對待處理。概念上,按照在第4.1.1節(jié)中所描述的那樣來確定虛擬目錄的存在(步驟603)。如果該虛擬目錄不存在,那么就把表明虛擬目錄沒有被發(fā)現(xiàn)的結(jié)果返回給請求者(步驟620)。如果取而代之該虛擬目錄存在,那么就查閱規(guī)則引擎來確定用于在列舉請求中所指定的目錄的規(guī)則(步驟604)。如果該規(guī)則指定動作是″重定向″(步驟606),那么就按照該規(guī)則所指定的那樣來確定對應(yīng)于該虛擬目錄名稱的文字目錄名稱(步驟608)并且列舉用該文字名稱所標(biāo)識的文字目錄,并且把列舉結(jié)果存儲在工作數(shù)據(jù)存儲器中(步驟612),之后是稍后所描述的步驟630。如果所指定的規(guī)則動作不是″重定向″而是″忽略,″(步驟610)那么該文字目錄名稱就恰好是虛擬目錄名稱(步驟613)并且列舉該文字目錄,并且把列舉結(jié)果存儲在工作數(shù)據(jù)存儲器中(步驟612),之后是稍后所描述的步驟630。然而,如果該規(guī)則動作指定″隔離,″那么首先就列舉系統(tǒng)范圍;也就是說,候選目錄名稱就恰好是虛擬目錄名稱,并且如果該候選目錄存在,就列舉它。把列舉結(jié)果存儲在工作數(shù)據(jù)存儲器中。如果該候選目錄不存在,工作數(shù)據(jù)存儲器在此階段就保持為空(步驟614)。接著,把該候選目錄標(biāo)識為是虛擬目錄的應(yīng)用程序范圍的實例,并且確定該選目錄的存在的類別(步驟615)。如果該候選目錄具有“負(fù)存在″,即,它或者它在該范圍的祖先之一被標(biāo)記為是刪除,那么在此范圍之內(nèi),它已知是被刪除的,并且這是通過清除工作數(shù)據(jù)存儲器來實現(xiàn)的(步驟642)。如果取而代之該候選目錄不具有負(fù)存在,就列舉該候選目錄并且把所獲得的任何列舉結(jié)果都?xì)w并到工作數(shù)據(jù)存儲器中。特別是,為在該列舉中的每一文件系統(tǒng)元素,確定它的存在的類別。具有負(fù)存在的元素被從該工作數(shù)據(jù)存儲器中除去,并且具有正存在的元素,即,存在并且并且沒有被標(biāo)記為是占位符并且也沒有被標(biāo)記為是被刪除的那些元素,被添加到工作數(shù)據(jù)存儲器,替換掉對應(yīng)的元素(如果一個元素已經(jīng)存在于該工作數(shù)據(jù)存儲器中)(步驟616)。
在任一情況下,都把該候選目錄標(biāo)識為是該虛擬目錄的用戶范圍的實例,并且確定該候選目錄的存在的類別(步驟617)。如果該候選目錄具有“負(fù)存在″,即,它或者它在該范圍中的一個祖先被標(biāo)記為是刪除的,那么在此范圍之內(nèi),它已知是被刪除的,并且這是通過此清除工作數(shù)據(jù)存儲器(來表明的步驟644)。如果取而代之該候選目錄不具有負(fù)存在,那么就列舉該候選目錄并且把獲得的任何列舉結(jié)果都?xì)w并工作數(shù)據(jù)存儲器中。特別地,為該列舉中的每個文件系統(tǒng)元素,都確定它的存在的類別。具有負(fù)存在的元素被從工作數(shù)據(jù)存儲器中除去,并且具有正存在的元素,即,那些存在并且被標(biāo)記為是占位符并且沒有被標(biāo)記為是被刪除的元素,被添加到工作數(shù)據(jù)存儲器,如果一個元素已經(jīng)存在于工作數(shù)據(jù)存儲器中,那么就替換對應(yīng)的元素(步驟618),之后就是以下所描述的步驟630。
然后,為所有三種類型的規(guī)則,執(zhí)行步驟630。查詢規(guī)則引擎以查找其過濾器匹配該請求的目錄的直接孩子但是卻不匹配該請求的目錄自身的規(guī)則集合(步驟630)。為該集合中的規(guī)則,使用在第4.1.1節(jié)所概述的邏輯來查詢其名稱匹匹配在規(guī)則中名稱的虛擬孩子的存在。如果該孩子具有正存在,那么就把它添加到工作數(shù)據(jù)存儲器,替換已經(jīng)在那里具有相同的名稱的任何孩子。如果孩子具有負(fù)存在,那么就除去在工作數(shù)據(jù)存儲器中對應(yīng)于該孩子的條目(如果存在的話)。(步驟632)。最后,把所構(gòu)造的列舉然后從工作數(shù)據(jù)存儲器返回給請求者(步驟620)。
還參考圖6,更詳細(xì)地,接收或者攔截用于列舉目錄的請求(步驟602)。在一些實施例中,該請求被替換操作系統(tǒng)函數(shù)或者用于列舉目錄的函數(shù)的函數(shù)鉤住。在另一實施例中,掛鉤動態(tài)鏈接庫被使用來攔截該請求。該掛鉤函數(shù)可以執(zhí)行在用戶模式中也可以執(zhí)行在核心模式中。對于該掛鉤函數(shù)執(zhí)行在用戶模式下的實施例而言,當(dāng)創(chuàng)建進程之時,可以把該掛鉤函數(shù)加載到該進程的地址空間中。對于該掛鉤函數(shù)執(zhí)行在核心模式下的實施例而言,該掛鉤函數(shù)可以被與在分派對文件操作的請求中所使用的操作系統(tǒng)資源相關(guān)聯(lián)。對于為每種類型的文件操作都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)都可以被獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它攔截對若干類型的文件操作的創(chuàng)建或者打開調(diào)用。
確定該虛擬目錄的存在(步驟603)。這按照在第4.1.1節(jié)所描述的那樣來實現(xiàn)。如果該虛擬目錄不存在,那么它就不能夠被列舉,并且把表明該虛擬目錄不存在的結(jié)果返回給請求者(步驟620)。
該請求包含目錄名稱,該目錄名稱被隔離環(huán)境當(dāng)作虛擬目錄名稱處理對待。如果該虛擬目錄存在,那么就通過查閱規(guī)則引擎來定位用于確定要如何處理列舉操作的規(guī)則(步驟604)。在一些實施例中,該規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,該規(guī)則引擎可以樹形結(jié)構(gòu)的數(shù)據(jù)庫,哈希表,或者平面文件數(shù)據(jù)庫。在一些實施例中,為該請求的目錄所提供的虛擬目錄名稱被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例的特別實施例中,對于特別的目錄,多個規(guī)則都可以存在于該規(guī)則引擎中,在這些實施例中,與該虛擬目錄名稱最有最長前綴匹配的規(guī)則就是施加到該請求的規(guī)則。在其他實施例中,進程標(biāo)識符被使用來在該規(guī)則引擎中定位施加到該請求的規(guī)則(如果存在一個規(guī)則的話)。與請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。盡管在圖6中示為是單個數(shù)據(jù)庫事務(wù)或者在文件中的單個查找,但是規(guī)則查找可以作為一系列規(guī)則查找來執(zhí)行。
如果規(guī)則動作是″重定向″(步驟606),那么虛擬目錄名稱就被依照該規(guī)則直接地映射到文字目錄名稱(步驟608)。把列舉文字目錄的請求傳遞到操作系統(tǒng)(步驟612)并且按照稍后的描述來執(zhí)行步驟630。例如,列舉名稱為″directory_1″的目錄的請求可能導(dǎo)致列舉名稱為″Difierent_directory_1″的文字目錄。在一個實施例中,這是通過調(diào)用原始版本掛鉤函數(shù)并且把形成文字名稱傳遞到函數(shù)作為參數(shù)來實現(xiàn)的。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,使用虛擬名稱打開列舉的目錄的第一請求導(dǎo)致″STATUS_REPARSE″請求響應(yīng),表明確定的文字名稱。I/O管理器然后使用包括在該STATUS_REPARSE響應(yīng)中的確定的文字名稱重新發(fā)出對列舉的目錄打開請求。
如果該規(guī)則動作不是″重定向″(步驟606),而是″忽略″(步驟610),那么就把該文字目錄名稱標(biāo)識為是恰好是虛擬目錄名稱(步驟613),并且把列舉文字目錄的請求傳遞到操作系統(tǒng)(步驟612)并且按照稍后所描述的那樣來執(zhí)行步驟630。例如,列舉名稱為″directory_1″的目錄的請求將導(dǎo)致列舉實際上名稱為″directory_1″的目錄。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到函數(shù)作為參數(shù)來實現(xiàn)的。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,使用虛擬名稱來列舉目錄的第一請求被過濾器驅(qū)動器不加修改地傳遞下去。
如果所在步驟610所確定的規(guī)則動作不是″忽略″而是″隔離″,那么就列舉系統(tǒng)范圍,也就是說,在該請求中所提供的虛擬名稱被使用來標(biāo)識列舉的目錄(步驟614)。把列舉的結(jié)果存儲在工作數(shù)據(jù)存儲器中。在一些實施例中,該工作數(shù)據(jù)存儲器由存儲器元件組成。在其他實施例中,該工作數(shù)據(jù)存儲器包括數(shù)據(jù)庫或者文件或者固態(tài)存儲器元件或者持久的數(shù)據(jù)存儲器。
接著,把候選目錄標(biāo)識為是該虛擬目錄的應(yīng)用程序范圍的實例,并且確定該候選目錄的存在的類別(步驟615)。如果該候選目錄具有“負(fù)存在″,即,它或者它在該范圍中的祖先被標(biāo)記為是刪除,那么在此范圍之內(nèi)它就已知是被刪除的,并且這是通過清除工作數(shù)據(jù)存儲器來表明的(步驟642)。
在一些實施例中,關(guān)于文件的一些量的元數(shù)據(jù)可以直接地存儲在文字文件名稱中,諸如通過給虛擬名稱加上一個元數(shù)據(jù)指示符的后綴,此處元數(shù)據(jù)指示符是唯一地與特定元數(shù)據(jù)狀態(tài)相關(guān)聯(lián)的字符串。該元數(shù)據(jù)指示符可以表明或者編碼元數(shù)據(jù)的一個或者若干個比特。請求用虛擬文件名訪問文件以檢查由于存在元數(shù)據(jù)指示符而導(dǎo)致的文字文件名的可能的變化的請求和用于獲取該文件自身的名稱的請求被鉤住或者攔截,以便用文字名稱作出應(yīng)答。在其他實施例中,該文件的一個或者多個備用名稱可以根據(jù)虛擬文件名稱和元數(shù)據(jù)指示符來形成,并且可以使用由文件系統(tǒng)所提供的硬鏈路或者軟鏈路工具來創(chuàng)建。如果給出一個請求用于使用鏈路的名稱來訪問文件,那么這些鏈路的存在就可以由隔離環(huán)境通過表明該文件沒有被發(fā)現(xiàn)項應(yīng)用程序隱瞞。特定鏈路的存在者缺失都可以為每個元數(shù)據(jù)指示符指明元數(shù)據(jù)的一個比特,或者可以有一個具有元數(shù)據(jù)指示符能夠呈現(xiàn)為多個狀態(tài)以表明元數(shù)據(jù)的若干比特的鏈路。在再一些其他的實施例中,其中文件系統(tǒng)支持備用文件流,備用文件流可以被創(chuàng)建用以包括元數(shù)據(jù),該流的大小表明元數(shù)據(jù)的若干比特。在再一些其他的實施例中,文件系統(tǒng)可以直接地提供為文件系統(tǒng)中的每個文件都存儲某個第三方元數(shù)據(jù)的能力。在再又一個實施例中,相獨立的子范圍可以被使用來記錄刪除的文件,并且文件(沒有被標(biāo)記為是占位符)在那個子范圍中的存在,就意味著該文件被刪除。
如果取而代之該候選目錄不具有負(fù)存在,那么就列舉候選目錄并且把所獲得的任何列舉結(jié)果歸并到工作數(shù)據(jù)存儲器中。特別地,為該列舉中的每個文件系統(tǒng)元件,確定它的存在的類別。具有負(fù)存在的元素被從工作數(shù)據(jù)存儲器中除去,并且具有正存在的元素,即,那些存在并且沒有被標(biāo)記為是占位符并且沒有被標(biāo)記為是被刪除的元素,被添加到工作數(shù)據(jù)存儲器,替換掉對應(yīng)的元素(如果一個元素已經(jīng)存在與工作數(shù)據(jù)存儲器中)(步驟616)。
在任一情況下,把候選目錄標(biāo)識為是該虛擬目錄的用戶范圍的實例,并且該候選目錄的存在的類別被確定(步驟617)。如果該候選目錄具有“負(fù)存在″,即,它或者它在該范圍中的一個祖先被標(biāo)記為是刪除的,那么在此范圍之內(nèi)它就已知是被刪除的,并且這是通過此清除工作數(shù)據(jù)存儲器來實現(xiàn)的(步驟644)。如果取而代之該候選目錄不具有負(fù)存在,那么該候選目錄就被列舉并且所獲得的任何列舉結(jié)果就被歸并到工作數(shù)據(jù)存儲器中。特別地,為該列舉中的每個文件系統(tǒng)元素,確定它的存在的類別。具有負(fù)存在的元素被從工作數(shù)據(jù)存儲器中除去,并且具有正存在的元素,即,那些存在并且沒有被標(biāo)記為是占位符并且沒有被標(biāo)記為是刪除的元素,被添加到工作數(shù)據(jù)存儲器,替換掉對應(yīng)的元素(如果一個元素已經(jīng)存在于工作數(shù)據(jù)存儲器中)(步驟618),之后是以下所描述的步驟630。
然后,對于所有三種類型的規(guī)則,執(zhí)行步驟630。查詢該規(guī)則引擎以查找其過濾器匹配該請求的目錄的直接孩子但是卻不匹配該請求的目錄自身的規(guī)則集合(步驟630)。對于該集合中的每個規(guī)則,使用在第4.1.1節(jié)所概述的邏輯來查詢其名稱匹配該規(guī)則中的名稱的虛擬孩子的存在。如果該孩子具有正存在,就把它添加到工作數(shù)據(jù)存儲器,替換掉已經(jīng)在那里的具有相同的名稱的任何孩子。如果該孩子具有負(fù)存在,那么就除去在工作數(shù)據(jù)存儲器中對應(yīng)于該孩子的條目(如果存在的話)。(步驟632)。最后,把所構(gòu)造的列舉然后從工作數(shù)據(jù)存儲器返回給請求者(步驟620)。
本領(lǐng)域普通技術(shù)人員將會認(rèn)識到把上述的分層的列舉過程做較小的修改就能夠應(yīng)用到列舉包括多個隔離子范圍的單個隔離范圍的操作上。工作數(shù)據(jù)存儲器被創(chuàng)建,相繼的子范圍被列舉并且把結(jié)果歸并到工作數(shù)據(jù)存儲器中以形成隔離范圍的聚合列舉。
4.1.4.文件系統(tǒng)創(chuàng)建操作現(xiàn)在參考圖7,在簡單的概況中,示出在隔離環(huán)境中創(chuàng)建文件所采取的步驟的一個實施例。用于創(chuàng)建文件的請求被接收或者攔截(步驟702)。該請求包含文件名稱,該文件名稱被隔離環(huán)境當(dāng)作虛擬文件名稱來處理對待。試圖去使用適用的規(guī)則,即,使用適當(dāng)?shù)挠脩艉蛻?yīng)用程序隔離范圍使用全虛擬化打開所請求的文件,如以在4.1.1節(jié)中所描述的(步驟704)。如果訪問被拒絕(步驟706),那么就把訪問拒絕錯誤返回給請求者(步驟709)。如果訪問被許可(步驟706),并且所請求的文件被成功地打開(步驟710),那么就把所請求的文件返回給請求者(步驟712)。然而,如果訪問被許可(步驟706),但是該請求的文件卻沒有被打開(步驟710),那么如果該請求的文件的雙親也不存在(步驟714),就向請求者發(fā)出適合于該請求語義的錯誤(步驟716)。如果相反使用適當(dāng)?shù)挠脩艉蛻?yīng)用范圍在全虛擬化的視圖中找到了該請求的文件的雙親(步驟714),那么規(guī)則就確定該文件操作如何被處理(步驟718)。如果該規(guī)則動作是″重定向″或者″忽略″(步驟720),那么就依照規(guī)則把該虛擬文件名稱直接地映射到文字文件名稱。特別地,如果規(guī)則動作是″忽略″,那么就把該文字文件名稱標(biāo)識為確切地就是虛擬文件名稱。如果取而代之,該規(guī)則動作是″重定向″,那么就根據(jù)該規(guī)則所指定的虛擬文件名稱來確定文字文件名稱。然后把創(chuàng)建該文字文件的請求傳遞到操作系統(tǒng),并且把該結(jié)果返回給請求者(步驟724)。如果相反,在步驟720中所確定的該規(guī)則動作是″隔離″,那么就把該文字文件名稱標(biāo)識為是該虛擬文件名稱在用戶隔離范圍中的實例。如果該文字文件已經(jīng)存在,但是卻與表明它是占位符或者它被刪除的元數(shù)據(jù)相關(guān)聯(lián),那么就修改該相關(guān)聯(lián)的元數(shù)據(jù)以便除去那些表明,并且確保該文件是空的。在任一情況下,把打開該文字文件的請求傳遞到到操作系統(tǒng)(步驟726)。如果該文字文件被成功地打開過了(步驟728),那么就把該文字文件返回給請求者(步驟730)。如果相反,在步驟728,該請求的文件沒有打開,就把當(dāng)前不存在于用戶隔離范圍中的文字文件的每個祖先的占位符(步驟732)和用于使用文字名稱去創(chuàng)建該文字文件的請求傳遞到操作系統(tǒng)并且把該結(jié)果返回給請求者(步驟734)。
還參考圖7,更詳細(xì)地,創(chuàng)建文件的請求被接收或者攔截(步驟702)。在一些實施例中,該請求被替換掉操作系統(tǒng)函數(shù)或者用于創(chuàng)建文件的函數(shù)的函數(shù)鉤住。在另一實施例中,掛鉤動態(tài)鏈接庫被使用來攔截該請求。該掛鉤函數(shù)可以執(zhí)行在用戶模式下也可以執(zhí)行在核心模式下。對于該掛鉤函數(shù)執(zhí)行在用戶模式下的實施例而言,當(dāng)創(chuàng)建一個進程之時,就可以把該掛鉤函數(shù)加載到該進程的地址空間中。對于該掛鉤函數(shù)執(zhí)行在核心模式中的實施例而言,可以把該掛鉤函數(shù)與在分派對文件的請求中所使用的操作系統(tǒng)資源相關(guān)聯(lián)。對于為每種類型的文件操作都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)都可以被獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它攔截對若干類型的文件操作的創(chuàng)建或者打開調(diào)用。
該請求包含文件名稱,該文件名稱被隔離環(huán)境當(dāng)作虛擬文件名稱對待處理。請求者試圖去使用適用的規(guī)則,即,使用適當(dāng)?shù)挠脩艉蛻?yīng)用程序隔離范圍使用全虛擬化打開請求的文件,如在第4.1.1中所描述的那樣(步驟704)。如果在全虛擬化的打開操作期間訪問被拒絕(步驟706),那么就把訪問拒絕錯誤返回給請求者(步驟709)。如果訪問被許可(步驟706),并且該請求的虛擬文件被成功地打開(步驟710),那么就把對應(yīng)的文字文件返回給請求者(步驟712)。然而,如果訪問被許可(步驟706),但是該請求的文件卻沒有被成功地打開(步驟710),那么就已經(jīng)確定出該虛擬文件是不存在的。如果該請求的虛擬文件的虛擬雙親也不存在,正如在第4.1.1中的過程所確定的那樣(步驟714),那么就向請求者發(fā)出適合于請求語義的錯誤(步驟716)。如果相反,使用適當(dāng)?shù)挠脩艉蛻?yīng)用范圍在全虛擬化的視圖中找到了該請求的虛擬文件的虛擬雙親(步驟714),那么就通過查閱規(guī)則引擎來定位用于確定如何來處理創(chuàng)建操作的規(guī)則(步驟718)。在一些實施例中,該規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,該規(guī)則引擎可以是樹形結(jié)構(gòu)的數(shù)據(jù)庫,哈希表,或者平面文件數(shù)據(jù)庫。在一些實施例中,為該請求的文件所提供的虛擬文件名稱被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例的特別實施例中,對于特別的文件,多個規(guī)則都可以存在于該規(guī)則引擎中,并且在這些實施例的一些實施例中,與虛擬文件名稱具有最長前綴匹配的規(guī)則就是施加到該請求的規(guī)則。在一些實施例中,進程標(biāo)識符被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則(如果一條規(guī)則存在的話)。與請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。盡管在圖7中示為單個數(shù)據(jù)庫事務(wù)或者在文件中的單個查找,但是該規(guī)則查找可以作為一系列的規(guī)則查找來執(zhí)行。
如果該規(guī)則動作是″重定向″或者″忽略″(步驟720),那么就依照規(guī)則把該虛擬文件名稱直接地映射到文字文件名稱(步驟724)。如果該規(guī)則動作是″重定向″(步驟720),那么就根據(jù)由該規(guī)則所指定的虛擬文件名稱來確定文字文件名稱(步驟724)。如果該規(guī)則動作是″忽略″(步驟720),那么該文字文件名稱就被確定為確切地就是該虛擬文件名稱(步驟724)。如果該規(guī)則動作是″忽略″或者該規(guī)則動作是″重定向″,那么就把使用所確定的文字文件名稱創(chuàng)建該文字文件的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟724)。例如,創(chuàng)建虛擬名稱為″file_1″的文件的請求就可能導(dǎo)致可以創(chuàng)建名稱為″Different_file1″的文字文件。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的(步驟724)。對于使用文件系統(tǒng)過濾器驅(qū)動器的實施例而言,請求使用虛擬名稱打開文件的第一請求導(dǎo)致″STATUS_REPARSE″的請求響應(yīng),它表明該確定的文字名稱。I/O管理器然后就使用在STATUS_REPARSE響應(yīng)中所包括的確定文字名稱重新發(fā)出文件打開請求。
如果在步驟720中所確定的規(guī)則動作不是″忽略″也不是″重定向″而是″隔離″,那么就把該文字文件名稱標(biāo)識為是該虛擬文件名稱在用戶隔離范圍中的實例。如果該文字文件已經(jīng)存在,但是卻與表明它是占位符或者它被刪除的元數(shù)據(jù)相關(guān)聯(lián),那么就修改該相關(guān)聯(lián)的元數(shù)據(jù)以便除去那些表明,并且確保該文件是空的。
在一些實施例中,關(guān)于文件的一些量元數(shù)據(jù)可以被直接地存儲文字文件名稱中,諸如通過給該虛擬名稱添加上元數(shù)據(jù)指示符的后綴,此處元數(shù)據(jù)指示符是唯一地與特定元數(shù)據(jù)狀態(tài)相關(guān)聯(lián)的字符串。該元數(shù)據(jù)指示符可以表明或者編碼或者元數(shù)據(jù)的若干比特。請求用虛擬文件名訪問文件以檢查由于元數(shù)據(jù)指示符的存在而導(dǎo)致文字文件名的可能的變化的請求并且請求獲取該文件自身的名稱的請求被鉤住或者攔截,以便用該文字名稱來應(yīng)答。在其他實施例中,該文件的一個或者多個備用名稱可以根據(jù)虛擬文件名稱和元數(shù)據(jù)指示符來形成,并且可以使用由文件系統(tǒng)所提供的硬鏈路或者軟鏈路工具來創(chuàng)建。如果給出了一個請求,請求使用鏈路的名稱來訪問文件,那么這些鏈路的存在可以被隔離環(huán)境通過表明該文件沒有被發(fā)現(xiàn)向應(yīng)用程序隱瞞。特定鏈路的存在或者缺失可以為每個元數(shù)據(jù)指示符指明元數(shù)據(jù)的一個比特,或者可以有一個這樣的鏈路,具有能夠表現(xiàn)為多個狀態(tài)以指明元數(shù)據(jù)的若干比特的元數(shù)據(jù)指示符。在再一些其他的實施例中,其中文件系統(tǒng)支持備用文件流,備用文件流可以創(chuàng)建出來以包括元數(shù)據(jù),流的大小指明元數(shù)據(jù)的若干比特。在再一些其他的實施例中,文件系統(tǒng)可以直接地提供為文件系統(tǒng)中的每個文件存儲某一第三方元數(shù)據(jù)的能力。
在這些實施例中的特定的一些實施例中,刪除的文件或者文件系統(tǒng)元素的列表可以被維持并且可以被查閱,用以優(yōu)化對刪除的文件的這一檢查。在這些實施例中,如果刪除文件被重新創(chuàng)建,那么該文件名稱就可以被從刪除的文件的列表中除去。在這些實施例的其他實施例中,如果該列表增長到超過某一大小,那么就可以從該列表中除去文件名稱。
在任一情況下,把請求打開用戶范圍的文字文件的請求傳遞到操作系統(tǒng)(步驟726)。在一些實施例中,規(guī)則可以指定對應(yīng)于該虛擬文件的文字文件應(yīng)該被創(chuàng)建在不同于用戶隔離范圍的范圍,諸如應(yīng)用程序隔離范圍,系統(tǒng)范圍,用戶隔離子范圍或者應(yīng)用程序隔離子范圍。
如果文字文件被成功地打開了(步驟728),就把文字文件返回給請求者(步驟730)。如果相反,在步驟728,該請求的文件未能打開,那么就為當(dāng)前不存在于用戶隔離范圍中的文字文件的每個祖先創(chuàng)建占位符(步驟732)并且把請求使用文字名稱創(chuàng)建文字文件的請求傳遞到操作系統(tǒng)并且把該結(jié)果返回給請求者(步驟734)。
此實施例用于具有僅僅支持每個調(diào)用/引用創(chuàng)建一個級別的API或者工具的操作系統(tǒng)。對于本領(lǐng)域技術(shù)人員而言顯而易見是能夠擴展到每個調(diào)用/引用多個級別。
4.1.5短文件名稱管理在一些文件系統(tǒng),可以向每個文件賦予短文件名稱和長名稱這兩種名稱。任一種名稱都可以被使用來在上述的任何文件操作中訪問文件。對于具有短文件名稱和長文件名稱這兩種文件名稱的每一文件而言,這就隱含地在分配給該文件的短文件名稱和長文件名稱之間創(chuàng)建了關(guān)聯(lián)。在這些文件系統(tǒng)中的一些文件系統(tǒng),短名稱是由文件系統(tǒng)自動地分配給使用長文件名稱所創(chuàng)建的文件的。如果在短文件名和長文件名之間的關(guān)聯(lián)沒有被隔離環(huán)境維持,那么處于相同目錄但是卻處于不同范圍級別中的文件名稱長度不同的文件卻可以相同短文件名稱,如果使用該短名稱來訪問虛擬文件,這就會導(dǎo)致多義性。作為選擇,當(dāng)把文件拷貝到用戶隔離范圍以供修改之時,該短文件名稱可以變化,這就意味著不再能夠使用原始短名稱來訪問虛擬文件了。
為了防止這些問題,首先,拷貝已打開目的是修改到″更高″范圍的文件實例的文件系統(tǒng)操作保護在與該拷貝的實例相關(guān)聯(lián)的短文件名和長文件名之間的關(guān)聯(lián)。其次,為新創(chuàng)建的隔離文件創(chuàng)建唯一的短名稱來代替由操作系統(tǒng)所分配的文件名稱。所生成的短文件名稱應(yīng)該滿足以下條件所生成的文件名稱不匹配于處于在相同的隔離范圍中的相同目錄下或者處于在″較低″隔離的范圍中的相同目錄下的任何現(xiàn)有短文件名稱。例如,給位于在用戶隔離范圍中的文件的實例所生成的短文件名應(yīng)該不匹配處于該目錄的應(yīng)用程序范圍的實例中或者處于該目錄的系統(tǒng)范圍的實例中的現(xiàn)有短文件名稱。
現(xiàn)在參考圖7A,示出在創(chuàng)建新文件之后分配唯一短文件名稱所采取的步驟的一個實施例。在簡短的概況中,檢查以確定是否應(yīng)該生成短文件名稱(步驟752)。如果不應(yīng)該,那么就返回一個狀態(tài),以表明將不生成任何短文件名(步驟754)。否則,就依照文件系統(tǒng)檢查該文件名以確定它是否已經(jīng)是合法的短文件名(步驟756)。如果它已經(jīng)是合法的短文件名稱,就返回一個狀態(tài),表明將不生成任何短名稱(步驟754)。否則,就構(gòu)造一個適合的短文件名(步驟758)。
還參考圖7A,并且更詳細(xì)地,作出檢查以便確定是否應(yīng)該生成短文件名稱(步驟752)。在一些實施例中,可以根據(jù)存儲該文件名所指代的文件的設(shè)備來作出這一判定。在其他實施例中,可以為某些范圍或者子范圍,或者為隔離環(huán)境作為洞而啟用短文件名稱的生成。在這些實施例的一些實施例中,注冊表設(shè)定可以規(guī)定是否將為特別的文件名稱生成短文件名。如果不應(yīng)該生成任何短文件名,那么就返回一個狀態(tài),以表明將不生成任何短文件名(步驟754)。
否則,就檢查該文件名以便確定它是否已經(jīng)是合法的短文件名(步驟756)。在一些實施例中,合法的短文件名稱在文件名中包含多達8個字符并且和在可選的擴展名中包含多達三個字符。在一些實施例中,合法的短名稱包含僅僅合法字符,諸如A-Z,a-z,0-9,`,~,!,@,#,$,%,^,&,*,(,),-,_,′,{,and}。在一些實施例中,開始的空格或者″.″或者嵌入一個以上的″.″是不合法的。如果所提供的文件名已經(jīng)是合法的短文件名稱,那么就返回一個狀態(tài),以表明將不生成任何的短文件名(步驟754)。
否則,如果在步驟756確定出該文件名是不合法的短文件名稱,那么就構(gòu)造一個合適的短文件名(步驟758)。在一些實施例中,這是通過使用長文件名中在短文件名稱中使用起來是合法的某一些部分與編碼的迭代計數(shù)相結(jié)合以形成候選短文件名稱來實現(xiàn)的。該迭代計數(shù)在增加著,直到相關(guān)聯(lián)的候選短文件名變?yōu)楹线m為止,也就是說,直到它是不被處于相同范圍中的相同目錄下或者處于更低范圍中的相同目錄下的任何其他文件使用的合法短文件名。在其他實施例中,把長文件名弄亂或者做哈希處理并且編碼,然后與編碼的迭代計數(shù)相結(jié)合來形成候選短文件名稱。該迭代計數(shù)在增加著,直到相關(guān)聯(lián)的候選短文件名變得合適為止,也就是說,直到它是不被處于相同范圍中的相同目錄下或者處于更低范圍中的相同目錄下的任何其他文件使用的合法短文件名。在所有這些實施例中,范圍專用的字符串可以被并入到候選短文件名以增加幾率一個合適的候選短文件名將能以低的迭代計數(shù)被查找。
4.2注冊表虛擬化上述的方法和設(shè)備可以被使用來虛擬化對注冊表數(shù)據(jù)庫的訪問。如上所述,注冊表數(shù)據(jù)庫存儲關(guān)于在物理上附聯(lián)到計算機的硬件、哪些系統(tǒng)選項已經(jīng)被選擇、計算機存儲器怎樣設(shè)立、應(yīng)用程序特定的數(shù)據(jù)的各種項目以及當(dāng)操作系統(tǒng)被起動之時應(yīng)該存在什么應(yīng)用程序的信息。注冊表數(shù)據(jù)庫普遍都被組織在″鍵″170,172的邏輯分層結(jié)構(gòu),所述鍵是注冊表值的容器。
4.2.1注冊表鍵打開操作在簡潔的概況中,圖8描繪了在上述的隔離環(huán)境中打開注冊表鍵所采取的步驟的一個實施例。請求打開注冊表鍵的請求被接收或者攔截,該請求包含注冊表鍵名稱,該注冊表鍵名稱被隔離環(huán)境當(dāng)作虛擬鍵名稱對待處理(步驟802)。適用于該請求中的虛擬名稱的處理規(guī)則確定如何來處理注冊表鍵操作(步驟804)。如果該規(guī)則動作是″重定向″(步驟806),那么就把在該請求中所提供的虛擬鍵名稱映射到由適用的規(guī)則所規(guī)定的文字鍵名稱(步驟808)。把請求使用該文字鍵名稱打開文字注冊表鍵的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟810)。如果該規(guī)則動作不是″重定向″,而是″忽略″(步驟806),那么就把該虛擬鍵名稱標(biāo)識為是文字鍵名稱(步驟812),并且把請求打開去文字注冊表鍵的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟810)。如果在步驟806中所確定的該規(guī)則動作不是″重定向″也不是″忽略,″而是″隔離″,那么就把在該請求中所提供的虛擬鍵名稱映射到用戶范圍的候選鍵名稱,即,一個對應(yīng)于適用的用戶隔離范圍專用的虛擬鍵名稱的鍵名稱(步驟814)。用戶范圍的候選鍵的存在的類別被通過檢查用戶隔離范圍和與該候選鍵相關(guān)聯(lián)的任何元數(shù)據(jù)來確定(步驟816)。如果該候選鍵被確定具有″負(fù)存在″(因為該候選鍵或者它在用戶隔離范圍中的一個祖先鍵被標(biāo)記為是刪除的),那么這就意味著該請求的虛擬鍵已知是不存在的。在此情況下,把表明該請求的文件沒有被發(fā)現(xiàn)的錯誤條件返回給請求者(步驟822)。如果取而代之在步驟816該候選鍵被確定具有″正存在″(因為該候選鍵存在于用戶隔離范圍中并且沒有被標(biāo)記為是占位符節(jié)點),那么該請求的虛擬鍵就已知是存在的。把該候選鍵標(biāo)識為是對該請求的文字鍵(步驟818),并且把發(fā)出請求打開該文字鍵的請求和結(jié)果返回給請求者(步驟820)。然而,如果在步驟816,該候選鍵具有″中性存在″(因為該候選鍵不存在,或者該候選鍵存在但是被標(biāo)記為是占位符節(jié)點),那么就還尚不知道該虛擬鍵存在還是不存在。在此情況下,把對應(yīng)于該虛擬鍵名稱的應(yīng)用程序范圍的鍵名稱標(biāo)識為是候選鍵名稱(步驟824)。換言之,該候選鍵名稱是通過把虛擬鍵名稱映射到適用的應(yīng)用程序隔離范圍專用的對應(yīng)本機鍵名稱來形成。該候選鍵的存在的類別通過檢查應(yīng)用程序隔離范圍和與該候選鍵相關(guān)聯(lián)的任何元數(shù)據(jù)來確定(步驟826)。如果該候選鍵被確定具有″負(fù)存在″(因為該候選鍵或者它在該應(yīng)用程序隔離范圍中的一個祖先鍵被標(biāo)記為是刪除的),那么這就意味著該請求虛擬鍵已知是不存在的。在此情況下,把表明該請求的鍵沒有被發(fā)現(xiàn)的錯誤條件返回給請求者(步驟822)。如果取而代之在步驟826該候選鍵被確定為是具有″正存在″(因為該候選鍵存在于該應(yīng)用程序隔離范圍中并且沒有被標(biāo)記為是占位符節(jié)點),那么該請求的虛擬鍵就已知是存在的。檢查該請求以確定打開請求是否表明目的是修改該鍵(步驟828)。如果不是,那么就把該候選鍵標(biāo)識為是對該請求的文字鍵(步驟818),并且把發(fā)出的請求打開該文字鍵的請求和結(jié)果返回給請求者(步驟820)。然而,如果在步驟828,確定出該打開請求表明目的是去修改該鍵,那么就檢查與該鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù),用以確定是否允許修改該鍵(步驟836)。如果不允許,那么就把錯誤條件返回給請求者(步驟838),表明不允許修改該鍵。如果該權(quán)限數(shù)據(jù)表明可以修改該鍵,那么就把該候選鍵拷貝到用戶隔離范圍(步驟840)。在一些實施例中,把該候選鍵拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以規(guī)定把該鍵拷貝到應(yīng)用程序隔離范圍。在其他實施例中,該規(guī)則可以規(guī)定應(yīng)該把該鍵拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。把沒有出現(xiàn)在把該鍵拷貝到的那個隔離范圍中的該請求的鍵的任何祖先創(chuàng)建為是在該隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位該拷貝的實例。把新拷貝的范圍的實例標(biāo)識為是文字鍵(步驟842)并且把發(fā)出的請求打開文字鍵的請求和結(jié)果返回給請求者(步驟820)。返回到步驟826,如果該候選鍵具有中性存在(因為該候選鍵不存在或者因為該候選鍵被找到了但是卻被標(biāo)記為是占位符節(jié)點),那么就尚不知道該虛擬鍵是存在還是不存在。在此情況下,把對應(yīng)于該虛擬鍵名稱的系統(tǒng)范圍的鍵名稱標(biāo)識為是候選鍵名稱(步驟830)。換言之,該候選鍵名稱就恰好是虛擬鍵名稱。如果該候選鍵不存在(步驟832),那么就把表明該虛擬鍵未被找到的錯誤條件返回給請求者(步驟834)。如果相反該候選鍵存在(步驟832),那么就檢查該請求以便確定打開請求是否表明目的是修改該鍵(步驟828)。如果不是,那么就把該候選鍵標(biāo)識為是對該請求的文字鍵(步驟818),并且把發(fā)出的請求打開該文字鍵的請求和結(jié)果返回給該請求者(步驟820)。然而,如果在步驟828,確定出該打開請求表明目的是修改該鍵,那么就檢查與該鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù),用以確定是否允許修改該鍵(步驟836)。如果不允許,那么就把錯誤條件返回給請求者(步驟838),表明不允許修改該鍵。如果該權(quán)限數(shù)據(jù)表明可以修改該鍵,那么就把該候選鍵拷貝到用戶隔離范圍(步驟840)。在一些實施例中,把該候選鍵拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以規(guī)定把該鍵拷貝到應(yīng)用程序隔離范圍。在其他實施例中,該規(guī)則可以規(guī)定應(yīng)該把該鍵拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。把沒有出現(xiàn)在該隔離范圍中的請求的鍵的任何祖先創(chuàng)建為是占位符隔離范圍,以便正確地在分層結(jié)構(gòu)中定位該拷貝的實例。把新拷貝的范圍實例標(biāo)識為是文字鍵(步驟842)并且把發(fā)出的請求打開該文字鍵的請求和結(jié)果返回給請求者(步驟820)。
還參考圖8并且更詳細(xì)地,請求打開虛擬注冊表鍵的請求被接收或者攔截(步驟802)。對應(yīng)的文字注冊表鍵可以屬于用戶隔離范圍,應(yīng)用程序隔離范圍或者系統(tǒng)范圍,或者它的范圍可以屬于應(yīng)用程序隔離子范圍或者用戶隔離子范圍。在一些實施例中,該請求被替換操作系統(tǒng)函數(shù)或者替換用于打開注冊表鍵的函數(shù)的函數(shù)鉤住。在另一個實施例中,掛鉤動態(tài)鏈接庫被使用來攔截該請求。該掛鉤函數(shù)可以執(zhí)行在用戶模式下也可以執(zhí)行在核心模式下。對于該掛鉤函數(shù)執(zhí)行在用戶模式下的實施例而言,當(dāng)創(chuàng)建進程之時,可以把該掛鉤函數(shù)加載到該進程的地址空間中。對于該掛鉤函數(shù)執(zhí)行在核心模式下的實施例而言,該掛鉤函數(shù)可以被與在分派對本機注冊表鍵的請求中所使用的操作系統(tǒng)資源相關(guān)聯(lián)。對于為每種類型的注冊表鍵操作都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)都可以被單獨地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它攔截創(chuàng)建或者打開對若干類型的注冊表鍵操作的調(diào)用。
該請求包含注冊表鍵名稱,該注冊表鍵名稱被隔離環(huán)境當(dāng)作虛擬注冊表鍵名稱來對待處理。通過查閱規(guī)則引擎來確定適用于注冊表鍵打開請求的處理規(guī)則(步驟804)。在一些實施例中,該規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,該規(guī)則引擎可以樹形結(jié)構(gòu)數(shù)據(jù)庫,哈希表,或者平面文件數(shù)據(jù)庫。在一些實施例中,為請求的注冊表鍵所提供的虛擬注冊表鍵名稱被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例的特別實施例中,對于特別的注冊表鍵,多個規(guī)則都可以存在于該規(guī)則引擎中,并且在這些實施例中,與該虛擬注冊表鍵名稱具有最長前綴匹配的規(guī)則就是施加到該請求的規(guī)則。在其他實施例中,進程標(biāo)識符被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則(如果一條規(guī)則存在的話)。與請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。盡管在圖8中示為單個數(shù)據(jù)庫事務(wù)或者在文件中單個查找,但是規(guī)則查找可以作為一系列規(guī)則查找來執(zhí)行。
如果該規(guī)則動作是″重定向″(步驟806),那么就依照適用的規(guī)則把在該請求中所提供的虛擬注冊表鍵名稱映射到文字注冊表鍵名稱(步驟808)。把請求使用該文字注冊表鍵名稱打開文字注冊表鍵的請求傳遞到操作系統(tǒng)并且把來自于該操作系統(tǒng)的結(jié)果返回給請求者(步驟810)。例如,請求打開名稱為″registry_key_1″的注冊表鍵的請求就可能導(dǎo)致打開名稱為″Different_registry_key_1″的文字注冊表鍵。在一個實施例中,這是通過調(diào)用原始版本掛鉤函數(shù)并且把所形成的文字名稱傳遞到函數(shù)作為參數(shù)來實現(xiàn)的。在其他實施例中,概念上與文件系統(tǒng)過濾器驅(qū)動器工具相類似的注冊表過濾器驅(qū)動器工具可以由操作系統(tǒng)提供。在這些實施例中,打開文字注冊表鍵可以通過向注冊表過濾器管理器發(fā)信號通知去使用確定的文字鍵名稱來重新解析請求打開虛擬鍵的原始請求來應(yīng)答該原始請求而實現(xiàn)。如果取而代之該規(guī)則動作是″忽略″(步驟806),那么該文字注冊表鍵名稱就被確定為確切地就是該虛擬注冊表鍵名稱(步驟812),并且把請求打開文字注冊表鍵的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟810)。例如,請求打開名稱為″registry_key_1″的注冊表鍵將導(dǎo)致打開名稱為″registry_key_1″的文字注冊表鍵。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到函數(shù)作為參數(shù)來實現(xiàn)的。在另一實施例中,這是通過向注冊表過濾器管理器發(fā)信號通知繼續(xù)以通常的方式去處理該原始的未經(jīng)修改的請求。
如果在步驟806該規(guī)則動作是″隔離″,那么就把對應(yīng)于該虛擬注冊表鍵名稱的用戶范圍的注冊表鍵名稱標(biāo)識為是候選注冊表鍵名稱(步驟814)。換言之,該候選注冊表鍵名稱是通過把虛擬注冊表鍵名稱映射到適用的用戶隔離范圍專用的對應(yīng)本機注冊表鍵名稱來實現(xiàn)的。例如,請求打開名稱為″registry_key_1″的注冊表鍵可能導(dǎo)致打開名稱為″Isolated_UserScope_UserA_registry_key_1″的文字注冊表鍵。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。在其他實施例中,打開文字注冊表鍵可以通過向注冊表過濾器管理器發(fā)信號通知去使用確定的文字鍵名稱來重新解析請求打開該虛擬鍵的原始請求來應(yīng)答該請求。
在一些實施例中,為了隔離請求的虛擬注冊表鍵而形成的文字名稱可以基于所接收的虛擬注冊表鍵名稱和范圍專用的標(biāo)識符。該范圍專用的標(biāo)識符可以是與應(yīng)用程序隔離范圍,用戶隔離范圍,會話隔離范圍,應(yīng)用程序隔離子范圍,用戶隔離子范圍或者以上的某一組合相關(guān)聯(lián)的標(biāo)識符。范圍專用的標(biāo)識符被使用來″弄亂″在該請求中所接收的虛擬名稱。
在其他實施例中,用戶隔離范圍或者子范圍可以是注冊表鍵,在該注冊表鍵下存儲所有存在于該用戶隔離范圍中的鍵。在這些實施例的一些實施例中,在用戶隔離鍵之下的鍵分層結(jié)構(gòu)反映出所請求的資源的路徑。換言之,該文字鍵路徑是通過把虛擬鍵路徑映射到用戶隔離范圍而形成的。例如,如果請求的鍵是HKLM\Software\Citrix\MyKey并且用戶隔離范圍鍵是HKCU\Software\UserScope\,那么到該用戶范圍的文字鍵的路徑就可以是HKCU\Software\UserScope\HKLM\Software\Citrix\MyKey。在其他實施例中,到用戶范圍的文字的路徑可以按照本機命名慣例來定義。例如,到用戶范圍的文字鍵的路徑可以HKCU\Software\UserScop\Registry\Machine\Software\Citrix\MyKey。在再一些其他的實施例中,用戶范圍的鍵可以都被存儲在具有挑選成是唯一的名稱的單個鍵之下,并且數(shù)據(jù)庫可以被使用來存儲在請求的鍵名稱和存儲在用戶隔離鍵中的對應(yīng)于文字鍵的名稱之間的映射。在再一些其他的實施例中,該文字鍵的內(nèi)容可以被存儲在數(shù)據(jù)庫或者存儲在文件存儲器中。
候選鍵的存在的類別通過檢查用戶隔離范圍和與該候選鍵相關(guān)聯(lián)的任何元數(shù)據(jù)來確定(步驟816)。如果該候選鍵被確定具有″負(fù)存在″(因為該候選鍵或者它在用戶隔離范圍中的一個祖先鍵被標(biāo)記為是刪除的),那么這這就意味著該請求虛擬鍵已知是不存在的。在此情況下,把表明該請求的鍵沒有被發(fā)現(xiàn)的錯誤條件返回給請求者(步驟822)。
在一些實施例中,該文字注冊表鍵可以被與表明該虛擬化的注冊表鍵已經(jīng)被刪除的元數(shù)據(jù)相關(guān)聯(lián)。在一些實施例中,關(guān)于注冊表鍵的元數(shù)據(jù)被可以存儲在由那個鍵所保持的不同的值中,那個值的存在對注冊表API的通常應(yīng)用程序的使用是隱瞞著的。在一些實施例中,關(guān)于注冊表鍵的一些量的元數(shù)據(jù)可以直接地存儲在文字鍵名稱中,諸如通過給該虛擬名稱添加一個元數(shù)據(jù)指示符作為后綴,此處元數(shù)據(jù)指示符是唯一地與特定元數(shù)據(jù)狀態(tài)相關(guān)聯(lián)的字符串。該元數(shù)據(jù)指示符可以表明或者編碼元數(shù)據(jù)的一個或者若干比特。請求用虛擬名稱訪問該鍵以檢查由于存在元數(shù)據(jù)指示符而導(dǎo)致該文字鍵名稱的可能的變化的請求和請求獲取該鍵自身的名稱的請求被鉤住或者攔截,以便用該文字名稱做出應(yīng)答。在其他實施例中,該元數(shù)據(jù)指示符可以被編碼在子鍵名稱或者注冊表值名稱中,而不是被編碼在該鍵名稱自身中。在再一些其他的實施例中,注冊表鍵系統(tǒng)可以直接地提供為每個鍵都存儲某個第三方元數(shù)據(jù)的能力。在一些實施例中,元數(shù)據(jù)被存儲在的數(shù)據(jù)庫在或者存儲在獨立于該注冊表數(shù)據(jù)庫的其他知識庫中。在一些實施例中,相獨立的子范圍可以被使用來存儲那些被標(biāo)記為是刪除的鍵。鍵在該子范圍中的存在表明該鍵被標(biāo)記為是刪除的。
在這些實施例中的特定實施例中,刪除的鍵或者鍵系統(tǒng)元素的列表可以被維持和被查閱,用以優(yōu)化對刪除的鍵的這一檢查。在這些實施例中,如果刪除的鍵被重新創(chuàng)建,那么該鍵名稱就可以被從刪除的鍵的列表中除去。在這些實施例的其他實施例中,如果該列表增長到超過某一大小,那么鍵名稱就可以被除去該列表中除去。
如果取而代之在步驟816該候選鍵被確定是具有″正存在″(因為該候選鍵存在于用戶隔離范圍并且沒有被標(biāo)記為是占位符節(jié)點),那么該請求的虛擬鍵就已知是存在的。把該候選鍵標(biāo)識為是對該請求的文字鍵(步驟818),并且把發(fā)出的請求打開該文字鍵的請求和結(jié)果返回給請求者(步驟820)。
然而,如果在步驟816,該候選鍵具有″中性存在″(因為該候選鍵不存在或者該候選鍵存在但是卻被標(biāo)記為是占位符節(jié)點),那么就尚不知道該虛擬鍵存在還是不存在。在此情況下,把對應(yīng)于虛擬鍵名稱的應(yīng)用程序范圍的鍵名稱標(biāo)識為是候選鍵名稱(步驟824)。換言之,該候選鍵名稱是通過把該虛擬鍵名稱映射對適用的應(yīng)用程序隔離范圍專用的本機鍵名稱來形成的。該候選鍵的存在的類別是通過檢查該應(yīng)用程序隔離范圍和與該候選鍵相關(guān)聯(lián)的任何元數(shù)據(jù)來確定的(步驟826)。
如果該應(yīng)用程序范圍的候選鍵被確定是具有″負(fù)存在″(因為該候選鍵或者它在該應(yīng)用程序隔離范圍中的一個祖先鍵被標(biāo)記為是刪除的),那么這就意味著該請求的虛擬鍵已知是不存在的。在此情況下,把表明該請求的鍵沒有被發(fā)現(xiàn)的錯誤條件返回給請求者(步驟822)。
然而,如果在步驟826該候選鍵被確定為是具有″正存在″(因為該候選鍵存在于該應(yīng)用程序隔離范圍中并且沒有被標(biāo)記為是占位符節(jié)點),那么該請求的虛擬鍵就已知是存在的。檢查該請求以便確定打開請求是否表明目的是修改該鍵(步驟828)。如果不是,那么就把該候選鍵標(biāo)識為是對該請求的文字鍵(步驟818),并且把發(fā)出的請求打開該文字鍵的請求和結(jié)果返回給請求者(步驟820)。
然而,如果在步驟828,確定出該打開請求表明目的是修改該鍵,那么就檢查與該鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù),以便確定是否允許修改的鍵(步驟836)。在一些實施例中,該權(quán)限數(shù)據(jù)被與應(yīng)用程序范圍的候選鍵相關(guān)聯(lián)。在這些實施例的一些實施例中,把該權(quán)限數(shù)據(jù)存儲在規(guī)則引擎中或者存儲在與該候選鍵相關(guān)聯(lián)的元數(shù)據(jù)。在其他實施例中,與該候選鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù)由操作系統(tǒng)來提供。進而,該規(guī)則引擎可以包括配置設(shè)定,用于指示隔離環(huán)境去遵從或者重載資源的虛擬化的拷貝的本機權(quán)限數(shù)據(jù)。在一些實施例中,該規(guī)則可以為一些虛擬資源規(guī)定要在其中發(fā)生修改的范圍,例如該系統(tǒng)范圍或者應(yīng)用程序隔離范圍或者子范圍,或者用戶隔離范圍或者子范圍。在一些實施例中,該規(guī)則引擎可以根據(jù)分層結(jié)構(gòu)規(guī)定施加到該虛擬化的本機資源的子集的配置設(shè)定。在這些實施例的一些實施例中,該配置設(shè)定對每個原子本機資源可以專用的。
如果與該候選鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù)表明不可以修改它,那么就把錯誤條件返回給請求者(步驟838),表明不允許修改該鍵。如果該權(quán)限數(shù)據(jù)表明可以修改該鍵,那么就把該候選鍵拷貝到用戶隔離范圍(步驟840)。在一些實施例中,把該候選鍵拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以規(guī)定把該鍵拷貝到另一個應(yīng)用程序隔離范圍。在其他實施例中,該規(guī)則可以規(guī)定應(yīng)該把該鍵拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。將沒有出現(xiàn)在把該鍵拷貝到的那個隔離范圍中的該請求的鍵的任何祖先創(chuàng)建為是在該隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位該拷貝的實例。
在一些實施例中,元數(shù)據(jù)被與所拷貝到隔離范圍的鍵相關(guān)聯(lián),它標(biāo)識拷貝該鍵之時的日期和時間。此信息可以被使用來比較與該鍵的拷貝的實例相關(guān)聯(lián)的時間標(biāo)記和上次修改該鍵的原始實例或者位于更低隔離范圍中的鍵的另一個實例的時間標(biāo)記。在這些實施例中,如果該鍵的原始實例,或者位于更低隔離范圍中的該鍵的另一個實例被與與晚于該拷貝的鍵的時間標(biāo)記的時間標(biāo)記相關(guān)聯(lián),那么就可以把該鍵拷貝到隔離范圍,用以更新該候選鍵。在其他實施例中,在隔離范圍中對該鍵的拷貝可以與標(biāo)識包含被拷貝過的原始鍵的范圍的元數(shù)據(jù)相關(guān)聯(lián)。
在進一步的實施例中,可以監(jiān)視拷貝到隔離范圍的鍵(因為該鍵已經(jīng)被打開目的是修改它們),以確定它們實際上是否被修改了。在一個實施例中,拷貝的鍵可以與當(dāng)該鍵被實際地修改之時所設(shè)定的標(biāo)志相關(guān)聯(lián)。在這些實施例中,如果拷貝的鍵實際上沒有被修改,那么就可以在把它關(guān)閉之后把它從它被拷貝到的范圍以及與該拷貝的鍵相關(guān)聯(lián)的任何占位符中除去。
該范圍的實例被標(biāo)識為是文字鍵(步驟842)并且把所發(fā)出的用以打開文字鍵的請求和結(jié)果返回給請求者(步驟820)。
返回到步驟826,如果該候選鍵具有中性存在(因為候選鍵不存在),或者如果該候選鍵被找到但是被標(biāo)記為是占位符節(jié)點,那么還尚不知道該虛擬鍵是存在還是不存在。在此情況下,把對應(yīng)于虛擬鍵名稱的系統(tǒng)范圍的鍵名稱標(biāo)識為是候選鍵名稱(步驟830)。換言之,該候選鍵名稱恰好就是虛擬鍵名稱。
如果該候選鍵不存在(步驟832),就把表明虛擬鍵未被找到的錯誤條件返回給請求者(步驟834)。如果相反該候選鍵存在(步驟832),那么將檢查該請求以確定打開請求是否表明目的是去修改該鍵(步驟828)。
如上所述,如果該候選鍵正在被打開而目的不是去修改它,那么就把系統(tǒng)范圍的候選鍵標(biāo)識為是對該請求的文字鍵(步驟818),并且把所發(fā)出的請求打開文字鍵的請求和結(jié)果返回給請求者(步驟820)。然而,如果在步驟828,確定出該打開請求表明目的是去修改該鍵,那么就檢查與該鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù),以確定是否允許修改該鍵(步驟836)。在一些實施例中,權(quán)限數(shù)據(jù)與應(yīng)用程序范圍的候選鍵相關(guān)聯(lián)。在這些實施例的一些實施例中,權(quán)限數(shù)據(jù)被存儲在規(guī)則引擎中或者被存儲在與該候選鍵相關(guān)聯(lián)的元數(shù)據(jù)中。在其他實施例中,與該候選鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù)由操作系統(tǒng)提供。另外,規(guī)則引擎可以包括配置設(shè)定,用于指示隔離環(huán)境去遵從或者重載資源的虛擬化拷貝的本機權(quán)限數(shù)據(jù)。在一些實施例中,規(guī)則可以為一些虛擬資源指定要在其中發(fā)生修改的范圍,例如系統(tǒng)范圍或者應(yīng)用程序隔離范圍或者子范圍,或者用戶隔離范圍或者子范圍。在一些實施例中,規(guī)則引擎可以根據(jù)分層結(jié)構(gòu)規(guī)定施加到虛擬化的本機資源的子集的配置設(shè)定。在這些實施例的一些實施例中,配置設(shè)定對每個原子本機資源可以是專用的。
如果與該系統(tǒng)范圍的候選鍵相關(guān)聯(lián)的權(quán)限數(shù)據(jù)表明不可以修改該鍵,那么就把錯誤條件返回給請求者(步驟838),表明不允許修改該鍵。然而,如果該權(quán)限數(shù)據(jù)表明可以修改該鍵,那么就把候選鍵拷貝到用戶隔離范圍(步驟840)。在一些實施例中,把候選鍵拷貝到由規(guī)則引擎所定義的位置。例如,規(guī)則可以規(guī)定把該鍵拷貝到應(yīng)用程序隔離范圍或者可以把它留在系統(tǒng)范圍中。在其他實施例中,規(guī)則可以規(guī)定應(yīng)該把該鍵拷貝到的那個特定應(yīng)用程序隔離子范圍或者用戶隔離子范圍。沒有出現(xiàn)在隔離范圍中的請求的鍵的任何祖先被創(chuàng)建為是在隔離范圍中的占位符,以便正確地在分層結(jié)構(gòu)中定位拷貝的實例。
在一些實施例中,元數(shù)據(jù)與拷貝到隔離范圍的該鍵相關(guān)聯(lián),它標(biāo)識拷貝該鍵的日期和時間。此信息可以被使用來比較與該鍵的拷貝的實例相關(guān)聯(lián)的時間標(biāo)記和上次修改該鍵的原始實例的時間標(biāo)記。在這些實施例中,如果該鍵的原始實例與晚于該拷貝的鍵的時間標(biāo)記的時間標(biāo)記相關(guān)聯(lián),那么就可以把該原始鍵拷貝到隔離范圍,用以更新該候選鍵。在其他實施例中,拷貝到該隔離范圍的候選鍵可以被與標(biāo)識從其拷貝過該原始鍵的范圍的元數(shù)據(jù)相關(guān)聯(lián)。
在進一步的實施例中,可以監(jiān)視拷貝到隔離范圍的鍵(因為該鍵已經(jīng)被打開目的是修改它們),以確定它們實際上是否被修改了。在一個實施例中,拷貝的鍵可以被與當(dāng)該鍵被實際地修改之時所設(shè)定的標(biāo)志相關(guān)聯(lián)。在這些實施例中,如果拷貝的鍵實際上沒有被修改,那么就可以在把它關(guān)閉之后把它從它被拷貝到的范圍以及與該拷貝的鍵相關(guān)聯(lián)的任何占位符節(jié)點中除去。
該范圍的實例被標(biāo)識為是文字鍵(步驟842)并且把所發(fā)出的請求打開文字鍵的請求和結(jié)果返回給請求者(步驟820)。
4.2.2注冊表鍵刪除操作現(xiàn)在參考圖9,在簡單的概況中,描繪了刪除注冊表鍵所采取的步驟的一個實施例。在能夠刪除一個鍵之前,首先必須用刪除訪問來成功地打開該鍵(步驟901)。如果該鍵沒有被成功地打開,那么就返回一個錯誤(步驟916)。如果虛擬鍵被成功地打開,那么請求刪除虛擬化的注冊表鍵的請求就被接收或者攔截,該請求包括到對應(yīng)于該虛擬鍵的文字鍵的句柄(步驟902)。規(guī)則確定如何來處理注冊表鍵操作(步驟904)。除了檢查適用于要刪除的鍵的規(guī)則之外,還檢查適用于直接子鍵的任何其他規(guī)則(步驟905)。對于適用于所找到的直接子鍵的每個規(guī)則而言,都試圖去打開虛擬子鍵,該虛擬子鍵的名稱由在步驟905所找到的規(guī)則中所給出的名稱指定。如果其名稱與在步驟905中所找到的一個規(guī)則相對應(yīng)的子鍵被成功地打開了(步驟906),那么就把該虛擬鍵視為具有子鍵,這就意味著它不能夠被刪除,然后返回一個錯誤(步驟907)。
如果在步驟905中所提取的所有虛擬鍵名稱都已經(jīng)被試圖去打開過(步驟906),那么就沒有找到任何還存在的虛擬鍵,需要進一步的檢查。如果該規(guī)則動作不是″隔離″,而是″重定向″,或者是″忽略″(步驟908),那么就把請求刪除文字注冊表鍵的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟911)。然而,如果在步驟908中所確定的規(guī)則動作是″隔離″,那么就查閱聚合的虛擬化的注冊表鍵,用以確定它是否包含任何虛擬子鍵(步驟914)。如果該虛擬化的鍵具有虛擬子鍵,那么就不能繼續(xù)刪除,并且返回一個錯誤,表明該鍵尚未被刪除(步驟920)。如果該虛擬化的鍵不具有虛擬子鍵,那么就檢查與該虛擬鍵對應(yīng)的文字鍵,用以確定它是否屏蔽了在另一個范圍級別中具有相同虛擬名稱的范圍鍵(步驟922)。如果對應(yīng)于該虛擬鍵的文字鍵沒有屏蔽具有相同虛擬名稱但是范圍不同的鍵,那么對應(yīng)于該虛擬鍵的文字鍵就被刪除,并且把結(jié)果返回(步驟926)。如果對應(yīng)于該虛擬鍵的文字鍵屏蔽了具有相同虛擬名稱但是范圍卻不同的鍵,那么就用一個表明它被刪除的值來屏蔽對應(yīng)于該虛擬鍵的文字鍵,并且把成功的結(jié)果返回給調(diào)用者(步驟924)。
還參考圖9,更詳細(xì)地,為了刪除一個鍵,首先就必須用刪除訪問來打開該鍵(步驟901)。請求用刪除訪問打開鍵的請求包括該鍵的名稱,該鍵的名稱被隔離環(huán)境當(dāng)做虛擬名稱來對待處理。對全虛擬化鍵打開按照在第4.2.1節(jié)中所描述的那樣來執(zhí)行。如果虛擬化打開操作失敗,那么就把一個錯誤返回給請求者(步驟916)。如果虛擬化打開操作成功,那么就把對應(yīng)于該虛擬鍵的文字鍵的句柄返回給請求者。然后,請求刪除在步驟901中打開了的注冊表鍵的請求被接收或者攔截(步驟902)。該打開的文字注冊表鍵可以屬于用戶隔離范圍,應(yīng)用程序隔離范圍,系統(tǒng)范圍,或者某一適用的隔離子范圍。在一些實施例中,該刪除請求被替換操作系統(tǒng)函數(shù)或者替換用于刪除注冊表鍵的函數(shù)的函數(shù)鉤住。在另一個實施例中,掛鉤動態(tài)鏈接庫被使用來攔截該刪除請求。該掛鉤函數(shù)可以執(zhí)行在用戶模式下或者執(zhí)行在核心模式下。對于掛鉤函數(shù)執(zhí)行在用戶模式中的實施例而言,當(dāng)創(chuàng)建一個進程之時,掛鉤函數(shù)可以被加載到該進程的地址空間中。對于掛鉤函數(shù)執(zhí)行在核心模式中的實施例而言,掛鉤函數(shù)可以與在分派對本機注冊表鍵的請求中使用的操作系統(tǒng)資源相關(guān)聯(lián)。在其他實施例中,概念上與文件系統(tǒng)過濾器驅(qū)動器工具相類似的注冊表過濾器驅(qū)動器工具可以由操作系統(tǒng)來提供。本領(lǐng)域技術(shù)人員可以創(chuàng)建注冊表過濾器驅(qū)動器,操作系統(tǒng)把請求執(zhí)行注冊表操作的請求傳遞到該注冊表過濾器驅(qū)動器,由此提供攔截注冊表操作請求的機制。對于為每種類型的注冊表鍵函數(shù)都提供相獨立的操作系統(tǒng)函數(shù)的實施例中,每個函數(shù)都可以獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它用以攔截對若干類型的注冊表鍵的創(chuàng)建或者打開調(diào)用。
該刪除請求包含文字鍵句柄。與該句柄相關(guān)聯(lián)的虛擬鍵名稱是通過查詢操作系統(tǒng)中與該句柄相關(guān)聯(lián)的文字名稱來確定的。查閱規(guī)則引擎,用以確定與該文字名稱相關(guān)聯(lián)的虛擬名稱(如果存在的話)。確定如何來處理注冊表鍵操作(步驟904)的規(guī)則是通過查閱規(guī)則引擎來獲得的。在一些實施例中,要刪除的虛擬注冊表鍵的虛擬鍵名稱被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例的特別實施例中,對于特別的虛擬注冊表鍵,多個規(guī)則都可以存在于該規(guī)則引擎中,在這些實施例的一些實施例中,與該虛擬鍵名稱具有最長前綴匹配的規(guī)則就是施加到了該請求的規(guī)則。在一些實施例中,該規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,該規(guī)則引擎可以樹形結(jié)構(gòu)的數(shù)據(jù)庫,哈希表,或者平面注冊表鍵數(shù)據(jù)庫。在一些實施例中,對應(yīng)于在該請求中的虛擬鍵句柄的虛擬鍵名稱被用作進入到規(guī)則引擎用以定位施加到該請求一個或者多個規(guī)則的索引。在一些實施例中,進程標(biāo)識符被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則(如果存在一條規(guī)則的話)。與該請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。規(guī)則查找可以作為一系列判定而發(fā)生,或者該規(guī)則查找可以作為單個數(shù)據(jù)庫事務(wù)而發(fā)生。
要刪除的鍵的虛擬名稱被使用來查閱規(guī)則引擎,用以定位適用于要刪除的該虛擬鍵的任何直接孩子鍵但是卻不適用于要刪除的該虛擬鍵的規(guī)則集合。不管那些孩子鍵是存在還是不存在,都定位此規(guī)則集合(步驟905)。如果適用于直接孩子鍵的規(guī)則集合不是空的,那么就提取這些規(guī)則中的每個規(guī)則的虛擬名稱。接著,試圖去執(zhí)行所提取的每個虛擬孩子鍵名稱的全虛擬化打開(步驟906)。如果對應(yīng)于這些虛擬名稱的任何虛擬名稱的任何虛擬鍵都能夠被成功地打開,那么這就意味著虛擬子鍵存在。這就意味著該虛擬鍵不能夠被刪除,因為它具有存在的虛擬孩子,并且返回一個錯誤(步驟907)。如果在檢查適用于該虛擬鍵的直接孩子的所有規(guī)則集合(步驟905),找不到任何存在的虛擬子鍵,那么刪除就能夠繼續(xù)進行。例如,虛擬名稱為″key_1″的鍵可能會具有適用于″key1\subkey_1″和″key1\subkey_2″的孩子規(guī)則。在此步驟中,試圖執(zhí)行對″key1\subkey_1″和″key1\subkey_2″的虛擬化打開。如果這些虛擬子鍵中的任一個虛擬子鍵都能夠被成功地打開,那么刪除將失敗,并且返回一個錯誤(步驟907)。只有在這些虛擬子鍵中的任何一個子鍵都不存在之時,才能夠繼續(xù)刪除。
如果該規(guī)則動作不是″隔離″,而是″重定向″,或者是″忽略″(步驟908),那么就把請求使用文字鍵句柄刪除文字注冊表鍵的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟911)。如果該文字鍵包含文字子鍵,那么此請求將會失敗。在一個實施例中,請求刪除文字注冊表鍵的請求是通過調(diào)用原始版本的掛鉤函數(shù)并且把文字鍵句柄傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。在充分利用注冊表過濾器驅(qū)動器的實施例中,這是通過用完成狀態(tài)(它發(fā)信號通知操作系統(tǒng)對該請求執(zhí)行正常處理)來應(yīng)答該請求的。在一些實施例中,與該文字注冊表鍵相關(guān)聯(lián)的操作系統(tǒng)權(quán)限可以防止它的刪除。在這些實施例中,返回一個錯誤消息該虛擬注冊表鍵不會被刪除。
如果在步驟908中所確定的規(guī)則動作是″隔離″,那么就查閱聚合的虛擬化注冊表鍵,用以確定它是否包含任何虛擬子鍵(步驟914)。如果該請求的虛擬注冊表鍵包含虛擬子鍵,那么該虛擬鍵就不能夠被刪除,并且把一個錯誤返回給調(diào)用者(步驟920)。
如果該請求的虛擬注冊表鍵不包含虛擬子鍵,那么該虛擬鍵就能夠被刪除。接下來所采取的動作取決于包含要被刪除的文字鍵的范圍。例如,請求刪除虛擬注冊表鍵的請求可能導(dǎo)致刪除應(yīng)用程序范圍的文字鍵。包含文字鍵的范圍能夠通過利用到該文字鍵的全路徑查閱規(guī)則引擎來確定。
如果在特定范圍中找到了要刪除的文字鍵,并且該文字鍵屏蔽了在另一個范圍中具有相同虛擬名稱的另一個鍵,那么就把要刪除的該文字鍵標(biāo)記為是刪除的,并且把結(jié)果返回給請求者(步驟924)。例如,如果具有相同虛擬名稱的對應(yīng)的應(yīng)用程序范圍的鍵或者具有相同虛擬名稱的對應(yīng)系統(tǒng)范圍的鍵具有″正存在″,也就是說,存在于該范圍中,那么就把對應(yīng)于用戶范圍的文字鍵的虛擬鍵視為是用于屏蔽范圍不同的鍵,并且不被標(biāo)記為是占位符,并且不被視為是刪除的。類似地,如果一個系統(tǒng)范圍的鍵存在,就把應(yīng)用程序范圍的鍵視為是屏蔽對應(yīng)于相同虛擬名稱的系統(tǒng)范圍的鍵,并且不被視為是刪除的。
如果找到的要刪除的文字鍵不是去屏蔽在另一個范圍中具有相同虛擬名稱的另一個鍵,那么就實際地刪除要刪除的文字鍵并且把結(jié)果返回(步驟926)。
在一些實施例中,與該文字注冊表鍵相關(guān)聯(lián)的操作系統(tǒng)權(quán)限可以防止刪除該文字注冊表鍵。在這些實施例中,返回一個錯誤消息該虛擬注冊表鍵不會被刪除。
在一些實施例中,該文字注冊表鍵可以被與元數(shù)據(jù)相關(guān)聯(lián),它表明該虛擬化的注冊表鍵已經(jīng)被刪除。在一些實施例中,關(guān)于注冊表鍵的元數(shù)據(jù)可以存儲在由那個鍵所保持的不同的值中,那個值的存在對注冊表API的通常應(yīng)用程序利用是隱瞞著的。在一些實施例中,關(guān)于注冊表鍵的小量的元數(shù)據(jù)的可以被直接地存儲在文字鍵名稱中,諸如通過給該虛擬名稱添加上元數(shù)據(jù)指示符作為后綴,此處元數(shù)據(jù)指示符是唯一地與特定元數(shù)據(jù)狀態(tài)相關(guān)聯(lián)的字符串。該元數(shù)據(jù)指示符可以表明或者編碼元數(shù)據(jù)的一個或者若干比特。請求用虛擬名稱訪問該鍵以檢查由于存在元數(shù)據(jù)指示符而導(dǎo)致該文字鍵名稱的可能的變化的請求和請求獲取該鍵自身的名稱的請求被鉤住或者攔截,以便用該文字名稱做應(yīng)答。在其他實施例中,該元數(shù)據(jù)指示符可以被編碼在子鍵名稱或者注冊表值名稱中,而不是編碼在該鍵名稱自身中。在再一些其他的實施例中,注冊表鍵系統(tǒng)可以直接地提供為每個鍵存儲某個第三方元數(shù)據(jù)的能力。在一些實施例中,元數(shù)據(jù)可以被存儲在數(shù)據(jù)庫中或者存儲在獨立于注冊表數(shù)據(jù)庫的知識庫中。在一些實施例中,相獨立的子范圍可以被使用來存儲被標(biāo)記為是刪除的鍵。該鍵在該子范圍中的存在表明該鍵被標(biāo)記為是刪除的。
在這些實施例中的特定實施例中,刪除的鍵或者鍵系統(tǒng)元素的列表可以被維持和被查閱,用以優(yōu)化對刪除的鍵的這一檢查。在這些實施例中,如果刪除的鍵被重新創(chuàng)建,那么該鍵名稱就可以被從刪除的鍵的列表中除去。在這些實施例的其他實施例中,如果該列表增長到超過某一大小,那么鍵名稱就可以被從該列表中除去。
在一些實施例中,文字注冊表鍵在相同范圍中的祖先被與表明它被刪除或者另外表明它要被刪除的元數(shù)據(jù)相關(guān)聯(lián)。在這些實施例中,可以返回一條錯誤消息,表明該虛擬化的注冊表鍵不存在。在這些實施例中的特定實施例中,刪除的注冊表鍵或者注冊表鍵系統(tǒng)元素的列表可以被維持和被查閱,用以優(yōu)化對刪除的注冊表鍵的這一檢查。
4.2.3注冊表鍵列舉操作現(xiàn)在參考圖10,在簡單的概況中,示出在所描述的虛擬化環(huán)境中列舉鍵所采取的步驟的一個實施例。在能夠列舉鍵之前,首先必須要成功用列舉訪問打開鍵(步驟1001)。如果該鍵沒有被成功地打開,那么就返回一個錯誤(步驟1040)。如果該虛擬鍵被成功地打開了,那么請求列舉的請求就被接收或者攔截,該請求包括到對應(yīng)于該虛擬鍵的文字鍵的句柄(步驟1002)。
確定對應(yīng)于該句柄的虛擬鍵名稱,并且查閱規(guī)則引擎,用以為在該列舉請求中所指定的鍵確定規(guī)則(步驟1004)。如果該規(guī)則沒有指定動作″隔離″,而相反指定″忽略″或者指定″重定向″(步驟1006),那么就列舉由該文字鍵句柄所標(biāo)識的文字鍵,并且把列舉結(jié)果存儲在工作數(shù)據(jù)存儲器中(步驟1012),之后是稍后所描述的步驟1030。
然而,如果該規(guī)則動作指定″隔離″,那么首先就列舉該系統(tǒng)范圍;也就是說,該候選鍵名稱就確切地是該虛擬鍵名稱,并且如果該候選鍵存在,那么就列舉它。把列舉結(jié)果存儲在工作數(shù)據(jù)存儲器中。如果該候選鍵不存在,那么在此階段,該工作數(shù)據(jù)存儲器保持為空(步驟1014)。接下來,把該候選鍵標(biāo)識為是該虛擬鍵的應(yīng)用程序范圍的實例,并且確定該候選鍵的存在的類別(步驟1015)。
如果該候選鍵具有“負(fù)存在″,即,它或者它在該范圍中的一個祖先被標(biāo)記為是刪除的,那么在此范圍之內(nèi),它就已知是被刪除的,并且這是通過清除該工作數(shù)據(jù)存儲器而表明的(步驟1042)。如果取而代之該候選鍵不具有負(fù)存在,那么就列舉該候選鍵,并且把所獲得的任何列舉都?xì)w并到工作數(shù)據(jù)存儲器中。特別地,為在該列舉中的每個子鍵,來確定它的存在的類別。把具有負(fù)存在的子鍵從該工作數(shù)據(jù)存儲器中除去,并且具有正存在的子鍵,即,那些存在并且沒有被標(biāo)記為是占位符并且沒有被標(biāo)記為是刪除的子鍵,被添加到工作數(shù)據(jù)存儲器,如果一個子鍵已經(jīng)存在于該工作數(shù)據(jù)存儲器中,那么就替換對應(yīng)的子鍵(步驟1016)。
在任一情況下,把該候選鍵標(biāo)識為是該虛擬鍵的用戶范圍實例,并且確定該候選鍵的存在的類別(步驟1017)。如果該候選鍵具有“負(fù)存在″,即,它或者它在該范圍中一個祖先被標(biāo)記為是刪除的,那么在此范圍之內(nèi),它就已知是被刪除的,并且這是通過此清除該工作數(shù)據(jù)存儲器來表明的(步驟1044)。如果取而代之該候選鍵不具有負(fù)存在,那么就列舉該候選鍵,并且把所獲得的任何列舉結(jié)果都?xì)w并到工作數(shù)據(jù)存儲器中。特別地,為該列舉中的每個子鍵,都確定它的存在的類別。把具有負(fù)存在的子鍵從該工作數(shù)據(jù)存儲器中除去,并且具有正存在的子鍵,即,那些存在并且沒有被標(biāo)記為是占位符并且沒有被標(biāo)記為是刪除的子鍵,被添加到工作數(shù)據(jù)存儲器,如果一個子鍵已經(jīng)存在于該工作數(shù)據(jù)存儲器中,那么就替換對應(yīng)的子鍵(步驟1018),之后是稍后所描述的步驟1030。
然后,為所有的三種類型的規(guī)則,執(zhí)行步驟1030。查詢該規(guī)則引擎,用以查找規(guī)則集合,該規(guī)則集合的過濾器匹配該請求的虛擬鍵名稱的直接孩子,但是卻不匹配該請求的虛擬鍵名稱自身(步驟1030)。為該集合中的每條規(guī)則,確定其名稱匹配該規(guī)則中的名稱的虛擬孩子的存在。如果該孩子具有正存在,那么就把它添加到工作數(shù)據(jù)存儲器,取代已經(jīng)在那里具有相同名稱的任何孩子。如果該孩子具有負(fù)存在,就除去在該工作數(shù)據(jù)存儲器中對應(yīng)于該孩子的條目(如果存在的話)。(步驟1032)。最后,然后把所構(gòu)造的列舉從該工作數(shù)據(jù)存儲器返回給請求者(步驟1020)。
還參考圖10,更詳細(xì)地,為了列舉一個鍵,首先必須用列舉訪問來打開它(步驟1001)。請求用列舉訪問打開該鍵的請求包括該鍵的名稱,該鍵的名稱被隔離環(huán)境當(dāng)作虛擬名稱來對待處理。對全虛擬化的鍵打開按照在第4.2.1節(jié)中是描述的那樣來執(zhí)行。如果該虛擬化的打開操作失敗,就把一個錯誤返回給請求者(步驟1040)。如果該該虛擬化的打開操作成功,就把對應(yīng)于該虛擬鍵的文字鍵的句柄返回給請求者。然后,請求列舉在步驟1001被打開過的注冊表鍵的請求被接收或者攔截(步驟1002)。該打開的文字注冊表鍵可以屬于用戶隔離范圍,應(yīng)用程序隔離范圍,系統(tǒng)范圍,或者適用的隔離子范圍。在一些實施例中,該列舉請求被替換操作系統(tǒng)函數(shù)或者替換用于列舉注冊表鍵的函數(shù)的函數(shù)而鉤住。在另一個實施例中,掛鉤動態(tài)鏈接庫被使用來攔截該列舉請求。該掛鉤函數(shù)可以執(zhí)行在用戶模式中或者執(zhí)行在核心模式中。對于該掛鉤函數(shù)執(zhí)行在用戶模式中的實施例而言,當(dāng)創(chuàng)建一個進程之時,掛鉤函數(shù)可以被加載到該進程的地址空間中。對于掛鉤函數(shù)執(zhí)行在核心模式中的實施例而言,掛鉤函數(shù)可以與在分派對本機注冊表鍵的請求中使用的操作系統(tǒng)資源相關(guān)聯(lián)。在其他實施例中,概念上與文件系統(tǒng)過濾器驅(qū)動器工具相類似的注冊表過濾器驅(qū)動器工具可以由操作系統(tǒng)來提供。本領(lǐng)域技術(shù)人員可以創(chuàng)建注冊表過濾器驅(qū)動器,操作系統(tǒng)把請求執(zhí)行注冊表操作的請求傳遞到該注冊表過濾器驅(qū)動器,由此提供攔截注冊表操作請求的機制。對于為每種類型的注冊表鍵函數(shù)都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)都可以獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它用以攔截對若干類型的注冊表鍵函數(shù)的創(chuàng)建或者打開調(diào)用。
該列舉請求包含文字鍵句柄。與該句柄相關(guān)聯(lián)的虛擬鍵名稱是通過查詢操作系統(tǒng)中與該句柄相關(guān)聯(lián)的文字名稱來確定的。查閱該規(guī)則引擎,用以確定與該文字名稱相關(guān)聯(lián)的虛擬名稱(如果存在的話)。
確定如何來處理注冊表鍵操作(步驟1004)的規(guī)則是通過查閱規(guī)則引擎來獲得的。在一些實施例中,要列舉的虛擬注冊表鍵的虛擬鍵名稱被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例的特別實施例中,對于特別的虛擬注冊表鍵,多個規(guī)則都可以存在于該規(guī)則引擎中,在這些實施例的一些實施例中,與該虛擬鍵名稱具有最長前綴匹配的規(guī)則就是施加到了該請求的規(guī)則。在一些實施例中,該規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,該規(guī)則引擎可以樹形結(jié)構(gòu)的數(shù)據(jù)庫,哈希表,或者平面注冊表鍵數(shù)據(jù)庫。在一些實施例中,對應(yīng)于在該請求中的虛擬鍵句柄的虛擬鍵名稱被用作進入到規(guī)則引擎用以定位施加到該請求一個或者多個規(guī)則的索引。在一些實施例中,進程標(biāo)識符被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則(如果存在一條規(guī)則的話)。與一個請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。規(guī)則查找可以作為一系列判定而發(fā)生,或者該規(guī)則查找可以作為單個數(shù)據(jù)庫事務(wù)而發(fā)生。
如果該規(guī)則動作不是″隔離″(步驟1006),而是″忽略″或者是″重定向″,那么就使用該文字鍵句柄把請求列舉該文字鍵的請求傳遞到操作系統(tǒng),并且把列舉結(jié)果(如果存在的和)存儲在工作數(shù)據(jù)存儲器中(步驟1012),并且步驟1030按照稍后是描述的那樣來執(zhí)行。
在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。在其他實施例中,概念上與文件系統(tǒng)過濾器驅(qū)動器工具相類似的注冊表過濾器驅(qū)動器工具可以由操作系統(tǒng)提供。在這些實施例中,列舉該文字注冊表鍵可以通過向該注冊表過濾器管理器發(fā)信號去以通常的方式來處理未經(jīng)修改的請求來應(yīng)答請求列舉該鍵的請求。
如果在步驟1010中所確定的該規(guī)則動作是″隔離″,那么就列舉該系統(tǒng)范圍。為了實現(xiàn)這一點,把該候選鍵標(biāo)識為是對應(yīng)于要列舉的虛擬鍵的系統(tǒng)范圍的鍵。該候選鍵被列舉,并且列舉的結(jié)果被存儲在工作數(shù)據(jù)存儲器中(步驟1014)。在一些實施例中,該工作數(shù)據(jù)存儲器由存儲器元件組成。在其他實施例中,該工作數(shù)據(jù)存儲器包括數(shù)據(jù)庫或者鍵或者固態(tài)存儲器元件或者持久的數(shù)據(jù)存儲器。
接著,把該候選鍵標(biāo)識為是該虛擬鍵的應(yīng)用程序范圍的實例,并且確定該候選鍵的存在的類別(步驟1015)。如果該候選鍵具有“負(fù)存在″,即,它或者它在該范圍中的一個祖先被標(biāo)記為是刪除的,那么在此范圍之內(nèi),它就已知是被刪除的,并且這是通過清除工作數(shù)據(jù)存儲器來表明的(步驟1042)。
在一些實施例中,該候選注冊表鍵可以與表明該候選注冊表鍵已經(jīng)被刪除的元數(shù)據(jù)的相關(guān)聯(lián)。在一些實施例中,關(guān)于注冊表鍵的元數(shù)據(jù)可以存儲在由那個鍵所保持的不同的值,那個值的存在對注冊表API的通常應(yīng)用程序使用是隱瞞著的。
在一些實施例中,關(guān)于注冊表鍵的一些量的元數(shù)據(jù)可以直接地存儲在文字鍵名稱中,諸如通過給虛擬名稱加上一個元數(shù)據(jù)指示符的后綴,此處元數(shù)據(jù)指示符是唯一地與特別的元數(shù)據(jù)狀態(tài)相關(guān)聯(lián)的字符串。該元數(shù)據(jù)指示符可以表明或者編碼元數(shù)據(jù)的一個或者若干個比特。請求用虛擬名稱訪問該鍵以檢查由于存在元數(shù)據(jù)指示符而導(dǎo)致的文字名稱可能的變化的請求和用于獲取該鍵自身的名稱的請求被鉤住或者攔截,以便用文字名稱作出應(yīng)答。在其他實施例中,該元數(shù)據(jù)指示符可以編碼在子鍵名稱或者注冊表值名稱中而不是編碼在該鍵名稱自身中。在再一些其他的實施例中,注冊表鍵系統(tǒng)可以直接地提供為每個鍵都存儲某個第三方元數(shù)據(jù)的能力。在一些實施例中,元數(shù)據(jù)被存儲在數(shù)據(jù)庫或者獨立于注冊表數(shù)據(jù)庫的其他知識庫中。在一些實施例中,相獨立的子范圍可以被使用來存儲被標(biāo)記為是刪除的鍵。一個鍵在該子范圍中的存在表明該鍵被標(biāo)記為是刪除的。
如果取而代之,在步驟1015,該候選鍵不具有負(fù)存在,那么就列舉該候選鍵并且把所獲得的任何列舉結(jié)果都?xì)w并到工作數(shù)據(jù)存儲器中。特別地,為在該列舉中的每個子鍵,都確定它的存在的類別。具有負(fù)存在的子鍵被從工作數(shù)據(jù)存儲器中除去,并且具有正存在的子鍵,即,那些存在并且沒有被標(biāo)記為是占位符并且沒有被標(biāo)記為是刪除的子鍵,被添加到工作數(shù)據(jù)存儲器,如果一個子鍵已經(jīng)存在于工作數(shù)據(jù)存儲器中,那么就替換對應(yīng)的子鍵(步驟1016)。
在任一情況下,把該候選鍵標(biāo)識為是該虛擬鍵的用戶范圍的實例,并且確定該候選鍵的存在的類別(步驟1017)。如果該候選鍵具有“負(fù)存在″,即,它或者它在該范圍中的一個祖先被標(biāo)記為是刪除的,那么在此范圍之內(nèi),它就已知是被刪除的,并且這是通過清除工作數(shù)據(jù)存儲器而表明的(步驟1044)。如果取而代之該候選鍵不具有負(fù)存在,那么就列舉該候選鍵并且把所獲得的任何列舉結(jié)果都?xì)w并到工作數(shù)據(jù)存儲器中。特別地,為在該列舉中的每個子鍵,都確定它的存在的類別。負(fù)存在的子鍵被從工作數(shù)據(jù)存儲器中除去,并且具有正存在的子鍵,即,那些存在并且沒有被標(biāo)記為是占位符并且沒有被標(biāo)記為是刪除的子鍵,被添加到工作數(shù)據(jù)存儲器,如果一個子鍵已經(jīng)存在于工作數(shù)據(jù)存儲器中,那么就替換對應(yīng)的子鍵(步驟1018),之后是以下所描述的步驟1030。
然后,為所有的三種類型的規(guī)則,執(zhí)行步驟1030。查詢該規(guī)則引擎,用以查找規(guī)則的集合,該規(guī)則的過濾器匹配該請求的鍵的直接孩子,但是卻不匹配該請求的鍵自身(步驟1030)。為在該集合中的每個規(guī)則,確定虛擬孩子的存在,該虛擬孩子的名稱匹配在該規(guī)則中的名稱。在一些實施例中,這是通過檢查適當(dāng)?shù)母綦x范圍并且與該虛擬孩子相關(guān)聯(lián)的元數(shù)據(jù)來實現(xiàn)的確定。在其他實施例中,這是通過試圖去打開該鍵來確定的。如果該打開請求成功,那么該虛擬孩子就具有正存在。如果該打開請求失敗,且表明該虛擬孩子不存在,那么該虛擬孩子就具有負(fù)存在。
如果該孩子具有正存在,那么就把它添加到工作數(shù)據(jù)存儲器,替換已經(jīng)在那里具有相同名稱的任何孩子。如果該孩子具有負(fù)存在,那么在該工作數(shù)據(jù)存儲器中對應(yīng)于該虛擬孩子的孩子(如果有的話)就被除去。(步驟1032)。最后,把所構(gòu)造的列舉然后從該工作數(shù)據(jù)存儲器返回給請求者(步驟1020)。
本領(lǐng)域普通技術(shù)人員將會認(rèn)識到把上述的分層的列舉進程做較小的修改就能夠應(yīng)用到列舉包括多個隔離子范圍的單個隔離范圍的操作上。工作數(shù)據(jù)存儲器被創(chuàng)建,相繼的子范圍被列舉并且把結(jié)果歸并到工作數(shù)據(jù)存儲器中以形成隔離范圍的聚合列舉。
4.2.4.注冊表創(chuàng)建操作現(xiàn)在參考圖11,在簡單的概況中,示出在隔離環(huán)境中創(chuàng)建鍵所采取的步驟的一個實施例。用于創(chuàng)建鍵的請求被接收或者攔截(步驟1102)。該請求包含鍵名稱,該鍵名稱被隔離環(huán)境當(dāng)作虛擬鍵名稱來處理對待。試圖去使用適用的規(guī)則,即,使用適當(dāng)?shù)挠脩艉蛻?yīng)用程序隔離范圍使用全虛擬化打開所請求的鍵,如以在第4.1.1節(jié)中所描述的(步驟1104)。如果訪問被拒絕(步驟1106),那么就把訪問拒絕錯誤返回給請求者(步驟1109)。如果訪問被許可(步驟1106),并且該請求的鍵被成功地打開(步驟1110),那么就把所請求的鍵返回給請求者(步驟1112)。然而,如果訪問被許可(步驟1106),但是該請求的鍵卻沒有被成功地打開(步驟1110),那么如果該請求的鍵的雙親也不存在(步驟1114),就向請求者發(fā)出適合于該請求語義的錯誤(步驟1116)。如果相反使用適當(dāng)?shù)挠脩艉蛻?yīng)用范圍在全虛擬化的視圖中找到了該請求的鍵的雙親(步驟1114),那么規(guī)則然后就確定該鍵操作如何被處理(步驟1118)。如果該規(guī)則動作是″重定向″或者″忽略″(步驟1120),那么就依照規(guī)則把該虛擬鍵名稱直接地映射到文字鍵名稱。特別地,如果規(guī)則動作是″忽略″,那么就把該文字鍵名稱標(biāo)識為確切地就是虛擬鍵名稱。如果取而代之,該規(guī)則動作是″重定向″,那么就根據(jù)該規(guī)則所指定的虛擬鍵名稱來確定文字鍵名稱。然后把創(chuàng)建該文字鍵的請求傳遞到操作系統(tǒng),并且把該結(jié)果返回給請求者(步驟1124)。如果相反,在步驟1120中所確定的該規(guī)則動作是″隔離″,那么就把該文字鍵名稱標(biāo)識為是該虛擬鍵名稱在用戶隔離范圍中的實例。如果該文字鍵已經(jīng)存在,但是卻與表明它是占位符或者它被刪除的元數(shù)據(jù)相關(guān)聯(lián),那么就修改該相關(guān)聯(lián)的元數(shù)據(jù)以便除去改那些表明,并且確保該鍵是空的。在任一情況下,把打開該文字鍵的請求傳遞到到操作系統(tǒng)(步驟1126)。如果該文字鍵被成功地打開過了(步驟1128),那么就把該文字鍵返回給請求者(步驟1130)。如果相反,在步驟1128,該請求的鍵沒有打開,就把當(dāng)前不存在于用戶隔離范圍中的文字鍵的每個祖先的占位符(步驟1132)和用于使用文字名稱去創(chuàng)建該文字鍵的請求傳遞到操作系統(tǒng)并且把該結(jié)果返回給請求者(步驟1134)。
還參考圖11,更詳細(xì)地,創(chuàng)建鍵的請求被接收或者攔截(步驟1102)。在一些實施例中,該請求被替換掉操作系統(tǒng)函數(shù)或者替換用于創(chuàng)建鍵的函數(shù)的函數(shù)鉤住。在另一實施例中,掛鉤動態(tài)鏈接庫被使用來攔截該請求。該掛鉤函數(shù)可以執(zhí)行在用戶模式下也可以執(zhí)行在核心模式下。對于該掛鉤函數(shù)執(zhí)行在用戶模式下的實施例而言,當(dāng)創(chuàng)建一個進程之時,就可以把該掛鉤函數(shù)加載到該進程的地址空間中。對于該掛鉤函數(shù)執(zhí)行在核心模式中的實施例而言,可以把該掛鉤函數(shù)與在分派對鍵操作的請求中所使用的操作系統(tǒng)資源相關(guān)聯(lián)。對于為每種類型的鍵操作都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)都可以被獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它攔截對若干類型的鍵操作的創(chuàng)建或者打開調(diào)用。
該請求包含鍵名稱,該鍵名稱被隔離環(huán)境當(dāng)作虛擬鍵名稱對待處理。在一些實施例中,該虛擬鍵名稱可以被表示雙親鍵的句柄和到后繼鍵的相對路徑名稱的組合。該雙親鍵句柄被與文字鍵名稱相關(guān)聯(lián),該文字鍵名稱自身就與虛擬鍵名稱相關(guān)聯(lián)。請求者試圖去使用適用的規(guī)則,即,使用適當(dāng)?shù)挠脩艉蛻?yīng)用程序隔離范圍使用全虛擬化打開虛擬鍵,如在第4.2.1中所描述的(步驟1104)。如果在全虛擬化的打開操作期間訪問被拒絕(步驟1106),那么就把訪問拒絕錯誤返回給請求者(步驟1109)。如果訪問被許可(步驟1106),并且該請求的虛擬鍵被成功地打開(步驟1110),那么就把對應(yīng)的文字鍵返回給請求者(步驟1112)。然而,如果訪問被許可(步驟1106),但是該虛擬鍵卻沒有被成功地打開(步驟1110),那么就已經(jīng)確定出該虛擬鍵是不存在的。如果該請求的虛擬鍵的虛擬雙親也不存在,正如在第4.2.1中的過程所確定的那樣(步驟1114),那么就向請求者發(fā)出適合于請求語義的錯誤(步驟1116)。如果相反,使用適當(dāng)?shù)挠脩艉蛻?yīng)用范圍在全虛擬化的視圖中找到了該請求的虛擬鍵的虛擬雙親(步驟1114),那么就通過查閱規(guī)則引擎來定位確定如何來處理創(chuàng)建操作的規(guī)則(步驟1118)。在一些實施例中,該規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,該規(guī)則引擎可以是樹形結(jié)構(gòu)的數(shù)據(jù)庫,哈希表,或者平面鍵數(shù)據(jù)庫。在一些實施例中,為該請求的鍵所提供的虛擬鍵名稱被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例的特別實施例中,對于特別的鍵,多個規(guī)則都可以存在于該規(guī)則引擎中,并且在這些實施例的一些實施例中,與虛擬鍵名稱具有最長前綴匹配的規(guī)則就是施加到該請求的規(guī)則。在一些實施例中,進程標(biāo)識符被使用來在規(guī)則引擎中定位施加到該請求的規(guī)則(如果一條規(guī)則存在的話)。與請求相關(guān)聯(lián)的規(guī)則可以是去忽略該請求,重定向該請求,或者隔離該請求。盡管在圖11中示為單個數(shù)據(jù)庫事務(wù)或者在鍵中的單個查找,但是該規(guī)則查找可以作為一系列的規(guī)則查找來執(zhí)行。
如果該規(guī)則動作是″重定向″或者″忽略″(步驟1120),那么就依照規(guī)則把該虛擬鍵名稱直接地映射到文字鍵名稱(步驟1124)。如果該規(guī)則動作是″重定向″(步驟1120),那么就根據(jù)由該規(guī)則所指定的虛擬鍵名稱來確定文字鍵名稱(步驟1124)。如果該規(guī)則動作是″忽略″(步驟1120),那么該文字鍵名稱就被確定為確切地就是該虛擬鍵名稱(步驟1124)。如果該規(guī)則動作是″忽略″或者該規(guī)則動作是″重定向″,那么就把請求使用所確定的文字鍵名稱創(chuàng)建該文字鍵的請求傳遞到操作系統(tǒng)并且把來自于操作系統(tǒng)的結(jié)果返回給請求者(步驟1124)。例如,創(chuàng)建名稱為″key_1″的虛擬鍵的請求就可能導(dǎo)致創(chuàng)建名稱為″Different_key_1″的文字鍵。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的(步驟1124)。在其他實施例中,概念上與文件系統(tǒng)過濾器驅(qū)動器工具相類似的注冊表過濾器驅(qū)動器工具可以由操作系統(tǒng)提供。在這些實施例中,創(chuàng)建該文字注冊表鍵可以通過向該注冊表過濾器管理器發(fā)信號去使用所確定的文件鍵名稱來重新解析請求創(chuàng)建虛擬鍵的原始請求來應(yīng)答該原始請求。
如果在步驟1120中所確定的規(guī)則動作不是“忽略”,也不是“重定向”,而是“隔離”,那么就把該文字鍵名稱標(biāo)識為是該虛擬鍵名稱在用戶隔離范圍中的實例。如果該文字鍵已經(jīng)存在,但是卻與表明它是一個占位符或者它被刪除了的元數(shù)據(jù)相關(guān)聯(lián),那么就修改該關(guān)聯(lián)的元數(shù)據(jù),用以除去那些表明,并且確保該鍵是空的。
在一些實施例中,關(guān)于注冊表鍵的元數(shù)據(jù)可以被存儲在由那個鍵所保持的不同的值中,那個值的存在對于注冊表API的通常的應(yīng)用程序的使用是隱瞞著的。在一些實施例中,關(guān)于注冊表鍵的小量的元數(shù)據(jù)可以被直接地存儲文字鍵名稱中,諸如通過給該虛擬名稱添加上元數(shù)據(jù)指示符的后綴,此處元數(shù)據(jù)指示符是唯一地與特別的元數(shù)據(jù)狀態(tài)相關(guān)聯(lián)的字符串。該元數(shù)據(jù)指示符可以表明或者編碼元數(shù)據(jù)的若干比特。請求用虛擬鍵名訪問以檢查由于元數(shù)據(jù)指示符的存在而導(dǎo)致文字鍵名的可能的變化的請求和請求獲取該鍵自身的名稱的請求被鉤住或者攔截,以便用該文字名稱來應(yīng)答。在其他實施例中,該元數(shù)據(jù)指示符可以被編碼在子鍵名稱或者注冊表值名稱中,而不是編碼在該鍵名稱自身中。在再一些其他的實施例中,注冊表鍵系統(tǒng)可以直接地提供為每個鍵都存儲某個第三方元數(shù)據(jù)的能力。在一些實施例中,元數(shù)據(jù)可以被存儲在數(shù)據(jù)庫中或者存儲在獨立于注冊表數(shù)據(jù)庫的知識庫。在一些實施例中,相獨立的子范圍可以被使用來存儲被標(biāo)記為是刪除的鍵。鍵在子范圍中的存在表明該鍵被標(biāo)記為是刪除的。
在這些實施例中的特定的一些實施例中,刪除的鍵或者鍵系統(tǒng)元素的列表可以被維持并且可以被查閱,用以優(yōu)化對刪除的鍵的這一檢查。在這些實施例中,如果刪除鍵被重新創(chuàng)建,那么該鍵名稱就可以被從刪除的鍵的列表中除去。在這些實施例的其他實施例中,如果該列表增長到超過某一大小,那么就可以從該列表中除去鍵名稱。
在任一情況下,把請求打開用戶范圍的文字鍵的請求傳遞到操作系統(tǒng)(步驟1126)。在一些實施例中,規(guī)則可以指定對應(yīng)于該虛擬鍵的文字鍵應(yīng)該被創(chuàng)建在不同于用戶隔離范圍的范圍(諸如應(yīng)用程序隔離范圍,系統(tǒng)范圍,用戶隔離子范圍或者應(yīng)用程序隔離子范圍)中。
如果該文字鍵被成功地打開了(步驟1128),就把文字鍵返回給請求者(步驟1130)。如果相反,在步驟1128,該請求的鍵未能打開,那么就為當(dāng)前不存在于用戶隔離范圍中的文字鍵的每個祖先創(chuàng)建占位符(步驟1132)并且把請求使用文字名稱創(chuàng)建文字鍵的請求傳遞到操作系統(tǒng)并且把該結(jié)果返回給請求者(步驟1134)。
此實施例用于具有僅僅支持每個調(diào)用/引用創(chuàng)建一個級別的API或者工具的操作系統(tǒng)。對于本領(lǐng)域技術(shù)人員而言顯而易見是能夠擴展到每個調(diào)用/引用多個級別。
4.3命名對象虛擬化操作另一類系統(tǒng)范圍的資源(它們可以使用上述的技術(shù)被虛擬化)是命名對象,該命名對象包括信號量,互斥體,變異株,可等待的定時器,事件,工作對象對象,分段(section),命名管道以及郵件時隙(mailslot)。這些對象的特征在于它們典型地僅僅在創(chuàng)建它們的進程的持續(xù)時間期間才存在。用于這些對象的名稱空間可以在整個計算機(在范圍上是全局的)是有效的或者僅僅在單獨的用戶會話中是有效的(范圍在對話上)。
現(xiàn)在參考圖12,在簡單的概況中,請求創(chuàng)建或者打開命名對象的請求被接收或者攔截(步驟1202)。該請求包含對象名稱,該對象名稱被隔離環(huán)境當(dāng)作虛擬名稱來對待處理。確定如何來對待該請求的規(guī)則(步驟1204)。如果該規(guī)則表明該請求應(yīng)該被忽略(步驟1206),那么就把文字對象名稱確定為就是虛擬名稱(步驟1207),并且把請求創(chuàng)建或者打開文字對象的請求發(fā)給操作系統(tǒng)(步驟1214)。如果該確定的規(guī)則不是去忽略該請求,而相反則表明該請求應(yīng)該被重定向(步驟1208),那么就根據(jù)由重定向規(guī)則所規(guī)定的虛擬名稱來確定該文字對象名稱(步驟1210),并且請求創(chuàng)建或者打開該文字對象的請求被發(fā)給操作系統(tǒng)(步驟1214)。如果該規(guī)則沒有表明該請求應(yīng)該被重定向(步驟1208),而相反表明該請求應(yīng)該被隔離,那么就根據(jù)由隔離規(guī)則所規(guī)定的虛擬名稱來確定該文字對象名稱(步驟1212)并且創(chuàng)建或者打開對該文字對象的命令被發(fā)給操作系統(tǒng)(步驟1214)。把由操作系統(tǒng)響應(yīng)于所發(fā)出的創(chuàng)建或者打開命令而返回的文字對象的句柄返回給請求創(chuàng)建或者打開該虛擬對象的程序(步驟1216)。
還參考圖12,更詳細(xì)地,進程的請求創(chuàng)建或者打開命名對象的請求被攔截(步驟1202)。該命名對象可以屬于會話范圍或者它可以屬于全局范圍。在一些實施例中,該請求由替換操作系統(tǒng)函數(shù)或者替換用于創(chuàng)建或者打開命名對象的函數(shù)的函數(shù)而鉤住。在另一個實施例,掛鉤動態(tài)鏈接庫被使用來攔截請求。該掛鉤函數(shù)可以執(zhí)行在用戶模式中或者執(zhí)行在核心模式中。對于該掛鉤函數(shù)執(zhí)行在用戶模式中的實施例而言,當(dāng)創(chuàng)建一個進程之時,該掛鉤函數(shù)可被以加載到該進程的地址空間中。對于該掛鉤函數(shù)執(zhí)行在核心模式中的實施例而言,該掛鉤函數(shù)可以被與在分派對系統(tǒng)對象的請求中使用的操作系統(tǒng)資源相關(guān)聯(lián)。請求創(chuàng)建或者打開該命名對象的請求可以引用用于在進程間的通信和同步的并且由唯一的標(biāo)識符所標(biāo)識的寬范圍的多種類系統(tǒng)范圍的資源中的任何一個資源,該唯一標(biāo)識符包括信號量,互斥體,變異株,可等待的定時器,文件映射對象,事件,工作對象,分段,命名管道以及郵件時隙。對于為每種類型的對象都提供相獨立的操作系統(tǒng)函數(shù)的實施例而言,每個函數(shù)都可以被獨立地鉤住。作為選擇,可以提供單個掛鉤函數(shù),它攔截創(chuàng)建或者打開對若干類型的對象的調(diào)用。
所攔截的請求包含對象名稱,該對象名稱被隔離環(huán)境當(dāng)作虛擬名稱來對待處理。通過查閱規(guī)則引擎來確定用于確定如何來對待對該對象的請求的規(guī)則(步驟1204)。在一些實施例中,該規(guī)則引擎可以被提供為是關(guān)系數(shù)據(jù)庫。在其他實施例中,該規(guī)則引擎可以是樹形結(jié)構(gòu)數(shù)據(jù)庫,哈希表,或者平面文件數(shù)據(jù)庫。在一些實施例中,為該請求的對象所提供的虛擬名稱被使用來在該規(guī)則引擎中定位施加到該請求的規(guī)則。在這些實施例的特別實施例中,對于特別的對象,多個規(guī)則都可以存在于該規(guī)則引擎中,在這些實施例中,與該虛擬名稱之間具有最長前綴匹配的規(guī)則就是施加到了該請求的規(guī)則。在一些實施例中,進程標(biāo)識符被使用來在該規(guī)則引擎定位施加到該請求的規(guī)則(如果一條規(guī)則存在的話)。與請求相關(guān)聯(lián)的規(guī)則可以是忽略該請求,重定向該請求,或者隔離該請求。盡管在圖12中示為一系列判定,但是該規(guī)則查找可以作為單個數(shù)據(jù)庫事務(wù)而發(fā)生。
如果該規(guī)則表明該請求應(yīng)該被忽略(步驟1206),那么該文字對象名稱就被確定為是該虛擬名稱,并且把請求創(chuàng)建或者打開該文字對象的請求發(fā)給操作系統(tǒng)(步驟1214)。例如,請求創(chuàng)建或者打開名稱為″Object_1″的命名對象的請求將導(dǎo)致創(chuàng)建實際上名稱為″Object_1″的對象。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。
如果通過訪問該規(guī)則引擎所確定的規(guī)則不是去忽略該請求,而相反是表明該請求應(yīng)該被重定向(步驟1208),那么就根據(jù)由重定向規(guī)則所規(guī)定的虛擬名稱來確定該文字對象名稱(步驟1210)并且對文字對象的創(chuàng)建或者打開請求被發(fā)給操作系統(tǒng)(步驟1214)。例如,請求創(chuàng)建或者打開名稱為″Object_1″的命名對象可能導(dǎo)致創(chuàng)建實際上名稱為″Different_Object_1″的對象。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。
如果該規(guī)則沒有表明該請求應(yīng)該被重定向(步驟1208),而是相反表明該請求應(yīng)該被隔離,那么就根據(jù)由隔離規(guī)則所規(guī)定的虛擬名稱來確定該文字對象名稱(步驟1212)并且把對該文字對象的創(chuàng)建或打開命令發(fā)給操作系統(tǒng)(步驟1214)。例如,請求創(chuàng)建或者打開名稱為″Object_1″的命名對象的請求可能會導(dǎo)致創(chuàng)建實際上名稱為″Isolated_Object_1″的對象。在一個實施例中,這是通過調(diào)用原始版本的掛鉤函數(shù)并且把所形成的文字名稱傳遞到該函數(shù)作為參數(shù)來實現(xiàn)的。
為了隔離請求的系統(tǒng)對象而形成的文字名稱可以基于所接收的虛擬名稱和范圍專用的標(biāo)識符。該范圍專用的標(biāo)識符可以是與應(yīng)用程序隔離范圍,用戶隔離范圍,會話隔離范圍,或者它們?nèi)齻€的某種組合相關(guān)聯(lián)的標(biāo)識符。該范圍專用的標(biāo)識符被使用來″弄亂″在該請求中所接收的虛擬名稱。例如,如果對于其相關(guān)聯(lián)的標(biāo)識符是″SA1″的應(yīng)用程序隔離范圍,對命名對象″Object_1″的請求是被隔離的,那么該文字名稱就可以是″Isolated_AppScope_SA1_Object_1″。下表標(biāo)識用會話隔離范圍,或者用戶隔離范圍和應(yīng)用程序隔離范圍弄亂該對象的名稱的影響。使用范圍的組合的弄亂把在該表中所列出的限制組合起來。
對于操作系統(tǒng)是WINDOWS系列操作系統(tǒng)之一的實施例而言,對象范圍可以通過來回切換與該對象相關(guān)聯(lián)的全局/局部名稱前綴而修改,對于隔離的應(yīng)用程序而言,這與和使用會話專用的標(biāo)識符來弄亂對象名稱具有相同的影響。然而,對于非隔離的應(yīng)用程序而言,來回切換全局/局部名稱前綴也影響對象范圍。
把由操作系統(tǒng)響應(yīng)于在步驟1214中所發(fā)出的創(chuàng)建或者打開該命名對象的命令而返回的文字對象的句柄返回給請求創(chuàng)建或者打開該虛擬對象的程序(步驟1216)。
4.4窗口名稱虛擬化可以使用上述的技術(shù)虛擬化的其他類的系統(tǒng)范圍的資源是窗口名稱和窗口類名稱。圖形軟件應(yīng)用程序使用窗口或者它的窗口類的名稱作為一種識別方式,來識別應(yīng)用程序是否已經(jīng)在運行著并且用于其他形式的同步?,F(xiàn)在參考圖13,在簡單的概況中,關(guān)于窗口名稱或者窗口類的請求被接收或者攔截(步驟1302)。請求能夠采用Win32 API調(diào)用的形式或者采用窗口消息的形式。兩種類型的請求都被處理。那些請求包含或者請求獲取窗口名稱和/或窗口類名稱,窗口名稱和/或窗口類名稱被隔離環(huán)境當(dāng)作虛擬名稱來對待處理。如果該請求是去獲取用句柄所標(biāo)識的窗口的窗口名稱或者窗口類(步驟1304),那么就查閱窗口映射表,用以確定該句柄和請求的關(guān)于該窗口的信息是否是已知的(步驟1306)。如果是已知的,那么就把來自該窗口映射表的請求信息返回給請求者(步驟1308)。如果不是已知的,那么就把該請求傳遞到操作系統(tǒng)(步驟1310),并且把該結(jié)果返回給請求者(步驟1314),在步驟1304,該請求提供窗口名稱或者窗口類,那么就檢查該請求檢查,用以確定它是否指定由操作系統(tǒng)所定義的窗口的一個類(步驟1320)。如果它指定了,那么就把該請求發(fā)給操作系統(tǒng)并且把從操作系統(tǒng)返回的結(jié)果返回給請求者(步驟1322)。如果該請求沒有指定由操作系統(tǒng)所定義的窗口的一個類,那么就根據(jù)該虛擬類名稱和規(guī)則來確定文字類名稱(步驟1324)并且根據(jù)虛擬窗口名稱和規(guī)則來和文字窗口名稱(步驟1326)。然后使用文字窗口和文字類名稱把該請求傳遞到操作系統(tǒng)(步驟1328)。如果在步驟1324和1326中所確定的文字窗口名稱或者文字窗口類名稱不同于對應(yīng)的虛擬名稱,那么就更新該窗口句柄的窗口映射表條目,用以記錄在該請求中所提供的虛擬窗口名稱或者虛擬類名稱(步驟1330)。如果來自操作系統(tǒng)的響應(yīng)包括本機窗口名稱或者類的本機標(biāo)識,那么就用在該請求中所提供的虛擬窗口名稱或者虛擬類名稱來替換它們(步驟1312)并且把該結(jié)果返回給請求者(步驟1314)。
還參考圖13,更詳細(xì)地,關(guān)于窗口名稱或者窗口類的請求被接收或者攔截(步驟1302)。那些請求包含或者請求獲取窗口名稱和/或窗口類名稱,它們被隔離環(huán)境當(dāng)作虛擬名稱來處理。
如果該請求是去獲取用句柄所標(biāo)識的窗口的窗口名稱或者窗口類(步驟1304),那么就查閱映射表,用以確定該句柄和關(guān)于該窗口的請求信息是否是已知的(步驟1306)。在一些實施例中,使用由操作系統(tǒng)所提供的工具為每個窗口和窗口類存儲附加數(shù)據(jù),來取代存儲映射表。
如果是,那么就把來自的窗口映射表的請求信息返回給請求者(步驟1308)。如果不是,那么就把該請求傳遞到操作系統(tǒng)(步驟1310),并且把結(jié)果返回給請求者(步驟1314)。
如果在步驟1304,該請求提供窗口名稱或者窗口類,那么就檢查該請求,以便確定它是否指定由操作系統(tǒng)所定義的窗口的一個類(步驟1320)。如果它提供了,那么就把該請求傳遞到操作系統(tǒng)并且把從操作系統(tǒng)所返回的結(jié)果返回給請求者(步驟1322)。
如果該請求沒有指定由操作系統(tǒng)所定義的窗口的一個類,那么就根據(jù)虛擬類名稱和規(guī)則來確定文字類名稱(步驟1324)并且根據(jù)虛擬窗口名稱和規(guī)則確定文字窗口名稱(步驟1326)。然后,使用文字窗口和文字類名稱把該請求傳遞到操作系統(tǒng)(步驟1328)。在一些實施例中,窗口名稱和窗口類名稱可以原子,而不是字符串文字。典型地,應(yīng)用程序把字符串置于原子表中和接收16比特的整數(shù)(稱為原子),該原子能夠被使用來訪問該字符串。
如果在步驟1324和1326中所確定的文字窗口名稱或者文字窗口類名稱不同于對應(yīng)的虛擬名稱,那么就更新該窗口句柄的窗口映射表條目,用以記錄在該請求中所提供的虛擬窗口名稱或者虛擬類名稱(步驟1330)。
如果來自操作系統(tǒng)的響應(yīng)包括本機窗口名稱或者類的本機標(biāo)識,那么就用在該請求中所提供的虛擬窗口名稱或者虛擬類名稱來替換它們(步驟1312)并且把該結(jié)果返回給請求者(步驟1314)。
現(xiàn)在參考圖13A,按照在那里所示出的那樣來確定文字窗口名稱或者窗口類名稱示出。查閱該規(guī)則引擎,以便確定施加到該請求的規(guī)則(步驟1352)。如果該規(guī)則動作是″忽略″(步驟1354),那么就使該文字名稱等于該虛擬名稱(步驟1356)。然而,如果該規(guī)則動作不是″忽略″而是″重定向″(步驟1358),那么就根據(jù)由重定向規(guī)則所指定的虛擬名稱來確定文字名稱(步驟1360)。然而,如果該規(guī)則動作不是″重定向″而是″隔離″,那么就使用范圍專用的標(biāo)識符根據(jù)虛擬名稱來確定該文字名稱(步驟1362)。
在一些實施例中,特定范圍專用的標(biāo)識符被規(guī)定在該規(guī)則中。在其他實施例中,所使用的該范圍專用的標(biāo)識符是一個與應(yīng)用程序隔離范圍相關(guān)聯(lián)的標(biāo)識符,發(fā)出請求的進程與該應(yīng)用程序隔離范圍相關(guān)聯(lián)。這樣就允許該窗口或者窗口類由與相同的應(yīng)用程序隔離范圍相關(guān)聯(lián)的任何其他的應(yīng)用程序來使用。在操作系統(tǒng)(諸如任何微軟WINDOWS系列操作系統(tǒng)中的任何一種操作系統(tǒng))中,此處窗口名稱和類在一個會話之內(nèi)已經(jīng)被隔離,這就意味著只有執(zhí)行在該相同會話中與相同的應(yīng)用程序隔離范圍相關(guān)聯(lián)的應(yīng)用程序才能夠使用窗口名稱或者類。
在一些系列的微軟WINDOWS操作系統(tǒng)中,該窗口名稱被用作為窗口在標(biāo)題欄中的標(biāo)題。人們希望處理非客戶區(qū)的畫圖窗口消息,以確保在窗口標(biāo)題欄中所顯示的窗口標(biāo)題反映出該虛擬名稱而不是顯示特定窗口的文字名稱。當(dāng)非客戶區(qū)的畫圖消息被攔截之時,那么就從映射表中獲取與該窗口相關(guān)聯(lián)的虛擬名稱(如果存在的話)。如果獲取到了虛擬名稱,那么就把虛擬名稱用作窗口標(biāo)題來繪制非客戶區(qū)并且表明該請求消息已經(jīng)被處理了。如果沒有獲取到任何虛擬名稱,那么就使用該窗口的文字名稱表明該請求是沒有被處理的,這就把該請求轉(zhuǎn)到用于繪制標(biāo)題欄的原始函數(shù)上。
4.5進程外COM服務(wù)器虛擬化軟件組件技術(shù)(諸如COM,CORBA,NET以及其他)允許軟件組件被開發(fā),部署,注冊,發(fā)現(xiàn),激活或者實例化以及被用作離散的單元。在大多數(shù)組件模型中,組件可以執(zhí)行在調(diào)用者的進程中,也可以執(zhí)行在相同的計算機上或者在完全獨立的計算機上的相獨立的進程中,不過一些組件僅僅可以支持這些情況的子集。
一個或者多個唯一的標(biāo)識符標(biāo)識這些組件。典型地,組件基礎(chǔ)結(jié)構(gòu)提供用于代理活動請求的服務(wù)或者守護進程(daemon)。希望開始使用組件的軟件進程把一個請求傳遞給代理,用以激活用該組件標(biāo)識符所指定的那個組件。該代理激活所請求那個組件(如果可能的話),并且返回對被激活的實例的引用。在這些組件基礎(chǔ)結(jié)構(gòu)中的一些基礎(chǔ)結(jié)構(gòu)中,相同的組件的多個版本不可以共同存在,原因在于該組件標(biāo)識符從一個版本到另一版本保持是相同的。
WINDOWS系列操作系統(tǒng)的一些成員提供稱為COM的組件基礎(chǔ)結(jié)構(gòu)。COM組件(″COM服務(wù)器″)用稱為類標(biāo)識符(CLSID)的GUID而標(biāo)識,并且每個組件提供一個或者多個接口,所述接口中的每個接口都具有它自己唯一的接口標(biāo)識符(UIID)。COM服務(wù)控制管理器(CSCM)就是用于進程外激活請求的代理并且它提供允許調(diào)用者經(jīng)由CLSID去請求激活COM服務(wù)器的接口。盡管以下的說明就COM服務(wù)器并且COM客戶使用短語表達,但是本領(lǐng)域技術(shù)人員應(yīng)該理解的是它適用于CORBA、NET和規(guī)定動態(tài)激活軟件組件的其他軟件體系結(jié)構(gòu)。
當(dāng)COM組件被安裝到計算機上之時,它們把它們的CLSID與由CSCM啟動COM服務(wù)器的新實例所需要的信息一起注冊到注冊表數(shù)據(jù)庫中已知部分中。對于進程外的COM服務(wù)器,這可以包括到要運行的可執(zhí)行體的路徑和命令行參數(shù)。相同COM服務(wù)器的多個版共享相同的CLSID,因此每次只有一個版本能夠被安裝到計算機。
在某些實施例中,應(yīng)用程序(充當(dāng)COM客戶)通過調(diào)用COM API(例如,CoCreateInstance()或者CoCreateInstanceEx())來實例化COM服務(wù)器。此調(diào)用的參數(shù)規(guī)定希望的活動上下文進程中;相同的計算機上的進程外;遠(yuǎn)程計算機上的進程外;或者允許COM子系統(tǒng)去確定要使用這三種情況中的哪一種。如果確定出需要進程外活動,那么就把包括CLSID的請求傳遞到CSCM。該CSCM使用注冊表數(shù)據(jù)庫定位路徑和參數(shù),該路徑和參數(shù)是啟動作為COM服務(wù)器的主的可執(zhí)行體所需要的。當(dāng)該可執(zhí)行體被啟動之時,它就使用COM APICoRegisterClassObject()來向CSCM注冊它所支持的所有COM服務(wù)器的所有CLSID。如果該請求的CLSID被注冊了,那么該CSCM把對該COM服務(wù)器的應(yīng)用返回該調(diào)用者。在COM客戶和COM服務(wù)器之間所有后續(xù)的交互獨立于該CSCM而發(fā)生。
前面所描述的隔離環(huán)境200允許具有相同的CLSID的COM服務(wù)器的多個實例被安裝在計算機上,它們中的每一個都處在不同的隔離范圍中(它們中只有一個可以是系統(tǒng)范圍)。然而,這單獨地將不會使那些COM服務(wù)器可用于COM客戶。
圖14描繪虛擬化對COM服務(wù)器的訪問所采取的步驟的一個實施例。在簡單的概況中,為被啟動到隔離范圍之中的每個進程外COM服務(wù)器創(chuàng)建新的CLSID,以下稱為被隔離的CLSID(或者ICLSID)(步驟1402)。根據(jù)定義,這是CLSID,并且因此在所有其他的CLSID之中必須是唯一的,換言之,它必須要具有GUID的性質(zhì)。創(chuàng)建一個映射表,它把成對(CLSID,應(yīng)用程序隔離范圍)映射到ICLSID。為該ICLSID創(chuàng)建COM服務(wù)器注冊表條目,該ICLSID描述如何去用在適當(dāng)?shù)膽?yīng)用程序隔離范圍中開始COM服務(wù)器可執(zhí)行體的啟動參數(shù)來啟動COM服務(wù)器(步驟1404)。由COM客戶對COM API(諸如CoCreate Instance()和CoCreateInstanceEx()作出的調(diào)用被鉤住或者攔截(步驟1406)。如果確定出(a)該請求能夠由進程中COM服務(wù)器被滿足或者(b)COM客戶和COM服務(wù)器都不與任何隔離范圍相關(guān)聯(lián),那么就把該請求不加修改地傳遞到原始COM API并且把結(jié)果返回給調(diào)用者(步驟1408)。識別要使用的COM服務(wù)器的適當(dāng)?shù)膶嵗?步驟1410)。如果選定的COM服務(wù)器實例處于應(yīng)用程序隔離環(huán)境中,那么就使用上面概述的數(shù)據(jù)結(jié)構(gòu)來確定它的ICLSID。否則,就使用在該請求中的CLSID(步驟1412)。如果在步驟1412中識別出了一個ICLSID,那么就用ICLSID來調(diào)用原始CoCreateInstance()或者CoCreateInstanceEx()函數(shù)。這樣就把該請求傳遞到CSCM(步驟1414)。該CSCM采用通常的方式通過在注冊表中查找所請求的CLSID以確定啟動參數(shù)來查找和啟動COM服務(wù)器可執(zhí)行體。如果請求了ICLSID,那么就查找在步驟1404中所描述的ICLSID系統(tǒng)范圍注冊表條目并且在適當(dāng)?shù)膽?yīng)用程序隔離范圍中啟動COM服務(wù)器(步驟1416)。所啟動的COM可執(zhí)行體使用它所支持的COM服務(wù)器的CLSID來調(diào)用所鉤住的CoRegisterClassObject()API,然后把這些翻譯成被傳遞到原始CoRegisterClassObject()API的適當(dāng)?shù)腎CLSID(步驟1418)。當(dāng)該CSCM接收到來自具有期望的CLSID的CoRegisterclassObject()調(diào)用的響應(yīng)之時,它就把對那個COM服務(wù)器實例的引用返回給調(diào)用者(步驟1420)。
還參考圖14,更詳細(xì)地,為被啟動到隔離范圍之中的每個進程外COM服務(wù)器創(chuàng)建ICLSID(步驟1402)。在一些實施例中,該ICLSID是在安裝COM服務(wù)器期間創(chuàng)建的。在其他實施例中,該ICLSID是安裝之后立即就創(chuàng)建的。在再一些其他的實施例中,該ICLSID是在該COM服務(wù)器被啟動到隔離范圍之中之前創(chuàng)建的。在所有這些實施例中,該ICLSID可以通過鉤住或者攔截用于在注冊表數(shù)據(jù)庫中創(chuàng)建或者查詢CLSID條目的系統(tǒng)調(diào)用而創(chuàng)建。作為選擇,該ICLSID可以通過鉤住或者攔截用于創(chuàng)建COM服務(wù)器實例COM API的調(diào)用(諸如CoCreateInstance()和CoCreateInstanceEx()而創(chuàng)建。作為選擇,在已經(jīng)發(fā)生安裝之后,可以觀察到該注冊表數(shù)據(jù)庫的CLSID專用部分的變化。
創(chuàng)建一個映射表,它把成對(CLSID,應(yīng)用程序隔離范圍)連同具有那個ICLSID的COM服務(wù)器的適當(dāng)?shù)淖员項l目映射到ICLSID,該ICLSID描述如何用在適當(dāng)?shù)膽?yīng)用程序隔離范圍中開始COM服務(wù)器可執(zhí)行體的啟動參數(shù)來啟動COM服務(wù)器(步驟1404)。在許多實施例中,此表被存儲在持久的存儲器元件中(諸如硬盤驅(qū)動器或者固態(tài)存儲器元件)。在其他實施例中,該表可以被存儲在注冊表中,存儲在平面文件中,存儲在數(shù)據(jù)庫中或者存儲在易失性存儲器元件中。在再一些其他的實施例中,可以把該表可以分布在注冊表數(shù)據(jù)庫的COM專用部分的各處,例如通過把此目的專用特定的新子鍵添加到由CLSID所標(biāo)識的每個適當(dāng)?shù)腃OM服務(wù)器條目而分布。在此表中的條目可以通過鉤住或者攔截用于在該注冊表數(shù)據(jù)庫中創(chuàng)建CLSID條目的調(diào)用在安裝期間或者在安裝之后立即創(chuàng)建,或者通過觀察在已經(jīng)發(fā)生安裝之后注冊表數(shù)據(jù)庫的CLSID專用部分的變化而創(chuàng)建,或者通過鉤住或者攔截用于創(chuàng)建COM服務(wù)器實例的COM API調(diào)用(諸如CoCreateInstance()和CoCreateInstanceEx())而創(chuàng)建。把COM服務(wù)器安裝到特定的隔離范圍中的安裝可以被持久地記錄下來。作為選擇,把特定COM服務(wù)器和隔離范圍映射到ICLSID的映射可以被動態(tài)地創(chuàng)建并且被存儲為在非持久性數(shù)據(jù)庫中的條目,或者存儲為在注冊表數(shù)據(jù)庫中的條目。
由COM客戶對COM的調(diào)用(諸如CoCreateInstance()和CoCreate InstanceEx())被鉤住或者攔截(步驟1406)。如果確定出(a)該請求能夠被進程中的COM服務(wù)器滿足或者(b)COM客戶和COM服務(wù)器這二者都駐留在系統(tǒng)范圍中(步驟1407),那么就把該請求不修改地傳遞到原始COM API并且把結(jié)果返回給調(diào)用者(步驟1408)。
如果該請求不能夠被進程中的COM服務(wù)器滿足并且不論是COM客戶還是COM服務(wù)器都沒有駐留在該系統(tǒng)范圍中(步驟1407),那么就識別要使用的COM服務(wù)器的適當(dāng)實例(步驟1410)。對于COM客戶執(zhí)行在特定隔離范圍中的實施例而言,可以首先把優(yōu)先權(quán)給與安裝到相同應(yīng)用程序隔離范圍中的COM服務(wù)器,然后是安裝到系統(tǒng)范圍中的那些(可能執(zhí)行在客戶的應(yīng)用程序隔離范圍中),之后是安裝在其他應(yīng)用程序隔離范圍中的COM服務(wù)器。在這些實施例的一些實施例中,安裝到系統(tǒng)范圍中的COM服務(wù)器可以和COM客戶一樣執(zhí)行在相同應(yīng)用程序隔離范圍中。這可以通過規(guī)則引擎和管理設(shè)定加以控制,以便允許這對于在此模式下正確地執(zhí)行的COM服務(wù)器而發(fā)生,但是對沒有正確地執(zhí)行的COM服務(wù)器卻防止這發(fā)生。對于COM客戶執(zhí)行在系統(tǒng)范圍中的實施例而言,可以把優(yōu)先權(quán)給與系統(tǒng)范圍COM服務(wù)器,之后是隔離范圍中的COM服務(wù)器。該COM客戶可以指定在創(chuàng)建該COM服務(wù)器的實例的調(diào)用中要使用的COM服務(wù)器。作為選擇,配置存儲器可以存儲標(biāo)識要被實例化的COM服務(wù)器的信息。在一些實施例中,該指定的COM服務(wù)器由另一個計算機所寄留,該另一個計算機可以是獨立的,物理機或者虛擬機。上面結(jié)合步驟1404所描述的映射表可以被使用來查找適用的COM服務(wù)器的集合并且(如果必要的話)根據(jù)規(guī)則來計算優(yōu)先權(quán)。
對于在適用的COM服務(wù)器存在于另一個計算機上的實施例而言,能夠為要使用的ICLSID查詢執(zhí)行在遠(yuǎn)程計算機上的服務(wù)或者守護進程。如果COM客戶掛鉤確定需要一個遠(yuǎn)程COM服務(wù)器,那么該COM客戶掛鉤就首選查詢該服務(wù)或者守護進程以確定要使用的CLSID/ICLSID。該服務(wù)或者守護進程確定對應(yīng)于在該請求中所給出的CLSID的ICLSID。在一些實施例中,可以根據(jù)管理員定義的配置數(shù)據(jù),包含在規(guī)則引擎中的規(guī)則,或者內(nèi)置的硬編碼邏輯來選擇或者創(chuàng)建由該服務(wù)或者守護進程所返回的ICLSID。在其他實施例中,該請求可以指定要使用的服務(wù)器上的隔離范圍。在再一些其他的實施例中,該請求的COM服務(wù)器可以被與服務(wù)器的系統(tǒng)范圍相關(guān)聯(lián),在該情況下,就返回與該COM服務(wù)器相關(guān)聯(lián)的CLSID。在再一些其他的實施例中,該請求的COM服務(wù)器可以被與該該服務(wù)器的隔離范圍之一相關(guān)聯(lián),在此情況下,它返回與該COM服務(wù)器和隔離范圍的實例相關(guān)聯(lián)的ICLSID。在一些實施例中,上述的服務(wù)或者守護進程可以被使用來支持啟動局部進程外的COM服務(wù)器。
如果所選定的COM服務(wù)器實例處于本地計算機上的應(yīng)用程序隔離環(huán)境中,那么就使用結(jié)合步驟1404所描述的數(shù)據(jù)結(jié)構(gòu)來確定它的ICLSID。如果取而代之所選定的COM服務(wù)器實例處于在本地計算機上的系統(tǒng)范圍中,那么就使用在該請求中的CLSID(步驟1412)。在這些實施例的一些實施例中,就可以動態(tài)地創(chuàng)建使用該CLSID的COM服務(wù)器的條目。
如果ICLSID被返回,那么就把它傳遞到原始COM API來代替原始的CLSID。例如,可以把所確定的ICLSID傳遞到原始的CoCreateInstance()或CoCreate InstanceEx()函數(shù),這樣就把該請求傳遞到CSCM(步驟1414)。對于該COM服務(wù)器由另一個計算機所寄留的實施例而言,該CSCM把該ICLSID傳遞到寄留該COM服務(wù)器的計算機,此處該計算機的CSCM處理該COM服務(wù)器的啟動。
該CSCM以通常的方式通過在該注冊表中查找所請求的CLSID或者ICLSID以確定啟動參數(shù)來查找并且啟動該COM服務(wù)器可執(zhí)行體。如果請求了ICLSID,那么就查找在步驟1404中所描述的ICLSID系統(tǒng)范圍注冊表條目,并且在適當(dāng)?shù)膽?yīng)用程序隔離范圍中啟動COM服務(wù)器(步驟1416)。
如果所啟動的COM服務(wù)器實例執(zhí)行在應(yīng)用程序隔離范圍中(而不管是安裝在那個范圍中還是安裝系統(tǒng)范圍中),那么COM服務(wù)器實例的COM API函數(shù)CoRegisterClassObject()就被鉤住或者攔截。使用在步驟1404中所定義的映射表把每個傳遞到CoRegisterClassObject()的CLSID都映射到對應(yīng)的ICLSID。使用該ICLSID來調(diào)用原始CoRegisterClassObject()API(步驟1418)。
當(dāng)該CSCM接收到來自具有期望的ICLSID的CoRegisterClassObject()調(diào)用的響應(yīng)之時,它就把對那個COM服務(wù)器實例返回給調(diào)用者(步驟1420)。
當(dāng)COM客戶和COM服務(wù)器執(zhí)行在應(yīng)用程序隔離范圍(包括不同的范圍)和系統(tǒng)范圍的任何組合中之時,這一技術(shù)支持COM服務(wù)器執(zhí)行。該ICLSID對(CLSID所標(biāo)識的)服務(wù)器和所希望的適當(dāng)?shù)母綦x范圍的組合是專用的。如果該服務(wù)器被安裝到該系統(tǒng)范圍中并且在其中執(zhí)行,那么該客戶僅僅需要確定正確的ICLSID(或者原始CLSID)。
4.6虛擬化的文件類型關(guān)聯(lián)(FTA)文件類型關(guān)聯(lián)是用于調(diào)用應(yīng)用程序的執(zhí)行的眾所周知的圖形用戶接口技術(shù)。向用戶展示代表數(shù)據(jù)文件的圖形圖標(biāo)。該用戶使用鍵盤命令或者使用定點設(shè)備(諸如鼠標(biāo))選擇數(shù)據(jù)文件并且在該圖標(biāo)上點擊或者雙擊以表明該用戶想要去打開該文件。作為選擇,在一些計算環(huán)境中,該用戶在命令行提示符(代替命令)處輸入到該文件的路徑。該文件典型地具有相關(guān)聯(lián)的文件類型指示,該相關(guān)聯(lián)的文件類型指示被使用來確定當(dāng)打開文件之時要使用的應(yīng)用程序。這通常是使用一個把該文件類型指示映射到特定的應(yīng)用程序的表來實現(xiàn)的。在系列微軟WINDOWS操作系統(tǒng)中的許多操作系統(tǒng)中,該映射典型地被以元組方式存儲注冊表數(shù)據(jù)庫中,該元組包括文件類型指示符和標(biāo)識要執(zhí)行的應(yīng)用程序的全路徑名,并且只有一個應(yīng)用程序可以被與任何特定文件類型相關(guān)聯(lián)。
在所描述的隔離環(huán)境中,應(yīng)用程序的多個版本都可以被安裝在單個計算機上并且在其上執(zhí)行。因此,在這些環(huán)境中,在文件類型和相關(guān)聯(lián)的應(yīng)用程序之間的關(guān)系就不再是一對一的關(guān)系,而相反是一對多的關(guān)系。對于MIME附件類型而言,也存在類似的問題。在這些環(huán)境中,此問題是通過當(dāng)選擇來一個給定的文件類型之時替換標(biāo)識要被啟動的應(yīng)用程序的路徑名而解決的。該路徑名被替換為選擇器工具的路徑名,該選擇器工具向用戶給出要啟動的應(yīng)用程序的選項。
現(xiàn)在參考圖15,在簡單的概況中,請求把文件類型關(guān)聯(lián)數(shù)據(jù)寫入到配置存儲器的請求被攔截(步驟1502)。確定該請求是否正在更新息配置存儲器中的文件類型關(guān)聯(lián)信(步驟1504)。如果不是,即,如果該條目已經(jīng)存在,那么就不發(fā)生任何的更新(步驟1506)。否則,就使用上面在第4.1.4或者4.2.4節(jié)中所描述的虛擬化技術(shù)創(chuàng)建新條目,或者更新現(xiàn)有的條目(步驟1508)。該新條目或者被更新的條目(該條目針對適當(dāng)?shù)母綦x范圍而被虛擬化了)把該文件類型映射到選擇器工具,該選擇器工具允許用戶去選擇當(dāng)查看或者編輯該文件之時要使用多個應(yīng)用程序的哪個應(yīng)用程序。
還參考圖15,更詳細(xì)地,請求把文件類型關(guān)聯(lián)數(shù)據(jù)寫入到配置存儲器的請求被攔截(步驟1502)。在一些實施例中,該配置存儲器是WINDOWS注冊表數(shù)據(jù)庫。請求把數(shù)據(jù)寫入到該配置存儲器的請求可以由用戶模式掛鉤函數(shù),核心模式掛鉤函數(shù),文件系統(tǒng)過濾器驅(qū)動器,或者微型驅(qū)動器而攔截。
確定該請求是否尋求去更新在該配置存儲器中的文件類型關(guān)聯(lián)信息(步驟1504)。在一個實施例中,這是通過檢測此該攔截的請求是否表明它的目的是去修改該配置存儲器來實現(xiàn)的。在另一實施例中,把該請求的目標(biāo)與包括在該請求中的信息相比較,以確定該請求是否在試圖去修改該配置存儲器。對于在該配置存儲器是注冊表數(shù)據(jù)庫的實施例而言,請求修改注冊表的請求被攔截,正如在第4.2節(jié)所描述的。
如果確定出該請求沒有試圖去更新該配置存儲器,那么就不發(fā)生任何的更新(步驟1506)。在一些實施例中,確定出沒有做出任何去更新該配置存儲器的試圖,原因在于該攔截的請求是讀請求。在其他實施例中,當(dāng)在該配置存儲器中的目標(biāo)條目和包括在該攔截的請求中的信息完全相同或者大體上完全相同之時,可以作此確定。
然而,如果在步驟1504中確定出該請求目的是去更新該配置存儲器,那么就在該配置存儲器中創(chuàng)建新條目,或者更新現(xiàn)有的條目(步驟1508)。在一些實施例中,規(guī)則確定在哪個隔離范圍中創(chuàng)建或者更新該條目。在一些實施例中,是在系統(tǒng)范圍或者應(yīng)用程序隔離范圍中,創(chuàng)建新條目或者更新現(xiàn)有的條目。在許多任何實施例中,是在適當(dāng)?shù)挠脩舾綦x范圍中創(chuàng)建新條目或者更新現(xiàn)有的條目。如果創(chuàng)建了新條目,那么它并不標(biāo)識在該攔截的請求中所標(biāo)識的應(yīng)用程序,而是列出一個選擇器應(yīng)用程序作為要在訪問特定類型的文件之時要使用的應(yīng)用程序。在一些實施例中,當(dāng)安裝新版本的應(yīng)用程序之時,或者當(dāng)安裝了另一個用于處理相同文件類型的應(yīng)用程序之時,或者當(dāng)應(yīng)用程序注冊或者取消注冊它自己處理那種特定類型的文件之時,就自動地更新該選擇器工具。在一些實施例中,該選擇器工具能夠在它的合適的應(yīng)用程序的列表中并入任何注冊來處理維持在其他范圍(諸如系統(tǒng)范圍)和應(yīng)用范圍(如果該選擇器工具執(zhí)行在用戶范圍中)中的配置存儲器的部分中的相同文件類型的任何應(yīng)用程序。如果現(xiàn)有的條目被更新了,并且該現(xiàn)有的條目已經(jīng)把該選擇器應(yīng)用程序列為當(dāng)使用那個特定文件類型的文件之時要使用的應(yīng)用程序,那么就可以更新由該選擇器為那種文件類型而呈現(xiàn)的應(yīng)用程序列表,用以包括該更新的應(yīng)用程序。如果更新了該現(xiàn)有的條目,但是它卻沒有列出該選擇器應(yīng)用程序,那么就讓該更新的條目去把該選擇器應(yīng)用程序列為當(dāng)使用那個特定文件類型的文件之時要使用的應(yīng)用程序。在這些實施例中,可以把與相關(guān)聯(lián)的應(yīng)用程序相關(guān)的信息存儲在相關(guān)聯(lián)的配置文件中,或者在一些實施例中,存儲為注冊表數(shù)據(jù)庫中的條目。
該選擇器應(yīng)用程序可以向用戶呈現(xiàn)與選定的文件類型相關(guān)聯(lián)的應(yīng)用程序的列表。該應(yīng)用程序還可以允許該用戶去挑選用戶想要使用來處理該文件的應(yīng)用程序。該選擇器然后在適當(dāng)?shù)姆秶到y(tǒng)范圍;應(yīng)用程序隔離范圍;或者用戶隔離范圍中啟動該應(yīng)用程序。在一些實施例中,該選擇器工具維持與文件類型相關(guān)聯(lián)的缺省應(yīng)用程序的身份標(biāo)識。在這些實施例中,該缺省的應(yīng)用程序可以由沒有訪問桌面或者被配置成使用該缺省的處理程序的進程使用,而不向用戶展示選項。
4.7進程在隔離環(huán)境之間的動態(tài)移動本發(fā)明的附加方面是用于在不同的虛擬范圍之間移動運行著的進程的工具。換言之,在應(yīng)用程序正在執(zhí)行的同時,可以把由隔離環(huán)境200展示給應(yīng)用程序?qū)嵗谋緳C資源的聚合視圖改變成不同的聚合視圖。這樣就在該進程正在運行的同時允許把已經(jīng)被在特定隔離范圍之內(nèi)隔離的進程“移動”到另一個隔離范圍。這對于系統(tǒng)服務(wù)或者進程(每次它們中只有一個實例可以執(zhí)行)(諸如在窗口操作系統(tǒng)中的MSI服務(wù))特別有用。還可以使用本發(fā)明的這一方面來允許用戶順序地工作在若干隔離范圍中。
參考圖16,在簡單的概況中,示出一個用于在一個隔離范圍和第二隔離范圍之間,或者在系統(tǒng)范圍和隔離范圍之間移動進程的進程的一個實施例。正如在此說明書中所使用的,術(shù)語″目標(biāo)隔離范圍″將被使用來指代正在把進程移動到的那個隔離范圍(包括系統(tǒng)范圍),并且術(shù)語″源隔離范圍″將被使用來指代該進程正在被從其移動開的那個隔離范圍(包括系統(tǒng)范圍)。如圖所示的16,在簡單的概況中,一種用于把進程移動到目標(biāo)隔離范圍的方法,包括步驟確保該進程處于安全狀態(tài)(步驟1602);在規(guī)則引擎中把該進程的關(guān)聯(lián)從它的源隔離范圍移動到目標(biāo)隔離范圍(步驟1604);為任何過濾器驅(qū)動器或者掛鉤而把該進程的關(guān)聯(lián)從源隔離范圍移動到目標(biāo)隔離范圍(步驟1606);并且允許該進程恢復(fù)執(zhí)行(步驟1608)。
還參考圖16,更詳細(xì)地,當(dāng)正在把進程移動到不同的隔離范圍的同時,該進程應(yīng)該處于″安全″狀態(tài)(步驟1602)。在一些實施例中,監(jiān)視該進程,用以確定它沒有在處理請求的時間。在這些實施例中,當(dāng)沒有任何請求被進程處理之時,該進程被視為是處于適合移動的″安全″狀態(tài)中。在這些實施例的一些實施例中,一旦該進程被視為是處于″安全″狀態(tài)中,那么就延遲到該進程的新請求,直到該進程被移動為止。在其他實施例中,諸如結(jié)合診斷應(yīng)用程序的實施例中,可以提供用戶接口來觸發(fā)隔離范圍的改變。在這些實施例中,該用戶接口可以運行把要移動的進程置于″安全″狀態(tài)中的代碼。在再一些其他的實施例中,管理程序可以通過延遲所有進入到該進程的請求并且等待該進程去完成任何活動的請求的執(zhí)行來迫使該進程進入到″安全″狀態(tài)中。
把與目標(biāo)隔離范圍相關(guān)聯(lián)的規(guī)則加載到該規(guī)則引擎中(如果它們尚不存在于規(guī)則引擎中的話)(步驟1603)。
在規(guī)則引擎中改變該進程與源隔離范圍之間的關(guān)聯(lián)(步驟1604)。如上所述,進程能夠被與任何隔離范圍相關(guān)聯(lián)。該關(guān)聯(lián)被該規(guī)則引擎使用在對虛擬本機資源的每一個請求上,用以確定施加到該請求的規(guī)則。通過在規(guī)則引擎中改變適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)就能夠把應(yīng)用程序?qū)嵗c目標(biāo)隔離范圍相關(guān)聯(lián)。在一些實施例中,寫入新的數(shù)據(jù)庫條目,它把該進程與新隔離范圍相關(guān)聯(lián)。在其他實施例中,重寫用于存儲與該進程相關(guān)聯(lián)的隔離范圍的標(biāo)識符的樹節(jié)點,用以標(biāo)識該新的隔離范圍。在再一些其他的實施例中,能夠做出操作系統(tǒng)請求,用以為進程分配附加存儲器,以存儲與目標(biāo)隔離范圍相關(guān)聯(lián)的規(guī)則,或者在一些實施例中,存儲該規(guī)則的標(biāo)識符。
該關(guān)聯(lián)或者該規(guī)則無論被存儲在規(guī)則引擎之外的何處,諸如過濾器驅(qū)動器,核心模式掛鉤,或者用戶模式掛鉤,都改變該進程與源隔離范圍的關(guān)聯(lián)(步驟1606)。對于在進程和隔離范圍規(guī)則之間的關(guān)聯(lián)是根據(jù)PID而加以維持的實施例而言,就改變在進程PID和規(guī)則集合之間的關(guān)聯(lián)。對于PID沒有被使用來維持在進程和適用的隔離規(guī)則集合之間的關(guān)聯(lián)的實施例而言,可以改動用戶模式掛鉤函數(shù),用以訪問與目標(biāo)隔離范圍相關(guān)聯(lián)的規(guī)則集合。對于與隔離范圍的規(guī)則集合的進程關(guān)聯(lián)被維持在規(guī)則引擎的實施例而言,改變以上在步驟1604中存儲在規(guī)則引擎中的關(guān)聯(lián)是足夠的。
該進程被允許在新隔離范圍中恢復(fù)執(zhí)行(步驟1610)。對于新請求被延遲了或者被禁止產(chǎn)生的實施例而言,就把那些請求發(fā)給該進程和允許新請求。
在一個特別有用的方面,上述的方法可以被使用來虛擬化MSI,由微軟出品并可用于微軟WINDOWS的系列操作系統(tǒng)中的一些操作系統(tǒng)的安裝打包以及安裝技術(shù)。通過由這一技術(shù)為安裝所打包的應(yīng)用程序稱為MSI包。支持這一技術(shù)的操作系統(tǒng)具有輔助安裝MSI包的WINDOWS服務(wù),稱為MSI服務(wù)。此服務(wù)在系統(tǒng)上有單個實例。希望安裝MSI包的進程,在向該MSI服務(wù)發(fā)出COM調(diào)用的會話中運行一個MSI進程。
MSI安裝能夠被虛擬化,用于把MSI包安裝到應(yīng)用程序隔離環(huán)境中。從概念上講,這能夠通過鉤住或者攔截在對MSI服務(wù)的安裝會話中向MSI API所做出的調(diào)用來實現(xiàn)?;コ怏w能夠被使用來確保每次只有一個安裝發(fā)生。當(dāng)接收或者攔截到對MSI API且請求開始新安裝的調(diào)用并且調(diào)用進程被與特別的應(yīng)用程序隔離范圍相關(guān)聯(lián)之時,在該調(diào)用被允許繼續(xù)進行之前,把該MSI服務(wù)置入到該隔離范圍的上下文中。隨著該MSI服務(wù)執(zhí)行它的通常的安裝動作,安裝繼續(xù),不過由MSI服務(wù)所請求的本機資源依照適用的隔離范圍被虛擬化。當(dāng)檢測到該安裝進程結(jié)束之時,就除去在該MSI服務(wù)和隔離范圍之間的關(guān)聯(lián)。盡管以上相對于MSI做出了描述,但是所描述的該技術(shù)也適用的其他安裝安裝。
等效性本發(fā)明可以作為在一個或者多個制造物品中的或者在其中所包括的一個或者多個計算機可讀程序。該制造物品可以是軟盤,硬盤,CD-ROM,閃存存儲器卡,PROM,RAM,ROM,或者磁帶。一般而言,該計算機可讀取程序可以用任何編程語言來實現(xiàn),所述編程語言是LISP,PERL,C,C++,PROLOG,或者任何字節(jié)碼語言(諸如JAVA)。該軟件程序可以作為對象代碼而存儲在一個或者多個制造物品上或者存儲在制造物品中。
在已經(jīng)描述了本發(fā)明的某些實施例之后,現(xiàn)在對于本領(lǐng)域技術(shù)人員而言變得非常清楚明白的是包括本發(fā)明的原理的其他實施例也可以被使用。因此,本發(fā)明不應(yīng)該受限于某些實施例,而更確切地講應(yīng)該僅僅受到后附的權(quán)利要求的精神和范圍的限制。
權(quán)利要求
1.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;(c)把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置;并且(d)使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
2.如權(quán)利要求1所述的方法,其中步驟(b)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外。
3.如權(quán)利要求1所述的方法,其中步驟(b)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外。
4.如權(quán)利要求1所述的方法,其中步驟(c)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。
5.如權(quán)利要求1所述的方法,其中步驟(c)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。
6.如權(quán)利要求1所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
7.如權(quán)利要求1所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
8.如權(quán)利要求1所述的方法,其中步驟(a)包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程產(chǎn)生對資源的請求,該請求包括與資源相關(guān)聯(lián)的標(biāo)識符。
9.如權(quán)利要求1所述的方法,其中步驟(a)還包括接收對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,該標(biāo)識符包括標(biāo)識至少一個COM服務(wù)器的類標(biāo)識符。
10.如權(quán)利要求1所述的方法,其中步驟(d)還包括在由進程提供的接口上與資源通信。
11.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)由執(zhí)行在應(yīng)用程序隔離環(huán)境的之內(nèi)進程確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;(c)把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向所到確定的位置;并且(d)使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
12.如權(quán)利要求11所述的方法,其中步驟(c)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。
13.如權(quán)利要求11所述的方法,其中步驟(c)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置。
14.如權(quán)利要求11所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
15.如權(quán)利要求11所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
16.如權(quán)利要求11所述的方法,其中步驟(a)包括產(chǎn)生對資源的請求,該請求包括與該資源相關(guān)聯(lián)的標(biāo)識符。
17.如權(quán)利要求11所述的方法,其中步驟(a)還包括接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,該標(biāo)識符包括標(biāo)識至少一個COM服務(wù)器的類標(biāo)識符。
18.如權(quán)利要求11所述的方法,其中步驟(d)還包括在由進程提供的接口上與資源通信。
19.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;(c)由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置;并且(d)使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
20.如權(quán)利要求19所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
21.如權(quán)利要求19所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
22.如權(quán)利要求19所述的方法,其中步驟(a)包括產(chǎn)生對資源的請求,該請求與該資源相關(guān)聯(lián)的標(biāo)識符。
23.如權(quán)利要求19所述的方法,其中步驟(a)還包括接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,該標(biāo)識符包括標(biāo)識至少一個COM服務(wù)器的類標(biāo)識符。
24.如權(quán)利要求19所述的方法,其中步驟(d)還包括在接口上與資源通信。
25.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;(c)把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置;并且和(d)由執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程使用駐留在所確定的位置中的資源的實例,來應(yīng)答對該資源的請求。
26.如權(quán)利要求25所述的方法,其中步驟(a)包括產(chǎn)生對資源的請求,該請求包括與資源相關(guān)聯(lián)的標(biāo)識符。
27.如權(quán)利要求25所述的方法,其中步驟(a)還包括接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,所述標(biāo)識符包括類標(biāo)識符,標(biāo)識符標(biāo)識至少一個COM服務(wù)器。該
28.如權(quán)利要求25所述的方法,其中步驟(d)還包括執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)的進程通過接口與資源通信。
29.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi),接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,確定資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;第三進程,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置;并且第四進程,使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
30.如權(quán)利要求29所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
31.如權(quán)利要求29所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
32.如權(quán)利要求29所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
33.如權(quán)利要求29所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
34.如權(quán)利要求29所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
35.如權(quán)利要求29所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
36.如權(quán)利要求29所述的系統(tǒng),其中第一進程和第二進程包括相同的進程。
37.如權(quán)利要求29所述的系統(tǒng),其中第一進程和第三進程包括相同的進程。
38.如權(quán)利要求29所述的系統(tǒng),其中第一進程和第四進程包括相同的進程。
39.如權(quán)利要求29所述的系統(tǒng),其中第一進程、第二進程和第三進程包括相同的進程。
40.如權(quán)利要求29所述的系統(tǒng),其中第一進程、第二進程和第四進程包括相同的進程。
41.如權(quán)利要求29所述的系統(tǒng),其中第一進程、第三進程和第四進程包括相同的進程。
42.如權(quán)利要求29所述的系統(tǒng),其中第一進程、第二進程、第三進程和第四進程包括相同的進程。
43.如權(quán)利要求29所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
44.如權(quán)利要求29所述的系統(tǒng),其中所述資源還包括與駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的第二資源具有不同版本的COM服務(wù)器。
45.如權(quán)利要求29所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
46.如權(quán)利要求29所述的系統(tǒng),其中所述資源在所述資源所駐留在的環(huán)境上還包括至少一個注冊表條目。
47.如權(quán)利要求29所述的系統(tǒng),其中所述資源駐留在第二應(yīng)用程序隔離環(huán)境之內(nèi)。
48.如權(quán)利要求29所述的系統(tǒng),其中第一進程還包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
49.如權(quán)利要求29所述的系統(tǒng),其中第一進程還包括與駐留在所確定的位置中的資源的實例相通信。
50.如權(quán)利要求29所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
51.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)并且確定所述資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;第三進程,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置;并且和第四進程,使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
52.如權(quán)利要求51所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
53.如權(quán)利要求51所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
54.如權(quán)利要求51所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
55.如權(quán)利要求51所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
56.如權(quán)利要求51所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
57.如權(quán)利要求51所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
58.如權(quán)利要求51所述的系統(tǒng),其中第二進程和第三進程包括相同的進程。
59.如權(quán)利要求51所述的系統(tǒng),其中第二進程和第四進程包括相同的進程。
60.如權(quán)利要求51所述的系統(tǒng),其中第一進程、第二進程和、第三進程和第四進程包括相同的進程。
61.如權(quán)利要求51所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
62.如權(quán)利要求51所述的系統(tǒng),其中所述資源還包括與駐留在應(yīng)用程序隔離環(huán)境上的第二資源具有不同版本的COM服務(wù)器。
63.如權(quán)利要求51所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
64.如權(quán)利要求51所述的系統(tǒng),其中所述資源駐留在第二應(yīng)用程序隔離環(huán)境之內(nèi)。
65.如權(quán)利要求51所述的系統(tǒng),其中所述資源在所述資源所駐留在的環(huán)境上還包括至少一個注冊表條目。
66.如權(quán)利要求51所述的系統(tǒng),其中第一進程還包括產(chǎn)生對所述資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
67.如權(quán)利要求51所述的系統(tǒng),其中第一進程還包括與駐留在所確定的位置中的資源實例相通信。
68.如權(quán)利要求51所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
69.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,確定所述資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;第三進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)并且把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向把到所確定的位置;并且第四進程,使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
70.如權(quán)利要求69所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
71.如權(quán)利要求69所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
72.如權(quán)利要求69所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
73.如權(quán)利要求69所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
74.如權(quán)利要求69所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
75.如權(quán)利要求69所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
76.如權(quán)利要求69所述的系統(tǒng),其中第一進程和第二進程以及第三進程和第四進程包括相同的進程。
77.如權(quán)利要求69所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
78.如權(quán)利要求69所述的系統(tǒng),其中所述資源還包括與駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的第二資源具有不同版本的COM服務(wù)器。
79.如權(quán)利要求69所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
80.如權(quán)利要求69所述的系統(tǒng),其中所述資源駐留在第二應(yīng)用程序隔離環(huán)境之內(nèi)。
81.如權(quán)利要求69所述的系統(tǒng),其中所述資源在所述資源所駐留在其內(nèi)的應(yīng)用程序隔離環(huán)境中還包括至少一個注冊表條目。
82.如權(quán)利要求69所述的系統(tǒng),其中第一進程還包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
83.如權(quán)利要求69所述的系統(tǒng),其中第一進程還包括與駐留在所確定的位置中的資源的實例相通信。
84.如權(quán)利要求69所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
85.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,確定所述資源駐留在應(yīng)用程序隔離環(huán)境之外的位置;第三進程,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到所確定的位置;和第四進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)并且使用駐留在所確定的位置中的資源的實例來應(yīng)答對該資源的請求。
86.如權(quán)利要求85所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
87.如權(quán)利要求85所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
88.如權(quán)利要求85所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
89.如權(quán)利要求85所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
90.如權(quán)利要求85所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
91.如權(quán)利要求85所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
92.如權(quán)利要求85所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
93.如權(quán)利要求85所述的系統(tǒng),其中所述資源還包括與駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的第二資源具有不同版本的COM服務(wù)器。
94.如權(quán)利要求85所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
95.如權(quán)利要求85所述的系統(tǒng),其中所述資源駐留在第二應(yīng)用程序隔離環(huán)境之內(nèi)。
96.如權(quán)利要求85所述的系統(tǒng),其中所述資源在所述資源駐留在其上的環(huán)境中還包括至少一個注冊表條目。
97.如權(quán)利要求85所述的系統(tǒng),其中第一進程還包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
98.如權(quán)利要求85所述的系統(tǒng),其中第一進程還包括與駐留在所確定的位置中的資源的實例相通信。
99.如權(quán)利要求85所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
100.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);(c)把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;并且(d)使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
101.如權(quán)利要求100所述的方法,其中步驟(b)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境中。
102.如權(quán)利要求100所述的方法,其中步驟(c)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。
103.如權(quán)利要求100所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程使用定位在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
104.如權(quán)利要求100所述的方法,其中步驟(a)包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程產(chǎn)生對資源的請求,所述請求包括與該資源相關(guān)聯(lián)的標(biāo)識符。
105.如權(quán)利要求100所述的方法,其中步驟(a)還包括接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,所述標(biāo)識符包括標(biāo)識至少一個進程外COM服務(wù)器的類標(biāo)識符。
106.如權(quán)利要求100所述的方法,其中步驟(d)還包括在由進程所提供的接口上與資源相通信。
107.如權(quán)利要求100所述的方法,其中步驟(d)還包括由所請求的資源修改與執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程相關(guān)聯(lián)的窗口。
108.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);(c)把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;并且(d)使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
109.如權(quán)利要求108所述的方法,其中步驟(a)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求。
110.如權(quán)利要求108所述的方法,其中步驟(c)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境。
111.如權(quán)利要求108所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程使用在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
112.如權(quán)利要求108所述的方法,其中步驟(a)包括產(chǎn)生對資源的請求,所述請求包括與資源相關(guān)聯(lián)的標(biāo)識符。
113.如權(quán)利要求108所述的方法,其中步驟(a)還包括接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,所述標(biāo)識符包括標(biāo)識至少一個COM服務(wù)器的類標(biāo)識符。
114.如權(quán)利要求108所述的方法,其中步驟(d)還包括在由進程提供的接口上與資源相通信。
115.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);(c)由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;和(d)使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
116.如權(quán)利要求115所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程,使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對資源的請求。
117.如權(quán)利要求115所述的方法,其中步驟(a)包括產(chǎn)生對資源的請求,所述請求包括與資源相關(guān)聯(lián)的標(biāo)識符。
118.如權(quán)利要求115所述的方法,其中步驟(a)還包括接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,所述標(biāo)識符包括標(biāo)識至少一個COM服務(wù)器的類標(biāo)識符。
119.如權(quán)利要求115所述的方法,其中步驟(d)還包括在由進程所提供的接口上與所述資源相通信。
120.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的方法,所述方法包括步驟(a)接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;(b)確定所請求的資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);(c)把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;并且和(d)由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程使用駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例來應(yīng)答對該資源的請求。
121.如權(quán)利要求120所述的方法,其中步驟(a)包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
122.如權(quán)利要求120所述的方法,其中步驟(a)還包括接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求,所述標(biāo)識符包括類標(biāo)識符,所述標(biāo)識符標(biāo)識至少一個COM服務(wù)器。
123.如權(quán)利要求120所述的方法,其中步驟(d)還包括由執(zhí)行在應(yīng)用程序隔離環(huán)境之外的進程在接口上與資源相通信。
124.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之外,接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,確定資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);第三進程,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;和第四進程,使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
125.如權(quán)利要求124所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
126.如權(quán)利要求124所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
127.如權(quán)利要求124所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
128.如權(quán)利要求124所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
129.如權(quán)利要求124所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
130.如權(quán)利要求124所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
131.如權(quán)利要求124所述的系統(tǒng),其中第一進程和第二進程包括相同的進程。
132.如權(quán)利要求124所述的系統(tǒng),其中第一進程和第三進程包括相同的進程。
133.如權(quán)利要求124所述的系統(tǒng),其中第一進程和第四進程包括相同的進程。
134.如權(quán)利要求124所述的系統(tǒng),其中第一進程、第二進程以及第三進程包括相同的進程。
135.如權(quán)利要求124所述的系統(tǒng),其中第一進程、第二進程以及第四進程包括相同的進程。
136.如權(quán)利要求124所述的系統(tǒng),其中第一進程、第三進程以及第四進程包括相同的進程。
137.如權(quán)利要求124所述的系統(tǒng),其中第一進程、第二進程、第三進程和第四進程包括相同的進程。
138.如權(quán)利要求124所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
139.如權(quán)利要求124所述的系統(tǒng),其中所述資源還包括與駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的第二資源具有不同版本的COM服務(wù)器。
140.如權(quán)利要求124所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
141.如權(quán)利要求124所述的系統(tǒng),其中所述資源在所述資源所駐留在其上的應(yīng)用程序隔離環(huán)境中還包括至少一個注冊表條目。
142.如權(quán)利要求124所述的系統(tǒng),其中第一進程還包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
143.如權(quán)利要求124所述的系統(tǒng),其中第一進程還包括與駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例相通信。
144.如權(quán)利要求124所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
145.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之外,確定所述資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);第三進程,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;并且第四進程,使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
146.如權(quán)利要求145所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
147.如權(quán)利要求145所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
148.如權(quán)利要求145所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
149.如權(quán)利要求145所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
150.如權(quán)利要求145所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
151.如權(quán)利要求145所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
152.如權(quán)利要求145所述的系統(tǒng),其中第一進程和第二進程包括相同的進程。
153.如權(quán)利要求145所述的系統(tǒng),其中第一進程、第二進程和第三進程包括相同的進程。
154.如權(quán)利要求145所述的系統(tǒng),其中第一進程、第二進程和第四進程包括相同的進程。
155.如權(quán)利要求145所述的系統(tǒng),其中第一進程、第二進程、第三進程和第四進程包括相同的進程。
156.如權(quán)利要求145所述的系統(tǒng),其中第二進程和第三進程包括相同的進程。
157.如權(quán)利要求145所述的系統(tǒng),其中第二進程和第四進程包括相同的進程。
158.如權(quán)利要求145所述的系統(tǒng),其中第二進程、第三進程和第四進程包括相同的進程。
159.如權(quán)利要求145所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
160.如權(quán)利要求145所述的系統(tǒng),其中所述資源還包括與駐留在應(yīng)用程序隔離環(huán)境中的第二資源具有不同版本的COM服務(wù)器。
161.如權(quán)利要求145所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
162.如權(quán)利要求145所述的系統(tǒng),其中所述資源在所述資源所駐留在其上的應(yīng)用程序隔離環(huán)境中還包括至少一個注冊表條目。
163.如權(quán)利要求145所述的系統(tǒng),其中第一進程還包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
164.如權(quán)利要求145所述的系統(tǒng),其中第一進程還包括與定位在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例相通信。
165.如權(quán)利要求145所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
166.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,確定所述資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);第三進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之外,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;并且和第四進程,使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
167.如權(quán)利要求166所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
168.如權(quán)利要求166所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
169.如權(quán)利要求166所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
170.如權(quán)利要求166所述的系統(tǒng),其中第二進程執(zhí)行在該環(huán)境之外。
171.如權(quán)利要求166所述的系統(tǒng),其中第四進程執(zhí)行在應(yīng)用程序隔離環(huán)境之內(nèi)。
172.如權(quán)利要求166所述的系統(tǒng),其中第四進程執(zhí)行在該環(huán)境之外。
173.如權(quán)利要求166所述的系統(tǒng),其中第一進程和第三進程包括相同的進程。
174.如權(quán)利要求166所述的系統(tǒng),其中第一進程、第二進程以及第三進程包括相同的進程。
175.如權(quán)利要求166所述的系統(tǒng),其中第一進程、第三進程以及第四進程包括相同的進程。
176.如權(quán)利要求166所述的系統(tǒng),其中第一進程、第二進程、第三進程和第四進程包括相同的進程。
177.如權(quán)利要求166所述的系統(tǒng),其中第二進程和第三進程包括相同的進程。
178.如權(quán)利要求166所述的系統(tǒng),其中第二進程、第三進程以及第四進程包括相同的進程。
179.如權(quán)利要求166所述的系統(tǒng),其中第三進程和第四進程包括相同的進程。
180.如權(quán)利要求166所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
181.如權(quán)利要求166所述的系統(tǒng),其中所述資源還包括與駐留在該環(huán)境上的第二資源具有不同版本的COM服務(wù)器。
182.如權(quán)利要求166所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
183.如權(quán)利要求166所述的系統(tǒng),其中所述資源在所述資源駐留在其上的應(yīng)用程序隔離環(huán)境中還包括至少一個注冊表條目。
184.如權(quán)利要求166所述的系統(tǒng),其中第一進程還包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
185.如權(quán)利要求166所述的系統(tǒng),其中第一進程還包括與駐留在應(yīng)用程序隔離環(huán)境之內(nèi)的資源的實例相通信。
186.如權(quán)利要求166所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
187.一種用于由應(yīng)用程序訪問由操作系統(tǒng)所提供的資源的系統(tǒng),所述系統(tǒng)包括資源;第一進程,接收對資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求;第二進程,確定所述資源駐留在應(yīng)用程序隔離環(huán)境之內(nèi);第三進程,把對該資源和與該資源相關(guān)聯(lián)的標(biāo)識符的請求重定向到應(yīng)用程序隔離環(huán)境;并且和第四進程,執(zhí)行在應(yīng)用程序隔離環(huán)境之外,使用駐留在應(yīng)用程序隔離環(huán)境中的資源的實例來應(yīng)答對該資源的請求。
188.如權(quán)利要求187所述的系統(tǒng),其中第一進程執(zhí)行在該環(huán)境之內(nèi)。
189.如權(quán)利要求187所述的系統(tǒng),其中第一進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
190.如權(quán)利要求187所述的系統(tǒng),其中第二進程執(zhí)行在該環(huán)境之內(nèi)。
191.如權(quán)利要求187所述的系統(tǒng),其中第二進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
192.如權(quán)利要求187所述的系統(tǒng),其中第三進程執(zhí)行在該環(huán)境之內(nèi)。
193.如權(quán)利要求187所述的系統(tǒng),其中第三進程執(zhí)行在應(yīng)用程序隔離環(huán)境之外。
194.如權(quán)利要求187所述的系統(tǒng),其中第一進程和第四進程包括相同的進程。
195.如權(quán)利要求187所述的系統(tǒng),其中第一進程、第二進程以及第四進程包括相同的進程。
196.如權(quán)利要求187所述的系統(tǒng),其中第一進程、第三進程以及第四進程包括相同的進程。
197.如權(quán)利要求187所述的系統(tǒng),其中第一進程、第二進程、第三進程和第四進程包括相同的進程。
198.如權(quán)利要求187所述的系統(tǒng),其中第二進程和第四進程包括相同的進程。
199.如權(quán)利要求187所述的系統(tǒng),其中第二進程、第三進程以及第四進程包括相同的進程。
200.如權(quán)利要求187所述的系統(tǒng),其中第三進程和第四進程包括相同的進程。
201.如權(quán)利要求187所述的系統(tǒng),其中所述資源還包括COM服務(wù)器。
202.如權(quán)利要求187所述的系統(tǒng),其中所述資源還包括與駐留在該環(huán)境之內(nèi)的第二資源具有不同版本的COM服務(wù)器。
203.如權(quán)利要求187所述的系統(tǒng),其中所述標(biāo)識符與第一資源和第二資源相關(guān)聯(lián)。
204.如權(quán)利要求187所述的系統(tǒng),其中所述資源在所述資源駐留在其上的應(yīng)用程序隔離環(huán)境之內(nèi)還包括至少一個注冊表條目。
205.如權(quán)利要求187所述的系統(tǒng),其中第一進程還包括產(chǎn)生對資源的請求,所述請求包括與所述資源相關(guān)聯(lián)的標(biāo)識符。
206.如權(quán)利要求187所述的系統(tǒng),其中第一進程還包括與定位在該環(huán)境之內(nèi)的資源的實例相通信。
207.如權(quán)利要求187所述的系統(tǒng),其中第一進程或者第二進程或者第三進程或者第四進程還包括COM服務(wù)控制管理器。
208.一種用于把應(yīng)用程序與隔離環(huán)境相關(guān)聯(lián)的方法,所述方法包括步驟(a)獲得所請求的應(yīng)用程序的位置;(b)在所請求的應(yīng)用程序和應(yīng)用程序隔離環(huán)境之間創(chuàng)建關(guān)聯(lián);(c)存儲關(guān)聯(lián);和(d)把所請求的應(yīng)用程序啟動到應(yīng)用程序隔離環(huán)境中。
209.如權(quán)利要求208所述的方法,其中步驟(a)包括定位所請求的應(yīng)用程序。
210.如權(quán)利要求208所述的方法,其中步驟(a)還包括定位駐留在操作系統(tǒng)的本機層中的請求的應(yīng)用程序。
211.如權(quán)利要求208所述的方法,其中步驟(a)還包括定位駐留在第二應(yīng)用程序隔離環(huán)境上的應(yīng)用程序隔離范圍中的請求的應(yīng)用程序。
212.如權(quán)利要求208所述的方法,其中步驟(a)包括定位在第二應(yīng)用程序隔離環(huán)境上的請求的應(yīng)用程序。
213.如權(quán)利要求208所述的方法,其中步驟(b)包括把第二應(yīng)用程序與應(yīng)用程序隔離環(huán)境相關(guān)聯(lián)。
214.如權(quán)利要求208所述的方法,其中步驟(b)包括把該應(yīng)用程序與第二應(yīng)用程序隔離環(huán)境相關(guān)聯(lián)。
215.如權(quán)利要求208所述的方法,其中步驟(c)還包括把關(guān)聯(lián)存儲到應(yīng)用程序隔離環(huán)境上。
216.如權(quán)利要求208所述的方法,其中步驟(c)包括把關(guān)聯(lián)存儲在文件中。
217.如權(quán)利要求208所述的方法,其中步驟(c)包括把關(guān)聯(lián)存儲在知識庫中的配置條目中。
218.如權(quán)利要求208所述的方法,其中步驟(c)包括把關(guān)聯(lián)存儲在上下文菜單中。
219.一種用于把應(yīng)用程序與隔離環(huán)境相關(guān)聯(lián)的環(huán)境,所述環(huán)境包括應(yīng)用程序隔離環(huán)境,包括應(yīng)用程序隔離范圍和用戶隔離范圍;重定向器,獲得由代表用戶執(zhí)行的進程所產(chǎn)生的對應(yīng)用程序的請求,獲得所請求的應(yīng)用程序所駐留在的位置,并且把來自于所確定的位置的所請求的應(yīng)用程序啟動到應(yīng)用程序隔離環(huán)境中;并且在所請求的應(yīng)用程序和應(yīng)用程序隔離環(huán)境之間的關(guān)聯(lián),由重定向器維持。
220.如權(quán)利要求219所述的環(huán)境,其中所述重定向器駐留在應(yīng)用程序隔離環(huán)境上。
221.如權(quán)利要求219所述的環(huán)境,其中所述重定向器定位在第二應(yīng)用程序隔離環(huán)境上的所請求的應(yīng)用程序。
222.如權(quán)利要求219所述的環(huán)境,其中所述重定向器定位在操作系統(tǒng)的本機層上的所請求的應(yīng)用程序。
223.如權(quán)利要求219所述的環(huán)境,其中所述重定向器攔截對應(yīng)用程序的請求。
224.如權(quán)利要求219所述的環(huán)境,其中所述重定向器查閱在所請求的應(yīng)用程序和所請求的應(yīng)用程序駐留在的位置之間的存儲的關(guān)聯(lián),用以確定所請求的應(yīng)用程序所駐留在的位置。
225.如權(quán)利要求219所述的環(huán)境,還包括規(guī)則引擎,用于規(guī)定重定向器的行為。
226.如權(quán)利要求225所述的環(huán)境,其中所述重定向器還包括響應(yīng)于配置機制來配置規(guī)則引擎。
227.如權(quán)利要求219所述的環(huán)境,其中所述重定向器包括文件系統(tǒng)過濾器驅(qū)動器。
228.如權(quán)利要求219所述的環(huán)境,其中所述重定向器包括函數(shù)掛鉤機制。
229.如權(quán)利要求228所述的環(huán)境,其中所述函數(shù)掛鉤設(shè)備攔截選自多個進程創(chuàng)建操作、COM服務(wù)器操作以及窗口服務(wù)操作中的操作。
230.如權(quán)利要求219所述的環(huán)境,其中所述關(guān)聯(lián)包括知識庫中的配置條目。
231.如權(quán)利要求219所述的環(huán)境,其中所述關(guān)聯(lián)包括由重定向器所存儲的文件。
232.如權(quán)利要求219所述的環(huán)境,其中所述關(guān)聯(lián)包括上下文菜單條目。
全文摘要
一種用于把執(zhí)行著的進程從源隔離范圍移動到目標(biāo)隔離范圍的方法,包括確定該進程處于適合于移動的狀態(tài)中的步驟。該進程的關(guān)聯(lián)從源隔離范圍變化到目標(biāo)隔離范圍。一條規(guī)則與目標(biāo)隔離范圍相關(guān)聯(lián)地加載。
文檔編號G06F9/46GK101073059SQ200580041045
公開日2007年11月14日 申請日期2005年9月23日 優(yōu)先權(quán)日2004年9月30日
發(fā)明者N·A·比塞特, A·羅伊喬德里, R·J·馬扎費里 申請人:茨特里克斯系統(tǒng)公司