檔案重定向(採用檔案過濾驅動實現)

2021-08-20 19:46:28 字數 1633 閱讀 5505

原文:

windows的i/o管理器提供了乙個方便的方法來重定向乙個檔案物件。通常使用檔案過濾驅動(在檔案開啟和檔案建立的操作中)實現該方法。操作方法如下:

1、在irp_mj_create的分發函式中,獲得file_objet的filename屬性。

2、用目標檔案的完整路徑替換原有的檔案名字。

這個全名,包括卷裝置物件的名字(例如,device/harddiskvolume0/directory/myfile.txt)。可以釋放掉原有的filename.buffer,同時用自己定義的緩衝區(buffer,以nonpagedpool方式申請)替換它。

3、設定iostatus的status欄位為status_reparse,然後設定information欄位為io_reparse.

4、完成該irp請求。

5、返回status_reparse

i/o管理器接收到該返回後,便會觸發另乙個檔案開啟操作,並傳送乙個irp_mj_create的請求。

‍ 而目標檔案可以是本地或遠端計算機。而若要重定向遠端檔案開啟操作,檔名要遵循以下語法:

"/??/unc/hostname/share/file"

或"/device/mup/hostname/share/file"

或"/device/lanmanagerredirector/hostname/share/file"(在你的目標檔案是cifs/smb/lanmanager的情況下)

在你的首次開啟/建立檔案操作是相對於另乙個檔案物件的時候,沒有必有修改file_object的relatedfileobject域。在重定向時,i/o管理器只考慮filename域,而不考慮relatedfileobject域(在i/o管理器收到status_reparse後,它便會釋放該域)。

i/o管理器為了避免重定向的無限迴圈,在巢狀迴圈中加了一些限制:重定向操作的最大巢狀次數是32.

**:在irp_mj_create例程裡新增如下**:

irpsp = iogetcurrentirpstacklocation(irp);

rtlinitunicodestring(&cmpfilename, l"");

kdprint((">>> create/open filename:%ws/n", irpsp->fileobject->filename.buffer));

if (rtlcompareunicodestring(&cmpfilename, &irpsp->fileobject->filename, false) == 0)

exfreepool( pusfilename->buffer );

pusfilename->buffer = pwnewnamebuffer;

pusfilename->maximumlength = usnewfilename.maximumlength;

rtlcopyunicodestring(pusfilename, &usnewfilename);

irp->iostatus.status = status_reparse;

irp->iostatus.information = io_reparse;

iocompleterequest( irp, io_no_increment );

return status_reparse;

}

基於檔案過濾驅動的檔案重定向

ntstatus sfcreate in pdevice object deviceobject,in pirp irp assert is my device object deviceobject deviceextension deviceobject deviceextension atta...

基於檔案過濾驅動的檔案重定向

ntstatus sfcreate in pdevice object deviceobject,in pirp irp assert is my device object deviceobject deviceextension deviceobject deviceextension atta...

檔案重定向

1.重定向標準輸出 不使用系統標準輸出的預設裝置,將輸出結果直接寫在乙個新的檔案中。command file 把標準輸出重定向到file檔案中 command file 把標準輸出重定向到file檔案中 追加在現有內容的後面 command 1 file 把標準輸出重定向到file中 myfile建...