NTFS根据文件号获取文件全路径的思路

NTFS获取指定文件号的文件路径等信息,可以使用参数:FSCTL_GET_NTFS_FILE_RECORD

具体用法详见:http://msdn.microsoft.com/en-us/library/aa364568(VS.85).aspx中说明

思路:

首先需要获取NTFS文件系统文件记录大小

在传入参数中传入磁盘句柄和文件号

分析传出的结构中包含的文件记录信息

提取文件名和父目录参考号

递归补齐

下面根据思路给出部分代码

WCHAR *AutoGetFunllPath(HANDLE VolumeHandle,WCHAR *MountPointSlash,ULONG64 FileNumber)
{
 DWORD ReturnByte = 0;
 NTFS_VOLUME_DATA_BUFFER NtfsVolumeDataBuffer;
 NTFS_FILE_RECORD_INPUT_BUFFER NtfsFileRecordInputBuffer;
 NTFS_FILE_RECORD_OUTPUT_BUFFER NtfsFileRecordOutPutBuffer;

 if (DeviceIoControl( VolumeHandle, FSCTL_GET_NTFS_VOLUME_DATA, NULL,
  0,&NtfsVolumeDataBuffer,sizeof(NTFS_VOLUME_DATA_BUFFER),&ReturnByte,NULL) == 0)//获取文件记录大小
 {
  return NULL;
 }

 NtfsFileRecordInputBuffer.FileReferenceNumber.QuadPart = FileNumber;//设置输入参数:文件参考号
 if (DeviceIoControl( VolumeHandle,
  FSCTL_GET_NTFS_FILE_RECORD,
  &NtfsFileRecordInputBuffer,
  sizeof(NTFS_FILE_RECORD_INPUT_BUFFER),
  &NtfsFileRecordOutPutBuffer,
  sizeof(NTFS_FILE_RECORD_OUTPUT_BUFFER)+NtfsVolumeDataBuffer.BytesPerFileRecordSegment-1,//MSDN中有说明
  &RetenByte,
  NULL) == 0)
 {
  return NULL;
 }else
 {
      //提取NtfsFileRecordOutPutBuffer中的想要的信息,关键是提取文件名和父目录参考号
  //判断得到的父目录参考号是否等于5,等于五
  if(父目录参考号 == 5)
  {
   return MountPointSlash;//带有斜线的盘符,如C://这样
  }else
  {
   return AutoGetFunllPath(VolumeHandle,MountPointSlash,父目录参考号);//递归调用获取文件路径
  }
 }
}

提取其中的具体信息可以根据NTFS文件记录结构进行提取

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daiafei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值