int __fastcall nn::ui2d::ArcExtractor::ReadEntry(nn::ui2d::ArcExtractor *a1, int *a2, nn::ui2d::ArcEntry *a3, int a4) { unsigned int fileCount; // w10 int v5; // w8 bool v6; // w9 unsigned int v7; // w11 __int64 v9; // x20 __int64 v12; // x24 nn::ui2d::ArcEntry *v13; // x25 nn::ui2d::ArcExtractor::FATEntry *m_pFATEntries; // x10 unsigned int nameOffset; // w11 unsigned int v16; // w12 const char *m_pFNTBlock; // x8 __int64 v18; // x10 nn::util *v19; // x0 unsigned int hash; // w8 unsigned int v21; // w10 __int64 v22; // x9 const char *v23; // x10 char *v24; // x8 const char *v25; // x11 const char *v26; // x10 unsigned int v28; // w10 unsigned int v29; // w11 fileCount = a1->m_pFATBlockHeader->fileCount; v5 = *a2; v6 = a1->m_EndianType == 0; v7 = bswap32(fileCount) >> 16; LODWORD(v9) = 0; if ( !a1->m_EndianType ) LOWORD(fileCount) = v7; if ( a4 >= 1 && v5 < fileCount ) { v9 = 0; v12 = a4; v13 = a3; do { m_pFATEntries = a1->m_pFATEntries; nameOffset = m_pFATEntries[v5].nameOffset; v16 = bswap32(nameOffset); if ( v6 ) nameOffset = v16; if ( nameOffset ) { m_pFNTBlock = a1->m_pFNTBlock; v18 = nameOffset & 0xFFFFFF; if ( &m_pFNTBlock[v18] <= a1->m_pDataBlock ) { v22 = 0; v23 = &m_pFNTBlock[(4 * v18)]; while ( 1 ) { v24 = &v13->name[v22]; if ( !v23[v22] ) { v26 = &v23[v22]; goto LABEL_28; } v25 = &v23[v22]; *v24 = v23[v22]; if ( !v23[v22 + 1] ) { v26 = v25 + 1; ++v24; goto LABEL_28; } v24[1] = v23[v22 + 1]; if ( !v25[2] ) { v26 = v25 + 2; v24 += 2; goto LABEL_28; } v24[2] = v25[2]; if ( !v25[3] ) { v26 = v25 + 3; v24 += 3; goto LABEL_28; } v24[3] = v25[3]; if ( !v25[4] ) break; v22 += 5; v24[4] = v25[4]; if ( v22 == 255 ) { v26 = &v23[v22]; v24 = &v13->name[v22]; goto LABEL_28; } } v26 = v25 + 4; v24 += 4; LABEL_28: *v24 = 0; while ( *v26++ ) ; } else { a3[v9].name[0] = 0; } } else { v19 = &a3[v9]; hash = m_pFATEntries[v5].hash; v21 = bswap32(hash); if ( v6 ) nn::util::SNPrintf(v19, 0x100, "%08x", v21); else nn::util::SNPrintf(v19, 0x100, "%08x", hash); } v28 = a1->m_pFATBlockHeader->fileCount; v5 = *a2 + ++v9; v6 = a1->m_EndianType == 0; v29 = bswap32(v28) >> 16; if ( !a1->m_EndianType ) LOWORD(v28) = v29; if ( v9 >= v12 ) break; ++v13; } while ( v5 < v28 ); } *a2 = v5; return v9; }