int __cdecl sub_4053E0() { int v0; // eax@1 unsigned int v1; // ecx@1 unsigned int v2; // ebx@6 int v3; // ecx@8 unsigned int v4; // esi@10 unsigned int v5; // eax@13 int v6; // ecx@13 int v7; // esi@14 int v8; // edi@18 unsigned int v9; // edi@23 unsigned int v10; // esi@23 unsigned int v11; // esi@31 unsigned int v12; // esi@44 signed int v13; // eax@47 char v14; // al@50 int v15; // ecx@57 int i; // eax@59 int v17; // esi@64 int v18; // edi@67 int v19; // eax@70 unsigned int v20; // ecx@70 char *v21; // esi@70 char v22; // bl@73 int v23; // esi@73 bool v24; // ST28_4@80 char v26; // al@6 char *v27; // ST14_4@17 int v28; // eax@17 char *v29; // ST14_4@19 int v30; // eax@19 char v31; // zf@22 char v32; // ST24_1@30 char *v33; // ST14_4@30 int v34; // eax@30 char *v35; // ST14_4@39 int v36; // eax@39 char v37; // cf@43 char *v38; // ST14_4@46 int v39; // eax@46 DWORD v40; // eax@52 int v41; // eax@52 int v42; // eax@52 int v43; // eax@67 int s; // [sp+458h] [bp+0h]@1 unsigned int v45; // [sp+454h] [bp-4h]@1 int v46; // [sp+18h] [bp-440h]@1 char *v47; // [sp+28h] [bp-430h]@4 char v48; // [sp+0h] [bp-458h]@6 unsigned int v49; // [sp+Ch] [bp-44Ch]@13 unsigned int v50; // [sp+2Ch] [bp-42Ch]@13 int v51; // [sp+24h] [bp-434h]@14 unsigned int v52; // [sp+1Ch] [bp-43Ch]@14 int v53; // [sp+4h] [bp-454h]@19 int v54; // [sp+10h] [bp-448h]@20 CHAR Buffer; // [sp+334h] [bp-124h]@38 int v56; // [sp+330h] [bp-128h]@38 char v57; // [sp+23h] [bp-435h]@49 char v58; // [sp+234h] [bp-224h]@52 char v59; // [sp+134h] [bp-324h]@52 char v60; // [sp+434h] [bp-24h]@68 char v61; // [sp+444h] [bp-14h]@69 v45 = (unsigned int)& s ^ dword_95E574; v0 = ((unsigned __int8)sub_402260() != 0) + 1; v46 = v0; v1 = 0; do { byte_95E16C[v1] = 0; v1 += 16; } while ( v1 < 0x140 ); if ( v0 & 2 ) v47 = *(char **)(sub_5A2AF0("locale") + 32); else v47 = "----"; v26 = sub_4F9680(); sub_405160((int)&v48, (int)v47, v26); v2 = 0; if ( (unsigned int)dword_95E2D8 < 0x40 ) { if ( (unsigned int)dword_95E2D4 < 0x40 ) { v3 = dword_95E2E0; if ( !dword_95E2E0 ) v3 = sub_80E080(64); v4 = 64; if ( 0x40u % v3 ) v4 = v3 - 0x40u % v3 + 64; sub_538F00(v4); } } v5 = v49; v6 = 64; dword_95E2D8 = 64; v50 = 64; if ( v49 ) { v7 = v49 - 1; v51 = 4 * v49 - 4; v52 = v49; while ( 1 ) { if ( v2 >= v6 ) { v27 = (char *)((int (__thiscall *)(int (***)()))*(off_95E2D0 + 1))(&off_95E2D0); v28 = ((int (__thiscall *)(int (***)()))*off_95E2D0)(&off_95E2D0); sub_5651D0(-2062548864, v28, v27, 1u, 1, (int)"index (0x%08X), array size (0x%08X)", v2); v5 = v49; } v8 = dword_95E2DC + 4 * v2; if ( v7 >= v5 ) { v29 = (char *)(*(int (__thiscall **)(int *))(v53 + 4))(&v53); v30 = (*(int (__thiscall **)(int *))v53)(&v53); sub_5651D0(-2062548864, v30, v29, 1u, 1, (int)"index (0x%08X), array size (0x%08X)", v7); } if ( sub_568A60(*(char **)(v54 + v51), v50, 0, v8) ) { ++v2; ++v50; } v51 -= 4; --v7; v31 = v52-- == 1; if ( v31 ) break; v5 = v49; v6 = dword_95E2D8; } } v9 = v50; v52 = v2; v10 = 0; do { if ( *(int *)((char *)&dword_95E164 + v10) == 3 ) { if ( (unsigned __int8)sub_4047A0(*(char (**)[14])((char *)&off_95E160 + v10), v9) ) { ++v2; byte_95E16C[v10] = 1; ++v9; } } v10 += 16; } while ( v10 < 0x140 ); v50 = 0; if ( v52 ) { do { if ( v50 >= dword_95E2D8 ) { v32 = v50; v33 = (char *)((int (__thiscall *)(int (***)()))*(off_95E2D0 + 1))(&off_95E2D0); v34 = ((int (__thiscall *)(int (***)()))*off_95E2D0)(&off_95E2D0); sub_5651D0(-2062548864, v34, v33, 1u, 1, (int)"index (0x%08X), array size (0x%08X)", v32); } v51 = *(_DWORD *)(dword_95E2DC + 4 * v50); v11 = 0; do { if ( *(int *)((char *)&dword_95E164 + v11) == 3 ) { if ( byte_95E16C[v11] || !sub_565490(v47, "zhCN", 0x7FFFFFFFu) || !sub_565490(v47, "enCN", 0x7FFFFFFFu) || !sub_565490(v47, "zhTW", 0x7FFFFFFFu) || !sub_565490(v47, "enTW", 0x7FFFFFFFu) ) { sub_5656E0(&Buffer, *(char (**)[14])((char *)&off_95E160 + v11), 256); *((_BYTE *)&v56 + sub_565790(&Buffer)) = 0; if ( v2 >= dword_95E2D8 ) { v35 = (char *)((int (__thiscall *)(_DWORD))*(off_95E2D0 + 1))(&off_95E2D0); v36 = ((int (__thiscall *)(_DWORD))*off_95E2D0)(&off_95E2D0); sub_5651D0(-2062548864, v36, v35, 1u, 1, (int)"index (0x%08X), array size (0x%08X)", v2); } if ( sub_568B10(v51, &Buffer, v9, 0, dword_95E2DC + 4 * v2) ) { ++v2; ++v9; } } } v11 += 16; } while ( v11 < 0x140 ); v37 = v50++ + 1 < v52; } while ( v37 ); } v12 = 0; dword_C2B94C = v2; v50 = 63; dword_C2B950 = v2; v51 = 0; do { if ( v2 >= dword_95E2D8 ) { v38 = (char *)((int (__thiscall *)(_DWORD))*(off_95E2D0 + 1))(&off_95E2D0); v39 = ((int (__thiscall *)(_DWORD))*off_95E2D0)(&off_95E2D0); sub_5651D0(-2062548864, v39, v38, 1u, 1, (int)"index (0x%08X), array size (0x%08X)", v2); } *(_DWORD *)(dword_95E2DC + 4 * v2) = 0; v13 = *(int *)((char *)&dword_95E164 + v12); if ( v13 == 3 ) { ++v2; } else { v57 = v13 == 2; if ( v46 & *(int *)((char *)&dword_95E168 + v12) ) { v14 = sub_4047A0(*(char (**)[14])((char *)&off_95E160 + v12), v50); if ( !v14 ) { if ( v57 == v14 ) { v40 = sub_563A70(); sub_564350(v40, &Buffer, 0x100u); sub_402170(0); sub_5659D0(&v58, 256, "Failed to open archive %s: %s", (char)*(char (**)[14])((char *)&off_95E160 + v51)); sub_5656E0(&v59, "Missing or corrupted data", 2147483647); v41 = sub_42E9C0(2); sub_42EA40(v41, 0, &v58, &v59); v42 = sub_563A70(); loc_571320(v42); v12 = v51; } } } ++v2; --v50; byte_95E16C[v12] = 1; } v12 += 16; v51 = v12; } while ( v12 < 0x140 ); if ( v2 > dword_95E2D8 ) { if ( v2 > dword_95E2D4 ) { v15 = dword_95E2E0; if ( !dword_95E2E0 ) { v15 = v2; if ( v2 >= 0x40 ) { dword_95E2E0 = 64; v15 = 64; } else { for ( i = v2 & (v2 - 1); i; i &= i - 1 ) v15 = i; if ( (unsigned int)v15 < 1 ) v15 = 1; } } v17 = v2; if ( v2 % v15 ) v17 = v2 + v15 - v2 % v15; sub_538F00(v17); } } dword_95E2D8 = v2; byte_C2B92D = sub_404920(13) != 0; v43 = sub_7B8CE0(); v18 = v43; if ( sub_7B94E0(v43, "Wow.ini") ) { sub_7B8EE0(v18, "WoW Config", "Region", &dword_C2B8EC, 0); if ( sub_7B8FA0(v18, "WoW Config", "Language", &v60, 16, 0) ) { if ( sub_7B8FA0(v18, "WoW Config", "Country", &v61, 16, 0) ) { sub_5659D0(byte_C2B970, 5, "%s%s", (char)&v60); v19 = 0; v21 = byte_C2B970; v20 = 0; do { if ( !*v21 ) break; ++v20; v19 = *v21++ + (v19 << 8); } while ( v20 < 4 ); dword_EDD3E4 = v19; v22 = sub_565490("enGB", byte_C2B970, 0x7FFFFFFFu) == 0; v23 = 0; while ( sub_565490(byte_C2B970, (&off_98C5E0)[4 * v23], 0x7FFFFFFFu) && (!v22 || sub_565490("enUS", (&off_98C5E0)[4 * v23], 0x7FFFFFFFu)) ) { ++v23; if ( v23 >= 9 ) goto LABEL_84; } dword_DA3BA0 = v23; v24 = v23 == 8; sub_4C96F0(v24); if ( v46 & 1 ) { sub_5A2AF0("locale"); sub_5A2580(byte_C2B970, 1, 0, 0, 1); v47 = byte_C2B970; } } } } LABEL_84: sub_7B7C30(v18); sub_402440(v47); return sub_404510(); }