// Check allocation
struct sNTFS_IndexHeader *hdr = (void*)buf;
ASSERT(hdr->EntriesOffset + 0x18 < len);
+ // Apply update sequence
+ ASSERT(hdr->UpdateSequenceOfs + 2*hdr->UpdateSequenceSize <= len);
+ NTFS_int_ApplyUpdateSequence(buf,len, (void*)(buf+hdr->UpdateSequenceOfs), hdr->UpdateSequenceSize);
size_t ofs = hdr->EntriesOffset + 0x18;
ent = NTFS_int_IterateIndex(buf + ofs, len - ofs, &Pos);
vcn ++;
}
if( !ent ) {
- LEAVE('i', 1);
- return -1;
+ LEAVE_RET('i', -1);
}
// TODO: This is not future-proof
while( (len = NTFS_ReadAttribData(Allocation, vcn*block_size, block_size, buf)) )
{
struct sNTFS_IndexHeader *hdr = (void*)buf;
+ // Apply update sequence
+ ASSERT(hdr->UpdateSequenceOfs + 2*hdr->UpdateSequenceSize <= len);
+ NTFS_int_ApplyUpdateSequence(buf,len, (void*)(buf+hdr->UpdateSequenceOfs), hdr->UpdateSequenceSize);
+
LOG("VCN %x: Ofs=%x, Size=%x",
vcn, hdr->EntriesOffset, hdr->EntriesSize);
if( hdr->ThisVCN != vcn ) {
ret = &types.tpl_file.Node;
ret->Type = &gNTFS_FileType;
types.tpl_file.Data = NTFS_GetAttrib(Disk, MFTEntry, NTFS_FileAttrib_Data, "", 0);
+ ret->Size = types.tpl_file.Data->DataSize;
}
ret->Inode = MFTEntry;
ret->ImplPtr = Disk;
if( len == 0 )
break;
tNTFS_IndexHeader *hdr = (void*)buf;
+
+ if( memcmp(&hdr->Magic, "INDX", 4) != 0 ) {
+ Log_Notice("NTFS", "FindDir %p:%X:%x index magic bad %08x",
+ disk, Node->Inode, ofs / unit_len, hdr->Magic);
+ break;
+ }
+ // Apply update sequence
+ if(hdr->UpdateSequenceOfs + 2*hdr->UpdateSequenceSize > len) {
+ Log_Notice("NTFS", "FindDir %p:%X:%x index update sequence out of buffer (%x+%x>%x)",
+ disk, Node->Inode, ofs / unit_len,
+ hdr->UpdateSequenceOfs, 2*hdr->UpdateSequenceSize, len);
+ break;
+ }
+ NTFS_int_ApplyUpdateSequence(buf,len, (void*)(buf+hdr->UpdateSequenceOfs), hdr->UpdateSequenceSize);
+ // Search
//mftent = NTFS_BTreeSearch(len, (void*)buf, NTFS_BTreeSearch_CmpI30, name16len*2, name16);
mftent = NTFS_BTreeSearch(
len-(hdr->EntriesOffset+0x18), buf+hdr->EntriesOffset+0x18,
);
}
- if( !mftent ) {
+ if( !mftent || (mftent & (1ULL << 63)) ) {
LEAVE('n');
return NULL;
}