首页
社区
课程
招聘
[求助]有谁研究过NTFS解析?
发表于: 2009-4-8 21:46 5480

[求助]有谁研究过NTFS解析?

2009-4-8 21:46
5480
这几天在做解析NTFS文件,遇到点问题...

$INDEX_ALLOCATION

typedef struct {
        ULONGLONG   MFTnum;
        WORD        IndexLen;
        WORD        FileNameOffset;
        WORD        IndexSign;
        WORD        Fill;
        ULONGLONG   FMFTnum;
        ULONGLONG   CreateTime;
        ULONGLONG   ModifyTime;
        ULONGLONG   RecordModifyTime;
        ULONGLONG   LastVisitTime;
        ULONGLONG   FileAlloc;
        ULONGLONG   FileSize;
        ULONGLONG   FileSign;
        BYTE        FileNameLen;
        BYTE        FileNameAir;
        BYTE        FileName;
}NTFS_INDEX_ITEM, *PNTFS_INDEX_ITEM;

case 0xA0:   //$INDEX_ALLOCATION
                        {
                                pAss = pData;

                                pAss = pAss + 0x48;

                                if(!Run(pAss, FMapOut)){
                                        MyErr("[GetMFTRecordData]run 操作失败!", 0);
                                        return 1;
                                }

                                for(DWORD i = 1; i <= FMapOut[0].NumsOfLcn; i++)
                                {
                                        Lcn = FMapOut[i].StartLcn;
                                        Len.QuadPart = Lcn * VolumeCluUnit * 512;

                                        if(!SetFilePointer(SysHandle, Len.LowPart, &Len.HighPart, FILE_BEGIN)){
                                                MyErr("[GetMFTRecordData]设置文件指针失败!", GetLastError());
                                                return 1;
                                        }

                                        for (DWORD j = 0; j < FMapOut[i].NumsOfLcn / (8 / VolumeCluUnit); j++)
                                        {
                                                if(!ReadFile(SysHandle, pIndex, 4096, &BytesRead, NULL)){
                                                        MyErr("[GetMFTRecordData]读取数据出错", GetLastError());
                                                        return 1;
                                                }
                                                if(*(DWORD*)pIndex != 0x58444e49)
                                                        break;

                                                pAss = pIndex;

                                                pAss = pAss + 0x18;

                                                pAss = pAss + *(DWORD*)pAss;

                                                do
                                                {
                                                        IndexNameLen = ((NTFS_INDEX_ITEM*)pAss)->FileNameLen;

                                                        if(IndexNameLen != 0){

                                                                ZeroMemory(IndexName, MAX_PATH*2);

                                                                int k = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK,
                                                                        (LPCWSTR)(&((NTFS_INDEX_ITEM*)pAss)->FileName), IndexNameLen,
                                                                        IndexName, MAX_PATH*2,
                                                                        NULL, NULL);
                                                                if(k == 0){
                                                                        MyErr("[GetMFTRecordData]Unicode to Ansii 失败!", GetLastError());
                                                                        continue;
                                                                }

                                                                IndexName[k] = '\0';
                                                               
                                                                //Flag标志查看指定文件夹下的文件目录
                                                                if (Flag == TRUE)
                                                                {
                                                                        if(strcmp(IndexName, File) == 0){
                                                                                FMapOut[0].StartLcn = ((NTFS_INDEX_ITEM*)pAss)->MFTnum;
                                                                                return 20;
                                                                        }
                                                                }
                                                                else
                                                                {
                                                                        //过滤8.3格式,防止重复列举(无规律)

                                                                        if(!(IndexName[6] == '~'|| IndexName[5] == '~'|| IndexName[7] == '1'|| IndexName[7] == '~'|| \
                                                                                strcmp(IndexName, ".") == 0 || strcmp(IndexName, "") == 0)){  

                                                                                MyFileInfo(pAss, IndexName, FileCount);
                                                                                FileCount++;
                                                                        }
                                                                       
                                                                }
                                                               
                                                        }
                                                       

                                                        Last = ((NTFS_INDEX_ITEM*)pAss)->IndexSign;

                                                        pAss = pAss + ((NTFS_INDEX_ITEM*)pAss)->IndexLen;

                                                } while (Last == 0x00 || Last == 0x01);

                                                if(Last == 0x02)      //0x02代表Index结束
                                                        continue;

                                                if(Last == 0x03)      //0x03代表所有的Index项结束
                                                        continue;

                                        }
                                }

                        }
                        break;

如何来判断IndexName对应的是文件夹还是文件?

貌似NTFS_INDEX_ITEM结构中的FileSign是用来判断文件夹还是文件.

但是,我不知道具体的标志,就是那个常数代表的是文件夹,那个常数代表的文件?

有谁研究过?知道的,还望给小弟解答一下.谢谢..

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
文件属性:

IndxRootEntry->FileAttributes & FILE_ATTRIBUTE_DIRECTORY
2009-4-8 22:08
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
3
#include <PSHPACK1.H>
typedef struct NTFS_INDX_ENTRY{
       
        LARGE_INTEGER        IndexedFile ;

        //目录索引中所引用的文件在MFT中的记录号

        WORD                        Length;

        //该索引项的长度(8字节对齐)

        WORD                        KeyLength;

        //键值长度(非8字节对齐)
       
        ULONG                        Index_Flag ;
        //Index类型标志
        // = 0 :INDEX_FILE_NAME
        // = 1 :INDEX_ENTRY_NODE
        // = 2 :INDEX_ENTRY_END

        LARGE_INTEGER        ParentDirectory ;
       
        //父目录的MFT记录索引

        LARGE_INTEGER        CreationTime;
       
        //创建时间

        LARGE_INTEGER        ChangeTime ;

        //名字被最后修改的时间

        LARGE_INTEGER        LastWriteTime;

        //MFT记录最后修改的时间

        LARGE_INTEGER        LastAccessTime ;

        //MFT最后访问时间

        LARGE_INTEGER        AllocatedSize ;

        //分配的大小

        LARGE_INTEGER        DataSize ;

        //实际文件大小

        DWORD        FileAttributes ;

        //文件属性

        DWORD        ReparsePointTag ;
       
        //重解析点标志

        BYTE        NameLength ;
       
        //名字长度(UNICODE)
       
        BYTE        NameType ;
       
        //名字空间类型

        WCHAR*        Name ;
       
        //文件名(UNICODE)

}NTFS_INDX_ENTRY,*PNTFS_INDX_ENTRY;
#include <poppack.h>
2009-4-8 22:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
01 in user
02 dir
so 0x01|0x02 is dir in use
2009-4-9 10:12
0
游客
登录 | 注册 方可回帖
返回
//