1. 程式人生 > >檔案重定向(hook IRP_MJ_CREATE)

檔案重定向(hook IRP_MJ_CREATE)

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"//hello.txt");
KdPrint((">>> Create/Open FileName:%ws/n", irpSp->FileObject->FileName.Buffer));

if (RtlCompareUnicodeString(&cmpFileName, &irpSp->FileObject->FileName, FALSE) == 0)
{
	pusFileName = &(irpSp->FileObject->FileName);

	/*方法很簡單
	就是把FileObject->FileName.Buffer釋放掉
	然後自己ExAllocatePool...分配一個緩衝區用於儲存重定向的檔名 這裡需要是全檔名
	FileObject->FileName指向新分配的緩衝區
	把新檔名拷貝到FileObject->FileName裡
	設定Irp->IoStatus的值如下
	Irp->IoStatus.Status = STATUS_REPARSE;
	Irp->IoStatus.Information = IO_REPARSE;
	返回STATUS_REPARSE
	經測試跨卷訪問也可以*/

	RtlInitUnicodeString(&usNewFileName, L"//??//E://123//hello.txt");

	pwNewNameBuffer = ExAllocatePool(PagedPool, usNewFileName.MaximumLength);

	if (pwNewNameBuffer == NULL)
	{
		Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
		Irp->IoStatus.Information = 0;
		IoCompleteRequest( Irp, IO_NO_INCREMENT );
		return STATUS_INSUFFICIENT_RESOURCES;
	}

	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;
}

相關推薦

檔案定向hook IRP_MJ_CREATE

Windows的I/O管理器提供了一個方便的方法來重定向一個檔案物件。通常使用檔案過濾驅動(在檔案開啟和檔案建立的操作中)實現該方法。操作方法如下: 1、在IRP_MJ_CREATE的分發函式中,獲得FILE_OBJET的FileName屬性。2、用目標檔案的完整路徑替換

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

Windows的I/O管理器提供了一個方便的方法來重定向一個檔案物件。通常使用檔案過濾驅動(在檔案開啟和檔案建立的操作中)實現該方法。操作方法如下:1、在IRP_MJ_CREATE的分發函式中,獲得FILE_OBJET的FileName屬性。2、用目標檔案的完整路徑替換原有的

定向response.sendRedirect()與請求轉發(RequestDispatcher.foward())

就會 方法 服務器 請求轉發 請求 姓名 報錯 owa 完全 兩個方法都是讓瀏覽器轉向其他資源,它們的區別是: 1.請求轉發要將HttpServletRequest與HttpServletResponse作為參數傳入RequestDispatcher的forward方法,也

thinkphp5 三種定向跳轉

scrip names 成功 三種 line hist server -s 需要 頁面跳轉 在應用開發中,經常會遇到一些帶有提示信息的跳轉頁面,例如操作成功或者操作錯誤頁面,並且自動跳轉到另外一個目標頁面。系統的\think\Controller類內置了兩個跳轉方法succ

shell 輸出定向> >> 2>&1

1、首先,bash中0,1,2三個數字分別代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即標準輸入(一般是鍵盤),標準輸出(一般是顯示屏,準確的說是使用者終端控制檯),標準錯誤(出錯資訊輸出)。 2、輸入輸出可以重定向,所謂重定向輸入

response實現案例之 定向登陸頁面

1.重定向(登陸頁面)                 1) 登陸頁面重定向                 2) 狀態碼302        應頭location                 3) 需求:登陸頁面,使用者名稱和密碼的登陸頁面,使用者名稱和密碼都是adm

Linux命令6:常用檔案定向命令

command > filename 把標準輸出重定向到一個新檔案中 command >> filename 把標準輸出重定向到一個檔

struts2 配置檔案 定向 redirect 帶引數 的寫法

對於所有重定向寫法中URL的各引數間需要以&連線,而不能以&連線! 否則報如下錯誤: The reference to entity "arg2" must end with the ';' delimiter. 【第一種寫法】:使用Disp

64位系統檔案 定向問題遍歷system32目錄檔案問題

檔案重定向檔案系統存在2個獨立的部分(1)32位程式對%systemroot%/system32 的操作存在重定向32位檔案會被重定向到%systemroot%/SysWOW64(2)64位程式對檔案操作不存在重定向(3)補充%systemroot%/SysWOW64下的都為

servlet 定向

except string 瀏覽器 set rri 應用 javax 對象 意思 1.重定向是什麽?   這裏說的重定向是由http協議規定的一種機制。其工作流程如下所述。   (1)客戶端發起http請求,訪問服務器端組件。   (2)服務器端返回一個狀態代碼為302的響

轉發forward定向redirect的區別

border 新的 狀態 rec nbsp url req red 完成 轉發與重定向的主要區別 轉發 重定向 轉發是服務器行為 重定向是客戶端行為 轉發瀏覽器url不改變 重定向瀏覽器url改變 轉發request請求數據不丟失 重定向request請

Django redirect永久定向301

django在redirect()裏面增加這段代碼即可permanent=TrueDjango redirect永久重定向(301)

STM32 的 printf() 函數串口定向HAL庫標準庫都適用

核心 spa color turn scanf函數 main hal pan art 1.建立工程 2.核心:添加新文件usar_fputc.c (名字隨便自己命名),把文件添加到項目中去    #include "stdio.h"  #include "stm32f1xx

純HTML自動刷新頁面或定向http-equiv屬性的refresh

表示 str 網址 http baidu keywords word 自動 aid refresh 屬性值 -- 刷新與跳轉(重定向)頁面 refresh出現在http-equiv屬性中,使用content屬性表示刷新或跳轉的開始時間與跳轉的網址 refresh示例一:

java.net.SocketException: Permission denied將80埠定向到8080埠

很多時候,tomcat是非root賬號,直接將8080改成80,tomcat會報錯 Java.NET.SocketException: Permission denied。原因是非root使用者不能訪問1024一下的埠。 為了解決這種問題,有方法如下:1.將當前使用者配置到sudo規則裡

轉發和定向python

轉發和重定向 轉發:只有一次請求和響應 重定向:兩對以上的請求和響應 使用: render render(request, template_name[, context]) 結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的Htt

springmvc定向springmvc教程三

目錄 工程程式碼 普通引數跳轉 普通引數跳轉 字串返回頁面方式,跳轉,正確方式 ~~字串返回頁面方式,跳轉,錯誤方式~~ ~~正常情況是無法傳遞pojo物件的,只能傳遞簡單的引數,跳轉,錯誤方式

定向redirect和請求轉發forword的區別

1、請求轉發是作用在伺服器,是在伺服器內部進行,重定向是作用在客戶端,相當於客戶端重新發送一次新的請求。 2、轉發後位址列不會改變,重定向後位址列會發生改變。 3、轉發後能獲取到請求中的資料,重定向不能獲取請求中的資料。 4、轉發只能在伺服器內部之間進行,重定向可以跳轉到任何網路資源。

Servlet學習筆記之請求轉發與定向RequestDispatcher與sendRedirect

ServletContext可以實現請求轉發(ServletContext請求轉發相關內容見之前部落格:http://blog.csdn.net/megustas_jjc/article/details/53191657),request也可以。HttpServletRequest 和 ServletCont

【javaweb】請求轉發和定向面試經常問

重定向 //之前的寫法 response.setStatus(302); response.setHeader(“Location”, “login_success.html”); //重定向寫法: 重新定位方向 引數即跳轉的位置 response.sendRe