可以通过此DLL文件来解析文件系统及HIVE文件
目前文件系统支持FAT、NTFS
下载地址
http://download.csdn.net/source/17674232009-10-24更新
#define larmaxsize 65535
#define FS_NotExists 0x01 //返回错误代码,0x01为不存在,0X00为正常
#define FS_NotDir 0x02   //非容器对象
#define FS_Empty 0x03  //为空
#define FS_NotReady 0x04  //功能未准备好--DLL未能获取到需要的参数
#define REG_KEY 101  //注册表键typedef class REG{  //枚举注册表返回链表定义
public:
WORD ErrorCode;  
WORD fs;   
WORD regtype; //类型 如:REG_SZ、REG_DWORD、REG_KEY等
DWORD base; //父键在注册表文件内的相对地址
        DWORD r_base;//本身在注册表文件内的相对地址
WCHAR name[maxsize];//名称
BYTE data[larmaxsize];//值的对应数据
DWORD datalen;//数据长度
FILETIME mtime;//修改时间,REG_KEY类型为0
REG * head;
REG * next;
REG * pre;
}FS_REG,*pFS_REG;typedef BYTE * (* FS_PRE_REG)(const wchar_t * path,const wchar_t * Stream);//预读注册表文件入内存,返回此内存指针,需要传给fs_enumreg,第一个参数文件路径,第二个参数流文件名
typedef void * (* FS_ENUMREG)(const wchar_t * RegPath,BYTE * key,void * node);//第一个注册表路径,第二个上面返回的指针,第三个上次枚举的结果
//注册表路径应如下进行转换:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft转换为\Microsoft,即去除HKEY_LOCAL_MACHINE\SOFTWARE,再传入dll
//释放链表方法同文件,即路径(RegPath)传入空参数,注意---不要混淆文件和注册表返回的node,否则将引起不可知错。
typedef int (* FS_REL_REG)(BYTE * key);//释放预读的注册表文件,当不需要枚举时释放。
使用次序FS_PRE_REG---->FS_ENUMREG---->FS_REL_REG2009-10-15更新加入复制文件功能
定义:typedef int (* FS_COPYFILE)(wchar_t * path,wchar_t * Stream);
导出函数为FS_COPYFILE
其中第一个参数为待复制文件全路径,第二个参数为流文件名(没有的话置空)2009-10-15前使用说明//使用流程 FS_REGFIRE --- FS_PRE_READ --- FS_ENUMFILE//定义 
//#define UNICODEtypedef BYTE * (* FSREAD)(LARGE_INTEGER base,DWORD size) ;#define maxsize 255
#define commaxsize 4096class FS_TIME{
public:
WORD year; //年
BYTE month;//月
BYTE day;//日
BYTE zero;//恒为0
BYTE hour;//小时
BYTE minute;//分钟
BYTE second;//秒
};typedef class  FAT {
public:
WORD ErrorCode;//错误信息 01--文件不存在 02--非目录
WORD fs; //FS标记,正常下恒值
BYTE filetype; //文件类型,0--文件,1--目录
WCHAR shortname[13]; //短文件名,以0x00结尾
WCHAR longname[maxsize]; //长文件名
        LARGE_INTEGER filesize;//文件大小
LARGE_INTEGER base;//文件所在目录项的地址
LARGE_INTEGER r_base;//文件内容的地址
DWORD offset; //文件所在目录项的偏移,为短文件名所在项
DWORD clust; //文件开始簇号
FS_TIME ctime; //文件创建日期,FS_TIME定义见上
FS_TIME mtime;//文件创建日期,FS_TIME定义见上
FAT * head; //指向头文件
FAT * next;//指向下一文件
FAT * pre;//指向前一文件
}FS_FAT,*pFS_FAT;typedef class NTFS {
public:
WORD ErrorCode; //错误信息 01--文件不存在 02--非目录
WORD fs; //FS标记,正常下恒值
BYTE filetype;//文件类型,0--文件,1--目录
WCHAR shortname[13];//短文件名,以0x00结尾,定义NameSpace为0x02的为短文件名
WCHAR longname[maxsize];//长文件名
        LARGE_INTEGER filesize;//文件大小
DWORD mftnum;//MFT记录号
FILETIME ctime;//文件创建日期
FILETIME mtime;//文件修改日期
FILETIME mfttime;//MFT修改日期
NTFS * head;//指向头文件
NTFS * next;//指向下一文件
NTFS * pre;//指向前一文件
BYTE hardlinkname[commaxsize];  //硬连接文件名
BYTE symboliclinkname[commaxsize];//符号连接文件名
BYTE streamname[commaxsize];//流文件名}FS_NTFS,*pFS_NTFS;
//NTFS中BYTE hardlinkname[commaxsize]、BYTE symboliclinkname[commaxsize]、BYTE streamname[commaxsize]说明
//WORD namelen  --文件名长度
//WCHAR * name  --文件名,其长度为namelen,hardlinkname不包含盘符,通常形式如同\windows\explorer.exe
//2+namelen*2后是第二个文件名,依次直到namelen==0x00结束//导出函数:
bool FS_REGFIRE(LPTSTR regcode);//注册,参数请为 L"银砾石"
bool FS_PRE_READ(FSREAD FSIO_READ);//传入读取磁盘内容的函数,此函数由主程序提供,典型定义见下。
void * FS_ENUMFILE(LPTSTR path,void * node);//枚举文件,返回类型为FS_NTFS * 或者 FS_FAT *等,依文件系统不同而不同,需主程序自行判断,node为上次枚举结果,传入后由DLL回收,如果不需要回收请设置void * node=NULL;//典型定义,hDev--磁盘句柄,buffer--读取的内容,返回给FS.DLL,注意:FS.DLL总是假设读取是成功的
BYTE * ReadData(LARGE_INTEGER a,DWORD b)
{
if (hDev!=INVALID_HANDLE_VALUE)
 {
    DWORD dwRet;
    SetFilePointer(hDev,a.LowPart,&a.HighPart,FILE_BEGIN);
    ReadFile(hDev,buffer,b,&dwRet,0);
 }
else
 {
 }
return buffer;
}

解决方案 »

  1.   

    支持呀..
    能开源就好.
    NTFS的老话题, 处理了USA吗?
      

  2.   

    usa问题刚开始的时候也碰到过,想了很久没弄明白,后来才在某个贴子中发现的,原来每个扇区有校验. 
      

  3.   

    开源了未必是个好事2009-10-27更新
    增加exfat支持,返回同fat
    修复ntfs短文件名找不到,修复FAT下内存泄露下载地址
    http://download.csdn.net/source/1772776
      

  4.   


    同类型的开源的一堆.
    解析FAT的到处都是, 解析NTFS的 有NTFS 3G.
    解析HIVE 的也有开源工程.
      

  5.   


    解析HIVE我知道codeproject上有一个
    还有没有别的?名字是?