FileInformation-提取文件重命名详细信息

时间:2019-07-04 12:20:31

标签: c++ winapi

当“ 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的情况下完成此任务?

1 个答案:

答案 0 :(得分:1)

当您询问有关is documented的结构时,为什么要看在线上找到的随机代码?

与大多数NT API一样,文件位置可以相对于目录句柄:

  

如果未将文件移动到其他目录,或者FileName成员包含完整路径名,则此成员为NULL。否则,它是文件重命名后将驻留在其中的根目录的句柄。

MSDN还告诉您存在3种可能的组合:

  

FileName成员中的文件名字符串必须以下列格式之一指定。

     
      
  • 一个简单的文件名。 (RootDirectory成员为NULL。)在这种情况下,该文件仅在同一目录中重命名。也就是说,重命名操作会更改文件名,但不会更改其位置。
  •   
  • 完全限定的文件名。 (RootDirectory成员为NULL。)在这种情况下,重命名操作会更改文件的名称和位置。
  •   
  • 相对文件名。在这种情况下,RootDirectory成员包含用于重命名操作的目标目录的句柄。文件名本身必须是一个简单的文件名。
  •   

如果您关心完整路径,则可能需要使用GetFinalPathNameByHandle之类的东西。如果只关心文件名而不关心路径,则可以仅解析FileName成员(名称部分位于最后一个\之后)。

要更改名称,必须使用自己的NtSetInformationFile缓冲区调用真正的FILE_RENAME_INFORMATION函数。