NTFS中一个文本文件,大于一个蔟的大小,数据运行部分是:
11 01 4B 21 02 16 08 00指向的蔟链却是:
75
:
6241
6242(360)
为什么,怎么计算的,急pt:还发现一个有意思的问题,运行数据随着我添加的文本文件的增多,竟然发生了改变,但指向蔟号没有改变。
11 01 4B 21 02 16 08 00指向的蔟链却是:
75
:
6241
6242(360)
为什么,怎么计算的,急pt:还发现一个有意思的问题,运行数据随着我添加的文本文件的增多,竟然发生了改变,但指向蔟号没有改变。
第一个字节表示当前项目的大小和下一个项目的偏移 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;
}