当“ FileInformationClass”等于“ 10”时(即文件重命名操作),从“ FileInformation”参数提取文件详细信息的最简单,最有效的方法是什么?
我正在尝试拦截NtSetInformation API调用,我想修改结果文件名。
目前,我唯一的代码是NtSetInformationFile的定义,即;
__kernel_entry NTSYSCALLAPI NTSTATUS NtSetInformationFile(
HANDLE FileHandle,
PIO_STATUS_BLOCK IoStatusBlock,
PVOID FileInformation,
ULONG Length,
FILE_INFORMATION_CLASS FileInformationClass
);
我在网上搜索并找到了一个示例,其中FileInformation更改为“ uint32_t”(link-参见第794行),但是用于获取文件详细信息的代码相当广泛(Boost) 。有没有一种有效的方法可以在不使用Boost的情况下完成此任务?
答案 0 :(得分:1)
当您询问有关is documented的结构时,为什么要看在线上找到的随机代码?
与大多数NT API一样,文件位置可以相对于目录句柄:
如果未将文件移动到其他目录,或者FileName成员包含完整路径名,则此成员为NULL。否则,它是文件重命名后将驻留在其中的根目录的句柄。
MSDN还告诉您存在3种可能的组合:
FileName
成员中的文件名字符串必须以下列格式之一指定。
- 一个简单的文件名。 (
RootDirectory
成员为NULL。)在这种情况下,该文件仅在同一目录中重命名。也就是说,重命名操作会更改文件名,但不会更改其位置。- 完全限定的文件名。 (
RootDirectory
成员为NULL。)在这种情况下,重命名操作会更改文件的名称和位置。- 相对文件名。在这种情况下,
RootDirectory
成员包含用于重命名操作的目标目录的句柄。文件名本身必须是一个简单的文件名。
如果您关心完整路径,则可能需要使用GetFinalPathNameByHandle
之类的东西。如果只关心文件名而不关心路径,则可以仅解析FileName
成员(名称部分位于最后一个\
之后)。
要更改名称,必须使用自己的NtSetInformationFile
缓冲区调用真正的FILE_RENAME_INFORMATION
函数。