NTFS中一个文本文件,大于一个蔟的大小,数据运行部分是:
11 01 4B 21 02 16 08 00指向的蔟链却是:
75

6241
6242(360)
为什么,怎么计算的,急pt:还发现一个有意思的问题,运行数据随着我添加的文本文件的增多,竟然发生了改变,但指向蔟号没有改变。

解决方案 »

  1.   

    是你读取的数据不对吧DataRun 存储的连续的, 每个项目大小不确定
    第一个字节表示当前项目的大小和下一个项目的偏移 nLengthBytes = bSize & 0x0F;   //  大小
    nOffsetBytes = bSize >> 4;     //  下一个的偏移而且DataRun 存储的是相对簇号VCN,  不是逻辑的LCN下面的的代码是我用来解释DataRun的BOOL CDataRun::GetOneItem(BYTE **ppDataRun, ULONGLONG *puuLength, ULONGLONG *puuLcnOffset)
    {
    BYTE bSize;
    int nLengthBytes;
    int nOffsetBytes; *puuLength = 0;
    *puuLcnOffset = 0; bSize = **ppDataRun;
    (*ppDataRun) ++; nLengthBytes = bSize & 0x0F;
    nOffsetBytes = bSize >> 4; if(nLengthBytes > 8 || nOffsetBytes > 8)
    return FALSE; memcpy(puuLength, *ppDataRun, nLengthBytes);
    (*ppDataRun) += nLengthBytes; if(nOffsetBytes == 0)
    return TRUE; if ((*ppDataRun)[nOffsetBytes-1] & 0x80)
    *puuLcnOffset = -1;
    memcpy(puuLcnOffset, *ppDataRun, nOffsetBytes);
    (*ppDataRun) += nOffsetBytes; return TRUE;
    }BOOL CDataRun::Parse(ATTR_HEADER *pAttrHead)
    {
    BYTE * pDataRun;
    BOOL bRetVal;
    DATARUN_ENTRY * pItem;
    ULONGLONG uuLength;
    ULONGLONG uuLcnOffset;
    ULONGLONG uuLcn;
    ULONGLONG uuVcn;
    ULONGLONG uuMaxVcn; m_pAttrHead = pAttrHead;
    m_bNonResident = pAttrHead->ResidentType; if(m_bNonResident == FALSE)
    {
    return TRUE;
    }
    else
    {
    pDataRun = (BYTE *)pAttrHead + pAttrHead->NonResident.DataRunOffset;
    uuMaxVcn = pAttrHead->NonResident.LastVCN - pAttrHead->NonResident.StartVCN;
    } for(uuLcn = 0, uuVcn = 0; 
    *pDataRun; 
    )
    {
    bRetVal = GetOneItem(&pDataRun, &uuLength, &uuLcnOffset);
    if(bRetVal == FALSE)
    break; pItem = StdEx::AddToVector(m_ItemList);
    uuLcn += uuLcnOffset; if(uuLcnOffset == 0)
                pItem->uuLCN = -1;
    else
    pItem->uuLCN = uuLcn;
    pItem->uuClusterCount = uuLength;
    pItem->uuFirstVCN = uuVcn;
    uuVcn += uuLength;
    pItem->uuLastVCN = uuVcn-1; if(pItem->uuLastVCN > uuMaxVcn)
    {
    assert(0);
    m_ItemList.clear();
    return FALSE;
    }
    } return TRUE;
    }
      

  2.   

    数据是用winhex读取出来的,没有问题,磁盘是140G的盘,你说的那种情况也有存在,但是这种情况也存在,Pt:winhex可以指向正确的连接,同时我测试的数据是正常的文件(在windows下可见)。