首页
社区
课程
招聘
根据簇号快速定位文件路径
发表于: 2014-10-11 09:36 7638

根据簇号快速定位文件路径

2014-10-11 09:36
7638
得到了文件的数据区后计算出簇号。如何可能快速的获取到这个文件的路径。如winhex当你点击一个文件的数据区里,他可以得到文件的路径,并且是非常快的获取出到了。占用内存又不大。求高手指点一下。有没有好的思路。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
如果是WIN7+:
用FSCTL_LOOKUP_STREAM_FROM_CLUSTER IO控制码可以实现,速度会有点慢,但可接受吧。
// LocateFileFromCluster.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <winioctl.h>
#include <memory>

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc != 3)
    {
        printf("LocateFileFromCluster.exe <VolumeName> <ClusterNo>\n");
        return 0;
    }

    LOOKUP_STREAM_FROM_CLUSTER_INPUT Input;

    Input.Flags = 0;
    Input.NumberOfClusters = 1;
    Input.Cluster[0].QuadPart = _wtoi64(argv[2]);

    PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT Output = nullptr;
    const DWORD OutputSize = 65536;
    std::unique_ptr<BYTE[]> OutputBuffer(new BYTE[OutputSize]);
    Output = reinterpret_cast<PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT>(OutputBuffer.get());

    HANDLE VolumeHandle = CreateFile(argv[1],
                                     GENERIC_READ,
                                     FILE_SHARE_READ | FILE_SHARE_WRITE,
                                     nullptr,
                                     OPEN_EXISTING,
                                     FILE_FLAG_BACKUP_SEMANTICS,
                                     nullptr);

    if (VolumeHandle == INVALID_HANDLE_VALUE)
    {
        printf("Open volume failed:%d\n", GetLastError());
        return 0;
    }

    DWORD dwBytesReturned = 0;
    BOOL fOk = DeviceIoControl(VolumeHandle,
                               [COLOR="Red"]FSCTL_LOOKUP_STREAM_FROM_CLUSTER[/COLOR],
                               (PVOID)&Input,
                               sizeof(Input),
                               Output,
                               OutputSize,
                               &dwBytesReturned,
                               nullptr);

    CloseHandle(VolumeHandle);

    if (fOk)
    {
        PLOOKUP_STREAM_FROM_CLUSTER_ENTRY Entry = reinterpret_cast<PLOOKUP_STREAM_FROM_CLUSTER_ENTRY>((PCHAR)(Output)+Output->Offset);
        printf("%S\n", Entry->FileName);
    }
    else
    {
        printf("Query failed : %d\n", GetLastError());
    }

	return 0;
}


如果是XP/VISTA,貌似只能走WINHEX方法,分析文件系统。。。。
2014-10-11 10:14
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
走WINHEX方法,分析文件系统,如何把文件路径与簇号相对应起来呢?
2014-10-11 10:43
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
走WINHEX方法,分析文件系统,如何把文件路径与簇号相对应起来呢?
2014-10-11 10:44
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
解析NTFS文件系统 得到 文件路径和簇的对应关系。
2014-10-11 11:02
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看过解析,但是就没有完全没错的
2014-10-11 14:18
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没有有好的资料给点思路。你在哪里看到解析了的?
2014-10-13 08:58
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你有没有好的资料啊。
2014-10-13 08:59
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
有没有好的资料,指点一下。谢谢
2014-10-13 09:10
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这样速度应该不快吧?还有内存占用比较高吧。特别是文件比较多的情况,路径比较长的情况。保留信息也是有一点困难吧。现在只能保存在内存里。必须一个簇对应一个路径,或是一个簇的范围对应一个路径。但是在解析文件系统时要耗时,在找查时也要耗时。感觉非常耍。有没有更好的办法
2014-10-13 09:16
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
不走解析NTFS的路,那就用FSCTL_GET_RETRIEVAL_POINTERS这个IOCTL,不过一样要枚举出所有文件。WINHEX占用内存小,好像是因为他会把信息保存到文件中。
2014-10-13 10:28
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
winhex是保存在文件里的。但是他的解析非常快。不知道是什么解析的。我现在的思路是批到一个文件后得到他的路径,然后计算出他的簇链。(这里的文件包括删除的文件)。但是就是在这里解析文件系统时统计与路径与簇的对应关系需要很长的时间。有没有好的算法。让解析文件系统比较快。
2014-10-13 10:39
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
这个没有了,算法优化只能慢慢搞。
2014-10-13 15:16
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
哦。谢谢
2014-10-13 15:18
0
雪    币: 2592
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
有没有好的资料奉献一点嘛。
2014-10-17 09:10
0
雪    币: 16
活跃值: (430)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
解析NTFS的USN数据库,看看everything的原理吧
2014-12-10 22:58
0
游客
登录 | 注册 方可回帖
返回
//