int __stdcall sub_E359A0(int a1, int a2, int a3, void (__stdcall **a4)(_DWORD *, int, int, int, int), int a5, int a6, int a7)
{
int result; // eax
int v8; // esi
void (__cdecl *v9)(int); // edi
int (__stdcall *v10)(int); // ebx
int v11; // eax
int v12; // eax
int (__stdcall *v13)(int); // edi
int v14; // edi
_WORD *v15; // esi
int v16; // eax
bool v17; // zf
int v18; // eax
_BYTE *v19; // ecx
_WORD *v20; // esi
int v21; // eax
int v22; // eax
_BYTE *v23; // ecx
int v24; // eax
int (__stdcall *v25)(int); // esi
int v26; // ebx
_DWORD *v27; // ebx
_DWORD *v28; // esi
int v29; // eax
int v30; // eax
int v31; // [esp+8h] [ebp-18h] BYREF
_WORD *v32; // [esp+Ch] [ebp-14h]
_WORD *v33; // [esp+10h] [ebp-10h]
int v34; // [esp+14h] [ebp-Ch]
unsigned int v35; // [esp+18h] [ebp-8h]
int v36; // [esp+1Ch] [ebp-4h] BYREF
int v37; // [esp+30h] [ebp+10h]
int v38; // [esp+30h] [ebp+10h]
v34 = 0;
v31 = 0;
v36 = 0;
v33 = decode_string_xor4((int)&unk_E384B8);
v32 = decode_string_xor4((int)&unk_E384D0);
result = sub_E313DF(4096);
v8 = result;
if ( result )
{
v9 = (void (__cdecl *)(int))dword_E371CC;
dword_E371CC(result);
v35 = 0;
v10 = dword_E37150;
if ( a2 != 1 )
{
do
{
v11 = v10(v8);
v9(v8 + 2 * v11);
++v35;
}
while ( v35 < a2 - 1 );
}
v12 = v10(v8);
v9(v8 + 2 * v12);
v13 = dword_E3716C;
v37 = dword_E3716C(aWql);
v14 = v13(v8);
sub_E313F8(v8);
v15 = v33;
if ( v33 )
{
v16 = v10((int)v33);
v17 = 2 * v16 == 0;
v18 = 2 * v16;
v19 = v33;
if ( !v17 )
{
do
{
*v19++ = 0;
--v18;
}
while ( v18 );
}
dword_E37110(v19, v15);
}
v20 = v32;
if ( v32 )
{
v21 = v10((int)v32);
v17 = 2 * v21 == 0;
v22 = 2 * v21;
v23 = v32;
if ( !v17 )
{
do
{
*v23++ = 0;
--v22;
}
while ( v22 );
}
dword_E37110(v23, v20);
}
v24 = (*(int (__stdcall **)(int, int, int, int, _DWORD))(*(_DWORD *)dword_E3A084 + 80))(
dword_E3A084,
v37,
v14,
48,
0);
v25 = dword_E37168;
v26 = v24;
dword_E37168(v37);
result = v25(v14);
if ( v26 >= 0 )
{
while ( 1 )
{
v30 = v34;
if ( !v34 )
break;
(*(void (__stdcall **)(int, int, int, int *, int *))(*(_DWORD *)v34 + 16))(v34, -1, 1, &v36, &v31);
if ( !v31 )
{
v30 = v34;
break;
}
v27 = (_DWORD *)sub_E313DF(4 * a2);
if ( a2 )
{
v28 = v27;
v38 = a2;
do
{
v29 = sub_E313DF(16);
*v28 = v29;
dword_E37170(v29);
sub_E35421(v36, *(_DWORD *)((char *)v28 + a1 - (_DWORD)v27), *v28);
++v28;
--v38;
}
while ( v38 );
}
(*a4)(v27, a2, a5, a6, a7);
sub_E313F8(v27);
(*(void (__stdcall **)(int))(*(_DWORD *)v36 + 8))(v36);
v36 = 0;
}
(*(void (__stdcall **)(int))(*(_DWORD *)v30 + 8))(v30);
result = v36;
if ( v36 )
result = (*(int (__stdcall **)(int))(*(_DWORD *)v36 + 8))(v36);
}
}
return result;
}