2

我有一个顶级微过滤器驱动程序和一个用户模式服务,类似于 Scanner MSDN 示例

我希望我的用户模式服务A.txt在记事本中打开文件内容时替换它。

因此,在IRP_MJ_CREATE操作后回调中,我正在向服务发送通知并等待它将新数据写入文件。
但是服务无法打开A.txt,因为它已经被记事本锁定了。

如何允许我的服务在不使用内核FltWriteFile的情况下写入数据?
这样做的最佳方法是什么?

也许取消文件打开,让服务写入数据并使用相同的参数重新打开它而不离开操作后回调?
也许我应该在预操作中覆盖所需的访问权限?

---
任何信息将不胜感激。如果您认为这个问题缺乏细节,请告诉我。

4

3 回答 3

2

不要在 PostOperation 中通知您的服务,而是在 PreOperation 回调中执行此操作。到您在 PostOperation 中执行此操作时,Notepad.exe 文件将已经打开,这就是在您的服务中打开失败的原因。

此外,如果您还没有这样做,则必须在 PreOperation 中等待服务将新数据写入文件。

于 2012-12-15T07:28:15.940 回答
1

我真的不同意Rogan 的回答,因为该文件很可能被记事本之前的任何其他进程锁定。这不是这里的问题,或者至少不是你应该如何看待这个问题。

如果你想让记事本对 A.txt 有一定的看法,只需使用记事本的 FILE_OBJECT 并从内核自己编写。请记住使用ObReferenceObjectByPointer并请求WRITE访问权限。由于访问模式将是内核模式,因此您将被允许。

或者,如果您真的希望它由您的服务完成,请自己从驱动程序打开文件并为您的服务提供句柄。从内核模式打开文件可能会抑制共享模式等,您需要阅读FltCreateFileEx2的文档以确保您拥有所有必要的参数。在您刚刚打开的 FileObject 上使用ObOpenObjectByPointer并访问模式 UserMode。确保您将通过KeStackAttachProcess连接到您的用户模式的进程地址空间。

PostCreate 中的操作顺序:

  1. FltCreateFileEx2(the_file、ignore_share_access 等)
  2. KeStackAttachProcess (your_service_eprocess)
  3. ObOpenObjectByPointer (UserMode=access_mode) -> 现在你的 um 进程有了文件的句柄
  4. KeUnstackDetachProcess ()
  5. HANDLE指针发送到用户模式进程,因为它现在可以使用它。
  6. 等待用户模式服务写入数据并关闭句柄取消引用获得的 FileObject 以及关闭来自FltCreateFileEx2的句柄。
  7. 让创建去记事本
  8. 利润。

祝你好运。

于 2018-01-26T21:28:18.733 回答
0

//声明

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结构中的文件信息。

//您可以获得文件信息,例如阅读上述使用结构的文档将帮助您更多地了解它们。特别是 PFLT_FILE_NAME_INFORMATION 。

于 2016-10-21T05:14:47.227 回答