專利名稱:一種在只讀的共享目錄中運行需要寫權限的軟件的方法
技術領域:
本發(fā)明涉及一種在只讀的共享目錄中運行需要寫權限的軟件和防止共享沖突的技術,特別是涉及一種組建Windows 9x無盤工作站的技術。
背景技術:
無盤工作站具有成本低、管理方便等優(yōu)點,曾經廣泛用于證券、學校、辦公場所等地方。但是由于無盤工作站的文件都存放在服務器上,許多文件都是各工作站共享使用,當幾個工作站同時讀寫一個共享文件時很容易發(fā)生共享沖突。另外,為了防止共享文件不被用戶有意或無意地破壞,許多文件只能允許用戶讀取,但是很多軟件被設計成需要對這些文件有寫權限,否則就會運行不正常。這就使得無盤工作站上運行軟件受到了很大限制。目前主流的操作系統(tǒng)已經是Windows。由于Windows比DOS要更大,更復雜得多,所以共享沖突的問題也更嚴重和更難解決。這就使Windows無盤工作站一直沒有廣泛應用。
目前Windows 9x無盤工作站公知的文件共享技術有(1)允許任何人讀寫共享文件,在文件被破壞后用備份的文件覆蓋被破壞的文件。由于共享文件極易遭到破壞,所以經常需要恢復,恢復的工作量極大,而且存在共享沖突的問題。(2)把共享文件設為對用戶只讀。但很多必須有寫權限的軟件就不能正常運行了。同樣也仍然存在共享沖突的問題。
發(fā)明內容
針對上述現(xiàn)有的Windows 9x無盤工作站文件共享中的問題,本發(fā)明提供了一種在只讀的共享目錄中運行需要寫權限的32位Windows程序,并且不會發(fā)生共享沖突的方法。該方法包括以下步驟在無盤工作站上運行防止共享沖突應用程序程序;所述防止共享沖突應用程序程序裝入一DLL;所述DLL被裝載在0x80000000-0xBFFFFFFF的地址空間中;所述DLL修改Kernel32.DLL的調用入口,使得有可能導致共享沖突或讀寫訪問違反的API首先轉向所述DLL;在所述DLL中判斷此調用是否有可能導致共享沖突或讀寫訪問違反;如是,把可能導致共享沖突或讀寫訪問違反的文件復制到用戶的私有目錄中,并使所述API實際讀寫所述私有目錄中的文件;具體實施方式
32位Windows有兩個不同的分支,分別使用不同的內核實現(xiàn)。其中Win 95、Win 98、Win ME使用WIN9X內核;WIN NT、WIN 2000、WIN XP、WIN 2003使用NT內核。本發(fā)明適用于9X內核的Windows。
要在Win 9x操作系統(tǒng)下只讀的共享目錄中運行需要寫權限的應用程序,必須首先了解Win 9x操作系統(tǒng)中讀寫文件的機制。
Win 9x中對于一進程的地址空間是如下劃分的在Win 9x中給每個進程分配4GB的虛擬地址空間,即從0到0xFFFFFFFF之間的區(qū)域。其中,分三個部分從0到0x7FFFFFFF之間的區(qū)域這2GB自己是進程的私有空間;從0x80000000到0xBFFFFFFF之間的區(qū)域這1GB區(qū)間是系統(tǒng)存儲所有Win32進程間共享數據的所在處,系統(tǒng)動態(tài)庫KERNEL32.DLL、USER32.DLL、GDI32.DLL、ADVAPI32.DLL都裝在這個空間;而從0xC0000000到0xFFFFFFFF之間的區(qū)域這1GB區(qū)間是操作系統(tǒng)的代碼所在地,包括系統(tǒng)的設備驅動程序(VxD),低層存儲管理代碼和文件系統(tǒng)代碼。上述第一和第二部分屬于RING0,而第三部分屬于RING3。
在Win 9x中應用程序要讀寫文件必須通過KERNEL32.DLL中的API函數。截取這些讀寫文件的API,在調用實際的API函數前先判斷所述函數調用是否會導致共享沖突或者讀寫訪問違反,如是,則把所述函數調用讀寫的文件復制到用戶的私有目錄中,并使所述API函數實際讀寫所述私有目錄中的文件,這樣就完全防止了共享沖突和讀寫訪問違反的問題。私有目錄是用戶有完全訪問權限,并且不和其他用戶共享的目錄。
圖1示出了Win 9x操作系統(tǒng)本身的用于打開Win 9x文件的系統(tǒng)流程示意圖。首先,為打開目標文件,應用程序模塊調用CreateFile;然后KERNEL32.DLL模塊的CreateFile函數判斷是否有權讀寫文件,并且沒有共享沖突。如是,正常打開此文件,否則標識文件打開失敗。
圖2示出了按照本發(fā)明的防止共享沖突和訪問違反方法的一個實施例。金名無盤應用程序啟動時截取KERNEL32.DLL模塊的CreateFile函數,使之在應用程序調用此函數時首先進入金名無盤應用程序的處理模塊。在此模塊中判斷私有目錄中是否有對應的文件,如是,則修改CreateFile的參數,使之指向此私有目錄中的文件;否則判斷此次調用是否有可能導致共享沖突或者訪問違反;如是,則把共享目錄中的文件復制到私有目錄中;修改CreateFile的參數,使之指向此私有目錄中的文件;最后用修改過的參數調用KERNEL32.DLL模塊中原來的CreateFile函數。
其他有可能導致共享沖突或者訪問違反的API函數,例如_lcreat、_lopen、GetPrivateProfileString、WritePrivateProfileString、GetPrivateProfileInt、DeleteFile等截取方法也和CreateFile類似。防止共享沖突的操作只需在文件打開時進行。如果文件以讀寫方式打開,以后對該文件進行讀或寫時不再進行防止共享沖突的操作。對于有些不常用的API函數,例如GetPrivateProfileSection,可以先不截取,他們對應用程序運行的影響很小。也可以在以后需要時再截取。
雖然本發(fā)明已以前述優(yōu)選實施例說明,然其并非用于限制本發(fā)明,任何本領域的普通技術人員,在不脫離本發(fā)明的精神和范圍的情況下,可作各種的更動與修改。因此本發(fā)明的保護范圍以后附的權利要求為準。
權利要求
1.一種在Windows 9x計算機系統(tǒng)中在只有只讀訪問權限的共享目錄上運行需要讀寫訪問權限的應用程序的方法;該計算機系統(tǒng)包括一計算機,Windows 9x操作系統(tǒng),服務器上只讀的共享目錄,文件訪問處理應用程序等;其特征是(1)應用程序運行時需要對只讀的共享目錄有寫權限;(2)所述文件訪問處理應用程序截取KERNEL32.DLL中訪問文件的API函數,使之首先轉向所述文件訪問處理應用程序;在有一應用程序調用所述訪問文件的API函數時,在所述文件訪問處理應用程序中判斷所述調用是否需要寫權限,如是,把所述共享目錄中的文件復制到私有目錄中,并且使所述調用實際訪問所述私有目錄中的文件。
2.根據權利要求1所述的方法,還包括以下步驟如果在所述私有目錄中已經有所述共享目錄中對應的文件,那么總是使所述訪問文件的API函數調用實際訪問所述私有目錄中的文件。
3.根據權利要求2所述的方法,還包括以下步驟如果所述訪問文件的API函數調用有可能導致共享沖突,那么也需要把所述共享目錄中的文件復制到私有目錄中,并且使所述調用實際訪問所述私有目錄中的文件。
全文摘要
一種在Windows 9x計算機系統(tǒng)中只有只讀訪問權限的共享目錄上運行需要讀寫訪問權限的應用程序,并且避免共享沖突的方法;它包括以下步驟截取KERNEL32.DLL中訪問文件的API函數,如果此函數調用會導致共享沖突或者訪問違反,那么就把文件復制到私有目錄中,使API函數打開私有目錄中的文件,以此來防止共享沖突和訪問違反。
文檔編號G06F9/46GK1667577SQ20041000648
公開日2005年9月14日 申請日期2004年3月10日 優(yōu)先權日2004年3月10日
發(fā)明者王榮 申請人:北京金名創(chuàng)業(yè)信息技術有限責任公司