FltWriteFileEx 导致重入?

问题描述 投票:0回答:1

我正在实现一个基于minifitler的文件透明加密,需要在文件末尾添加一些加密信息。我想在 PostCloseWhenSafe 例程期间将此信息写入文件末尾。

FltWriteFileEx之前获取锁,完成后释放锁:

CtxAcquireResourceExclusive(streamContext->Resource);
DbgPrint("before FltWriteFileEx.\n");
Status = FltWriteFileEx(
    Instance,
    FileObject,
    &ByteOffset,
    WriteLength,
    WriteBuffer,
    FLTFL_IO_OPERATION_NON_CACHED |
    FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET,
    &BytesWritten,
    NULL,
    NULL,
    NULL,
    NULL);
if (!NT_SUCCESS(Status) || BytesWritten == 0) {
    DbgPrint("tail FltWriteFile failed. status = %08x, bytesWritten = %ld.\n", Status, BytesWritten);
    goto EXIT;
}
streamContext->something = xxx;
DbgPrint("after FltWriteFileEx.\n");
CtxReleaseResource(streamContext->Resource);

并且,在PostWrite中,有以下逻辑:

DbgPrint("PostWrite xxx.\n");
DbgPrint("before CtxAcquireResourceExclusive.\n");
CtxAcquireResourceExclusive(streamContext->Resource);

DbgPrint("set streamContext content.\n");

streamContext->something = xxx;

CtxReleaseResource(streamContext->Resource);
DbgPrint("after CtxAcquireResourceExclusive.\n");

现象:有时能成功,有时写入时出现死锁。 工作时记录:

...
before FltWriteFileEx.
PreWrite xxx.
PostWrite xxx.
before CtxAcquireResourceExclusive.
set streamContext content.
after CtxAcquireResourceExclusive.
after FltWriteFileEx.
...

死锁时的日志:

...
before FltWriteFileEx.
PreWrite xxx.
PostWrite xxx.
before CtxAcquireResourceExclusive.

我还在PostWrite中打印了offset和writelen,虽然和FltWriteFileEx中的不同,但确实是在等待PostWrite完成并返回。

但是,根据文件

FltWriteFileEx 导致写入请求发送到微过滤器 驱动程序实例附加在启动实例下方并附加到 文件系统。指定实例和上面附加的实例 它收到写入请求。

任何人都可以解决这个问题吗?谢谢。

driver minifilter
1个回答
0
投票

FltWriteFileEx

间接触发缓存管理器发出PagingIO(以刷新一些脏缓存)。而FltWriteFileEx似乎正在等待这个操作。 解决方案:

如果是pagingIO,则不获取资源。

© www.soinside.com 2019 - 2024. All rights reserved.