void U8Archive::SetData( const u8 *stuff, u32 len ) { fst = NULL; name_table = NULL; data = NULL; if( !stuff || len < 0x40 ) { gprintf( "SetData(): !stuff || len < 0x40 %p %08x\n", stuff, len ); return; } stuff = FindU8Tag( stuff, len ); if( !stuff ) { gprintf( "U8 tag not found\n" ); return; } const U8Header * binHdr = (const U8Header *)stuff; const u8* fst_buffer = stuff + binHdr->rootNodeOffset; fst = (FstEntry *)fst_buffer; u32 name_table_offset = fst->filelen * 0xC; name_table = (char *)( fst_buffer + name_table_offset ); data = (u8*)stuff; }
bool U8NandArchive::SetFile( const char* nandPath ) { if(fst) free(fst); if(name_table) free(name_table); CloseFile(); // open file if( (fd = ISFS_Open( nandPath, ISFS_OPEN_READ ) ) < 0 ) { gprintf( "U8NandArchive: ISFS_Open( \"%s\" ) failed\n", nandPath ); return false; } // get file size fstats stats __attribute__(( aligned( 32 ) )); int ret = ISFS_GetFileStats( fd, &stats ); if( ret < 0 ) { CloseFile(); gprintf( "U8NandArchive: ISFS_GetFileStats( \"%s\" ) failed\n", nandPath ); return false; } // buffer for reading the header and stuff u8* buffer = (u8*)memalign( 32, 0x800 ); if( !buffer ) { CloseFile(); gprintf( "U8NandArchive: enomem\n" ); return false; } // read a chunk big enough that it should contain the U8 header if there is going to be one if( (ret = ISFS_Read( fd, buffer, 0x800 )) != 0x800 ) { free( buffer ); CloseFile(); gprintf( "U8NandArchive: ISFS_Read( 0x800 ) = %i\n", ret ); return false; } // find the start of the U8 data U8Header* tagStart = (U8Header*)FindU8Tag( buffer, ret ); if( !tagStart ) { free( buffer ); CloseFile(); gprintf( "U8NandArchive: didn't see a U8 tag\n" ); return false; } // remember where in the file the U8 starts dataOffset = ( (u8*)tagStart - buffer ); // allocate memory and read the fst if( !(fst = (FstEntry *)memalign( 32, RU( tagStart->dataOffset - dataOffset, 32 ) ) ) || ( ISFS_Seek( fd, dataOffset + tagStart->rootNodeOffset, SEEK_SET ) != (s32)( dataOffset + tagStart->rootNodeOffset ) ) || ( ISFS_Read( fd, fst, tagStart->dataOffset - dataOffset ) != (s32)( tagStart->dataOffset - dataOffset ) ) || ( fst->filelen * 0xC > tagStart->dataOffset ) ) { dataOffset = 0; free( buffer ); if( fst ) free( fst ); CloseFile(); gprintf( "U8NandArchive: error reading fst\n" ); } // set name table pointer u32 name_table_offset = fst->filelen * 0xC; name_table = ((char *)fst) + name_table_offset; free( buffer ); return true; }
bool U8FileArchive::SetFile( const char* filePath ) { FREE( fst ); FREE( name_table ); CloseFile(); // open file if( !(fd = fopen( filePath, "rb" ) ) ) { gprintf( "U8FileArchive: fopen( \"%s\" ) failed\n",filePath ); return false; } int ret; // buffer for reading the header and stuff u8* buffer = (u8*)memalign( 32, 0x800 ); if( !buffer ) { CloseFile(); gprintf( "U8FileArchive: enomem\n" ); return false; } // read a chunk big enough that it should contain the U8 header if there is going to be one if( (ret = fread( buffer, 0x800, 1, fd )) != 1 ) { free( buffer ); CloseFile(); gprintf( "U8FileArchive: fread( 0x800 ) = %i\n", ret ); return false; } // find the start of the U8 data U8Header* tagStart = (U8Header*)FindU8Tag( buffer, 0x800 ); if( !tagStart ) { free( buffer ); CloseFile(); gprintf( "U8FileArchive: didn't see a U8 tag\n" ); return false; } // remember where in the file the U8 starts dataOffset = ( (u8*)tagStart - buffer ); // allocate memory and read the fst if( !(fst = (FstEntry *)memalign( 32, RU( tagStart->dataOffset - dataOffset, 32 ) ) ) || ( fseek( fd, dataOffset + tagStart->rootNodeOffset, SEEK_SET ) ) || ( fread( fst, tagStart->dataOffset - dataOffset, 1, fd ) != 1 ) || ( fst->filelen * 0xC > tagStart->dataOffset ) ) { gprintf( "U8FileArchive: error reading fst\n" ); gprintf( "%08x, %p, %p, %08x\n", dataOffset, buffer, fst, ftell( fd ) ); dataOffset = 0; free( buffer ); FREE( fst ); CloseFile(); return false; } // set name table pointer u32 name_table_offset = fst->filelen * 0xC; name_table = ((char *)fst) + name_table_offset; free( buffer ); return true; }