X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FFilesystems%2FNTFS%2Fmain.c;fp=KernelLand%2FModules%2FFilesystems%2FNTFS%2Fmain.c;h=3b17e17e13cf9368568f50c2d6328b5d14f55b4c;hb=ad1ca231acba6e83b2c3f199a6465f4e29282b08;hp=4586e12e5a24354ab699f694b75938c029bb60a4;hpb=c00f6ece0ff9a1ad2d07691122070d52d4397d78;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Filesystems/NTFS/main.c b/KernelLand/Modules/Filesystems/NTFS/main.c index 4586e12e..3b17e17e 100644 --- a/KernelLand/Modules/Filesystems/NTFS/main.c +++ b/KernelLand/Modules/Filesystems/NTFS/main.c @@ -137,7 +137,7 @@ tVFS_Node *NTFS_InitDevice(const char *Device, const char **Options) //NTFS_DumpEntry(disk, 0); // $MFT //NTFS_DumpEntry(disk, 3); // $VOLUME - disk->InodeCache = Inode_GetHandle(); + disk->InodeCache = Inode_GetHandle(NTFS_FreeNode); disk->MFTDataAttr = NULL; disk->MFTDataAttr = NTFS_GetAttrib(disk, 0, NTFS_FileAttrib_Data, "", 0); @@ -223,6 +223,9 @@ int NTFS_int_ApplyUpdateSequence(void *Buffer, size_t BufLen, const Uint16 *Sequ tNTFS_FILE_Header *NTFS_GetMFT(tNTFS_Disk *Disk, Uint32 MFTEntry) { + // TODO: Cache MFT allocation for short-term + + // tNTFS_FILE_Header *ret = malloc( Disk->MFTRecSize ); if(!ret) { Log_Warning("FS_NTFS", "malloc() fail!"); @@ -332,8 +335,12 @@ tNTFS_Attrib *NTFS_GetAttrib(tNTFS_Disk *Disk, Uint32 MFTEntry, int Type, const if( attr->Type != Type ) continue; if( Name ) { - LOG("Name check = '%s'", Name); + if( attr->NameOffset + attr->NameLength*2 > attr->Size ) { + break; + } const void *name16 = (char*)attr + attr->NameOffset; + LOG("Name check: '%s' == '%.*ls'", + Name, attr->NameLength, name16); if( UTF16_CompareWithUTF8(attr->NameLength, name16, Name) != 0 ) continue ; } @@ -345,11 +352,10 @@ tNTFS_Attrib *NTFS_GetAttrib(tNTFS_Disk *Disk, Uint32 MFTEntry, int Type, const ASSERT(attr->NameOffset % 1 == 0); Uint16 *name16 = (Uint16*)attr + attr->NameOffset/2; size_t namelen = UTF16_ConvertToUTF8(0, NULL, attr->NameLength, name16); - size_t edatalen = (attr->NonresidentFlag ? 0 : attr->Resident.AttribLen*4); + size_t edatalen = (attr->NonresidentFlag ? 0 : attr->Resident.AttribLen); tNTFS_Attrib *ret = malloc( sizeof(tNTFS_Attrib) + namelen + 1 + edatalen ); if(!ret) { - LEAVE('n'); - return NULL; + goto _error; } if( attr->NonresidentFlag ) ret->Name = (void*)(ret + 1); @@ -396,12 +402,15 @@ tNTFS_Attrib *NTFS_GetAttrib(tNTFS_Disk *Disk, Uint32 MFTEntry, int Type, const { ret->DataSize = edatalen; memcpy(ret->ResidentData, (char*)attr + attr->Resident.AttribOfs, edatalen); + Debug_HexDump("GetAttrib Resident", ret->ResidentData, edatalen); } + NTFS_ReleaseMFT(Disk, MFTEntry, hdr); LEAVE('p', ret); return ret; } +_error: NTFS_ReleaseMFT(Disk, MFTEntry, hdr); LEAVE('n'); return NULL;