在微过滤器中,如何获取打开文件的路径?
In a minifilter, how do I get the path the file was opened with?
我的 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
returns "The name that was used when the handle was opened to this file"。我相信它因此应该给我 \Device\HarddiskVolume2\a\b\b.txt
而不是 \Device\HarddiskVolume2\b\b.txt
。我错过了什么?
除非文件被缓存,在这种情况下您将得到 "resolved".
我建议只使用 FLT_FILE_NAME_OPENED 摆脱其他两个标志。
查看 Alex Carp 关于这些标志的 this 文章。
干杯,
加布里埃尔
我的 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
returns "The name that was used when the handle was opened to this file"。我相信它因此应该给我 \Device\HarddiskVolume2\a\b\b.txt
而不是 \Device\HarddiskVolume2\b\b.txt
。我错过了什么?
除非文件被缓存,在这种情况下您将得到 "resolved".
我建议只使用 FLT_FILE_NAME_OPENED 摆脱其他两个标志。
查看 Alex Carp 关于这些标志的 this 文章。
干杯,
加布里埃尔