在minifilter中,如何获取文件打开的路径?

时间:2018-01-29 15:45:08

标签: windows driver minifilter junction

我的minifilter驱动程序使用post-create回调将正在打开的文件的路径传递给用户模式进程。微过滤器使用重新分析点来识别需要处理的文件。

PFLT_FILE_NAME_INFORMATION pFNI = NULL;

DWORD FNIFlags = FLT_FILE_NAME_OPENED | 
                 FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP |
                 FLT_FILE_NAME_ALLOW_QUERY_ON_REPARSE;

NTSTATUS Status = FltGetFileNameInformation(Data, FNIFlags, &pFNI);
if (!NT_SUCCESS(Status))
{
    DBG_PRINT_ERROR("FltGetFileNameInformation failed: %#x", Status);
    __leave;
}

DBG_PRINT_INFO("Realize '%wZ'", pFNI->Name);

这样可以正常工作,除非通过NTFS连接打开文件,如下所示:

mkdir c:\a
mkdir c:\b
echo "hello world" >c:\b\b.txt
# ...set reparse point metadata on b.txt
mklink /j c:\a\b c:\b
type c:\a\b\b.txt

type打开文件时,我的驱动程序会打印此输出:

Realize '\Device\HarddiskVolume2\b\b.txt'

因此,在评估联结之后,它看到文件的真实路径,而不是文件的打开路径。

问题是,我的程序依赖于在正在打开的文件的一个父目录中查找配置文件,并且此联结的问题使我的程序错过了配置文件。

MSDN表示FLT_FILE_NAME_OPENED返回“句柄打开此文件时使用的名称”。我认为它应该给我\Device\HarddiskVolume2\a\b\b.txt而不是\Device\HarddiskVolume2\b\b.txt。我错过了什么?

1 个答案:

答案 0 :(得分:1)

除非缓存文件,否则您将获得“已解决” 我建议只使用 FLT_FILE_NAME_OPENED 删除其他两个标记。

查看Alex Carp关于这些标志的this文章。

干杯,
加布里埃尔