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文件记录结构进行提取