2012-12-14 39 views
2

我有一個頂級微過濾器驅動程序和一個用戶模式服務,與Scanner MSDN example類似。Minifilter驅動程序:如何替換打開的文件內容?

我想讓我的用戶模式服務取代A.txt文件內容,當它在記事本中打開時。

因此,在IRP_MJ_CREATE後操作回調中,我向服務發送通知並等待它向該文件寫入新數據。
但服務無法打開A.txt,因爲它已被記事本鎖定。

如何讓我的服務在不使用內核的情況下寫入數據FltWriteFile
這樣做的最好方法是什麼?

也許取消文件打開,讓服務寫入數據並用相同的參數重新打開它,而不必離開操作後回調?
也許我應該在操作前覆蓋所需的訪問權限?

---
任何信息將不勝感激。如果你認爲這個問題缺乏細節,請告訴我。

回答

2

而不是通過PostOperation通知您的服務,請在PreOperation回調中執行此操作。當您在PostOperation中執行此操作時,文件將已經爲Notepad.exe打開,這就是爲什麼在您的服務中打開失敗。另外,如果你還沒有做,你將不得不等待PreOperation,而你的服務將新的數據寫入文件。

+0

正確。但是在術前,我不能獲取文件名的信息,所以對我來說沒有A.TXT比較。 – alekseyk

+0

@aleksk,我想你應該能夠在獲取文件名使用FltGetFileNameInformation預創建。 – Rohan

+1

我能夠通過修改操作前的共享訪問來實現此目的。
我還是與[FltGetFileNameInformation]混淆(http://msdn.microsoft.com/en-us/library/windows/hardware/ff543032(V = vs.85)的.aspx)文檔,指出FltGetTunneledName必須從-OP後叫了正確的文件名,如果FltGetFileNameInformation在預運算硬鏈接和重命名叫。謝謝。 – alekseyk

0

// Decclaration

PFLT_CALLBACK_DATA Data //Note: you get this in preOperation as argument so dont need to defined explicitly 

PFLT_FILE_NAME_INFORMATION nameInfo=NULL;//must be declared 
NTSTATUS status; 


if(KeCurrentIrql()==PASSIVE_LEVEL)// file operation should be performed in IRQL PASSIVE_LEVEL 
{ 

status=FltGetFileNameInformation(Data,FLT_FILE_NAME_OPENED |FLT_FILE_NAME_qUERY_ALWAYS_ALLOW_CACHE_LOOKUP,&nameInfo); 

if(NT_SUCCESS(status)) 
{ 
status = FltParseFileNameInformation(nameInfo); 
} 
} 

//現在你有nameInfo結構文件Inforamtion。

//你可以像讀取上述使用結構的文檔那樣獲取文件信息將幫助你更多地瞭解它們。特別是PFLT_FILE_NAME_INFORMATION。

1

我真的不同意羅根的答案,因爲該文件可以很好地鎖定記事本之前的任何其他進程。 這不是問題,或者至少不是你應該看看這個問題。

如果你想記事本有一個A.txt的特定視圖,只需使用記事本的FILE_OBJECT並從內核寫你自己。請記住使用ObReferenceObjectByPointer並要求提供WRITE訪問權限。由於訪問模式將是內核模式,您將被允許。

或者,如果您確實希望通過您的服務來完成,請從驅動程序中自行打開文件,併爲您的服務提供一個句柄。從內核模式打開文件可能會壓縮共享模式等等,您需要閱讀文檔FltCreateFileEx2以確保您具有所有必要的參數。 使用ObOpenObjectByPointer您剛打開的FileObject和訪問模式UserMode。確保您將通過KeStackAttachProcess附加到您的用戶模式的進程地址空間。在PostCreate操作

訂單:(the_file,ignore_share_access,ETCC)

  • KeStackAttachProcess(your_service_eprocess)
  • ObOpenObjectByPointer(用戶模式= access_mode)

    1. FltCreateFileEx2 - >現在您這個進程有個文件句柄
    2. KeUnstackDetachProcess()
    3. 發送HANDLE指針指向用戶模式進程,因爲它現在可以使用它。
    4. 等待用戶模式服務寫入數據並關閉句柄 解引用獲取的FileObject以及關閉句柄FltCreateFileEx2
    5. 讓去創建記事本
    6. 利潤。

    祝你好運。

  • 相關問題