能力值:
( 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方法,分析文件系统。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
走WINHEX方法,分析文件系统,如何把文件路径与簇号相对应起来呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
走WINHEX方法,分析文件系统,如何把文件路径与簇号相对应起来呢?
|
能力值:
( LV8,RANK:130 )
|
-
-
5 楼
解析NTFS文件系统 得到 文件路径和簇的对应关系。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
看过解析,但是就没有完全没错的
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
没有有好的资料给点思路。你在哪里看到解析了的?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
你有没有好的资料啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
有没有好的资料,指点一下。谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这样速度应该不快吧?还有内存占用比较高吧。特别是文件比较多的情况,路径比较长的情况。保留信息也是有一点困难吧。现在只能保存在内存里。必须一个簇对应一个路径,或是一个簇的范围对应一个路径。但是在解析文件系统时要耗时,在找查时也要耗时。感觉非常耍。有没有更好的办法
|
能力值:
( LV8,RANK:130 )
|
-
-
11 楼
不走解析NTFS的路,那就用FSCTL_GET_RETRIEVAL_POINTERS这个IOCTL,不过一样要枚举出所有文件。WINHEX占用内存小,好像是因为他会把信息保存到文件中。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
winhex是保存在文件里的。但是他的解析非常快。不知道是什么解析的。我现在的思路是批到一个文件后得到他的路径,然后计算出他的簇链。(这里的文件包括删除的文件)。但是就是在这里解析文件系统时统计与路径与簇的对应关系需要很长的时间。有没有好的算法。让解析文件系统比较快。
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
这个没有了,算法优化只能慢慢搞。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
哦。谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
有没有好的资料奉献一点嘛。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
解析NTFS的USN数据库,看看everything的原理吧
|
|
|