我正在实现一个基于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 导致写入请求发送到微过滤器 驱动程序实例附加在启动实例下方并附加到 文件系统。指定实例和上面附加的实例 它不收到写入请求。
任何人都可以解决这个问题吗?谢谢。
间接触发缓存管理器发出PagingIO(以刷新一些脏缓存)。而FltWriteFileEx似乎正在等待这个操作。 解决方案:
如果是pagingIO,则不获取资源。