int __fastcall sub_401638(int a1, int a2, int a3, _DWORD *a4) { int result; // r0 int *v9; // r1 char *v10; // r7 int i; // r0 char v12; // t1 char *v13; // r6 int j; // r0 char v15; // t1 _DWORD *v16; // [sp+Ch] [bp-338h] _BYTE v17[4]; // [sp+10h] [bp-334h] BYREF int v18; // [sp+14h] [bp-330h] int v19; // [sp+18h] [bp-32Ch] int v20; // [sp+30h] [bp-314h] BYREF int v21; // [sp+34h] [bp-310h] BYREF int v22; // [sp+38h] [bp-30Ch] BYREF int v23; // [sp+3Ch] [bp-308h] BYREF _BYTE v24[256]; // [sp+40h] [bp-304h] BYREF _BYTE v25[256]; // [sp+140h] [bp-204h] BYREF _DWORD v26[64]; // [sp+240h] [bp-104h] BYREF int v27; // [sp+340h] [bp-4h] v27 = dword_401954; v23 = 0; v21 = 0; v22 = 0; sub_401130(a1: v25, a2: 256); sub_401130(a1: v24, a2: 256); v20 = a2; sub_401130(a1: v17, a2: 32); if ( sub_401C2A(a1: v17) == 0 ) { result = 7; switch ( v18 ) { case 1: goto LABEL_6; case 4: if ( v19 == 1 ) LABEL_6: v9 = dword_4038D8; else v9 = (int *)sub_403D98; goto LABEL_11; case 5: v9 = dword_404258; goto LABEL_11; case 6: v9 = dword_401C58; goto LABEL_11; case 8: v9 = dword_4025D8; LABEL_11: sub_401088(a1: 4220928, a2: v9, a3: 1216); if ( sub_401C40(a1: 4220928) != 0 ) { result = 8; goto LABEL_24; } if ( MEMORY[0x406824] != 2048 ) { result = 5; goto LABEL_24; } v16 = a4; v10 = (char *)v26; sub_4010EC(a1: (char *)v26 + 3, a2: 253); LOWORD(v26[0]) = MEMORY[0x406830]; LOBYTE(v21) = MEMORY[0x406832]; BYTE1(v21) = MEMORY[0x406831]; BYTE2(v21) = MEMORY[0x406830]; sub_401088(a1: v26, a2: 4220980, a3: 256); for ( i = 255; i != -1; --i ) { v12 = *v10++; v24[i] = v12; } v13 = (char *)v26; sub_401088(a1: v26, a2: 4221236, a3: 256); a4 = v16; for ( j = 255; j != -1; --j ) { v15 = *v13++; v25[j] = v15; } if ( sub_401A54(a1: -1593835472, a2: 2048, a3: &v22) == 0 ) { v26[1] = &v21; v26[4] = v25; v26[5] = 256; v26[7] = v24; v26[8] = 256; v26[6] = -1073741008; v26[3] = -805306064; v26[0] = -805305808; v26[2] = 3; if ( sub_401B86(a1: v22, a2: v26, a3: 3) == 0 && sub_401A24(a1: &v23, a2: 1616970288, a3: 1, a4: 2048) == 0 && sub_401BB6(a1: v23, a2: v22) == 0 ) { break; } } result = 9; goto LABEL_24; case 11: case 12: case 13: case 14: case 15: case 16: case 17: abort(); default: goto LABEL_24; } goto LABEL_26; } result = 6; LABEL_24: while ( dword_401954 != v27 ) { ((void (__fastcall *)(int, int))loc_401958)(a1: result, a2: dword_401954 - v27); LABEL_26: if ( sub_401A84(a1: v23, a2: 0, a3: 0, a4: a1, a5: a2, a6: a3, a7: &v20) != 0 ) { if ( v22 != 0 ) sub_401AF6(); if ( v23 != 0 ) sub_401AD6(); result = 10; } else { *a4 = v20; if ( v22 != 0 ) sub_401AF6(); if ( v23 != 0 ) sub_401AD6(); result = 0; } } return result; }