本地目錄的唯讀控制(禁止寫 刪除 新建)

2021-04-17 06:08:01 字數 2596 閱讀 4590

2005.4.26

幾句廢話:

這是我在驅網發的第二篇文章,第一篇是關於利用過濾驅動將u盤設定為唯讀的。

這篇是利用檔案系統過濾驅動將乙個目錄(本地硬碟)設定為唯讀,包括禁止修改

檔案,禁止刪除檔案,禁止新建檔案等。 我最終的目的是想實現 利用檔案過濾驅動

將任意盤(包括移動,a等)設定為唯讀。因此我的路還很長,還需要各位的幫助。

正文:

0 準備工作:

由於是對檔案、目錄的攔截。首先要知道如何得到路徑、檔名、碟符等等。否則

你沒有辦法去做判斷。我使用ifs 中的sfilter修改。因此沒有filemon那樣有直接的

函式取得。

在驅動中取得碟符和路徑是分開的。取得碟符使用rtlvolumedevicetodosname (file->deviceobject,&dosname); 取得路徑的方法是:

irpsp = iogetcurrentirpstacklocation( irp );

file = irpsp->fileobject;

rtlcopyunicodestring(&name,&file->filename);

dbgprint(/"%ws/",(&name)->buffer);// 這個地方直接用name.buffer什麼也列印不出來,奇怪

但是這裡要注意的是並不是每乙個irp中的irpsp->fileobject都有,很多時候是null。這個值有

檔案系統來填寫。所以在取路徑前一定要做相應的判斷,否則會藍屏。

1 禁止訪問目錄:

實現禁止訪問目錄是比較簡單的,有很多的方法。我是在irp_mj_directory_control

中判斷是不是要禁止的目錄,然後攔截。攔截的操作我就不多說了,基本一樣:

irp->iostatus.status = status_access_denied;

irp->iostatus.information = 0;

status = irp->iostatus.status;

iocompleterequest(irp, io_no_increment);

return status;

2 設定目錄為唯讀

由於禁止目錄訪問的方法很容易,所以很容易讓人覺得禁止寫是不是就是在irp_mj_write中

判斷目錄路徑然後直接攔截了。我測試後發現不能這樣實現,論壇上的人告我將目錄設定為唯讀

實際上是把目錄下所有檔案設定為唯讀,即有一目錄c://jason你想設定為唯讀,實際的操作是:

對於該目錄下任一檔案xx.xx,當該檔案想進行寫的時候,驅動會得到路徑//jason//xx.xx,此時

判斷檔案的父目錄是不是//jason並攔截之,即可實現//jaosn//xx.xx的唯讀控制。

到目前我實現就是使用這樣的方法,是不是可以直接對目錄進行攔截,我不知道。

有了這個概念,還需要一些技巧去實現。主要是在實現父目錄匹配的字串比較上。這個調

試一下就可以解決了。

3 禁止刪除

禁止刪除也還算簡單,但是如果你象我一樣是乙個人瞎搞,也許不會知道這個方法。在此感謝

joshua_yu 告訴我這個方法。

在irp_mj_set_information中,

pio_stack_location irpsp = iogetcurrentirpstacklocation(irp);

irpsp->parameters.setfile.fileinformationclass == filedispositioninformation

核心的就是判斷irpsp->parameters.setfile.fileinformationclass 是不是等於

filedispositioninformation。

但是我一直很奇怪就是這些技術我怎麼沒有看到,而別人看的到?看的什麼資料??

4 禁止建立檔案

這裡主要就是要區別一下新建檔案和開啟檔案。對於這個過程,joshua_yu有他自己的理解:

「我是這樣認為的:

當我們呼叫createfile並且希望建立乙個檔案的時候,系統會首先傳送乙個標誌為file_open的請求,並且判斷底層檔案系統的返回值,如果返回成功,則表明檔案存在並且已經成功開啟,否則如果返回結果是no such file,則緊接著建立乙個file_open_if請求,得以將檔案建立,所以如果我們在create的options當中發現了file_create,file_open_if和file_overwrite_if三個標誌,則表明一定是在建立而不是開啟。」

原理就是這樣,**實現我是這樣做的:

createdisposition = (irpsp->parameters.create.options>> 24) & 0x000000ff;

if(createdisposition==file_create||createdisposition==file_open_if

||createdisposition==file_overwrite_if)

5 一些其他問題:

由於這個是一點一點改好的,所以我能想到的主要技術就是這麼多了。如果有問題,請和我交流

[email protected]

刪除獲取svn控制的目錄中的版本控制資訊

subversion在本地目錄下,在所有的各級目錄下都會生成.svn的目錄,這也就是用來在本地進行版本控制的輔助檔案。換句話說,只要刪除了這個名字為.svn的目錄,那麼對所在目錄的版本控制也就取消了。這裡給出的辦法是在登錄檔中加入資訊,在滑鼠右鍵選單中增加刪除svn目錄的快捷操作。將下列 拷到文字檔...

Git刪除本地倉庫並建立新的倉庫

1 刪除本地的git倉庫 window環境下找到當前工程的目錄,如myproject,那麼一直點到myproject 在當前目錄,右擊選擇git bash here,點出github客戶端 輸入如下命令 刪除資料夾下的所有 git 檔案 find name git xargs rm rf 2 建立新...

Idea本地刪除受SVN管理的檔案或目錄

首先,直接刪除檔案或目錄物件,此時被本地刪除的物件沒有出現在svn的default變更記錄中,也就是並未與vcs同步,不能直接提交。在svn的locally deleted files列表中找到本地已刪除的物件的記錄,此時它們被svn標記為 deleted locally 選中locally del...