int __stdcall codeExe(int a1, int codeData, int retAddr, int dataOfFile, _DWORD *a5, int *a6, _DWORD *a7)
{
struct globalInfo *global; // ebx
struct vmpInfo *vmpInfo; // esi
int v9; // edi
int v10; // ecx
int v11; // esi
int v12; // edx
int *v14; // [esp+1Ch] [ebp-380h]
void *v15; // [esp+20h] [ebp-37Ch]
int *v16; // [esp+24h] [ebp-378h]
void *v17; // [esp+28h] [ebp-374h]
int v18; // [esp+34h] [ebp-368h]
int *v19; // [esp+38h] [ebp-364h]
int v20; // [esp+3Ch] [ebp-360h]
char v21; // [esp+40h] [ebp-35Ch]
char v22; // [esp+140h] [ebp-25Ch]
_BYTE *v23; // [esp+374h] [ebp-28h]
char a4[6]; // [esp+37Ah] [ebp-22h]
int v25; // [esp+380h] [ebp-1Ch]
char *a2; // [esp+384h] [ebp-18h]
int v27; // [esp+388h] [ebp-14h]
int vmpDataSize; // [esp+38Ch] [ebp-10h]
char *v29; // [esp+390h] [ebp-Ch]
char *insSize; // [esp+394h] [ebp-8h]
int v31; // [esp+398h] [ebp-4h]
int vars0; // [esp+39Ch] [ebp+0h]
v19 = 0;
v18 = 0;
v27 = 0;
v16 = &vars0;
v15 = &loc_477095;
v14 = (int *)__readfsdword(0);
__writefsdword(0, (unsigned int)&v14);
global = sub_4760D0();
v31 = vars0 + 8;
global->retAddr = retAddr;
*(_DWORD *)&a4[2] = global->curVmpCode1;
a2 = *(char **)&a4[2];
vmpInfo = global->vmpInfo;
if ( !vmpInfo )
{
sub_4778E8(global);
vmpInfo = global->vmpInfo;
}
a4[1] = 0;
if ( vmpInfo->isVmpFlag == 1 )
{
a4[1] = 1;
simvm_Init(global, v31, 16);
}
while ( 1 )
{
callCodeDecrypt((int)global, dataOfFile, *(int *)&a4[2], &vmpDataSize);
while ( 1 )
{
while ( vmpInfo->isVmpFlag == 1 )
{
a4[0] = 0;
v25 = (int)callVmpHandle(vmpInfo, codeData, *(_BYTE **)&a4[2], (int)a4);
insSize = (char *)(v25 - *(_DWORD *)&a4[2]);
if ( dataOfFile == global->curVmpCodeAddr )
{
GetNextValueByLen(&codeData, (unsigned __int8)a4[0]);
global->curCodeAddr = codeData;
GetNextValueByLen(&dataOfFile, insSize);
global->curVmpCodeAddr = dataOfFile;
}
else
{
dataOfFile = global->curVmpCodeAddr;
codeData = global->curCodeAddr;
}
callCodeDecrypt((int)global, dataOfFile, *(int *)&a4[2], &vmpDataSize);
}
if ( ifCode_simvm_orign(vmpInfo, &a2) != 1 )
break;
a2 = *(char **)&a4[2];
a4[1] = 1;
simvm_Init(global, v31, 16);
}
insSize = &a2[-*(_DWORD *)&a4[2]];
a2 = *(char **)&a4[2];
if ( !a4[1] )
break;
a4[1] = 0;
vmpInfo->field_914 = 1;
}
if ( (signed int)insSize > 0 )
{
GetNextValueByLen(&dataOfFile, insSize);
callCodeDecrypt((int)global, dataOfFile, *(int *)&a4[2], &vmpDataSize);
}
vmpDataSize = off_49DCA8(*(_DWORD *)&a4[2], vmpDataSize, 0, &v20, 4, v14);
*a5 = vmpDataSize;
v9 = unknown_libname_29(32 - vmpDataSize - 6);
a2 = (char *)&global->field_1038 + v9;
qmemcpy(a2, *(const void **)&a4[2], vmpDataSize);
v14 = 0;
*((_BYTE *)&global->field_1038 + v9 + vmpDataSize) = 104;
unknown_libname_56(&v27, &v22);
if ( (unsigned __int8)sub_476200(v27, global->cmpReg1) )
{
unknown_libname_56(&v27, &v21);
if ( sub_466514(&str_FF_0[1], v27) != 1 )
{
insSize = (char *)sub_466514(&str___29[1], v27);
v14 = &v27;
sn11111(v27);
System::__linkproc__ LStrCopy(v14);
insSize = (char *)sub_466578(v27);
if ( vmpDataSize - 1 >= 0 )
{
v10 = vmpDataSize;
v29 = 0;
do
{
v14 = 0;
(v29++)[v9 + 4152 + (_DWORD)global] = -112;
--v10;
}
while ( v10 );
}
insSize += vmpDataSize;
vmpInfo->isVmpFlag1 = vmpInfo->isVmpFlag;
if ( (signed int)insSize <= 0 )
{
insSize += dataOfFile - global->field_1070;
v14 = (int *)&v29;
callCodeDecrypt((int)global, global->field_1070, *(int *)&a4[2], &v29);
}
v23 = sub_475A90(vmpInfo, *(int *)&a4[2], (unsigned int)insSize);
vmpInfo->isVmpFlag = vmpInfo->isVmpFlag1;
if ( !v23 )
global->curCodeAddr1 = global->curCodeAddr;
}
}
else if ( sub_466514(&str_CALL_0[1], v27) == 1 )
{
unknown_libname_56(&v27, &v21);
if ( sub_466514(&str_FF_0[1], v27) != 1 )
{
insSize = (char *)sub_466514(&str___29[1], v27);
v29 = insSize - 1;
v11 = (signed int)(insSize - 1) / 2;
a2 = (char *)&global->field_1038 + v9 + v11;
v14 = &v27;
sn11111(v27);
System::__linkproc__ LStrCopy(v14);
insSize = (char *)sub_466578(v27);
v29 = (char *)(&insSize[codeData] - ((char *)&global->field_1038 + v9));
qmemcpy(a2, &v29, vmpDataSize - v11);
}
insSize = (char *)vmpDataSize;
v23 = (_BYTE *)vmpDataSize;
}
else
{
insSize = (char *)vmpDataSize;
v23 = (_BYTE *)vmpDataSize;
}
*a7 = insSize;
insSize = (char *)retAddr;
a2 = (char *)&global->field_1038 + v9 + vmpDataSize + 1;
qmemcpy(a2, &insSize, 4u);
v14 = 0;
*((_BYTE *)&global->field_103C + v9 + vmpDataSize + 1) = -61;
*a6 = (int)&global->field_1038 + v9;
global->curCodeAddr = codeData + *a7;
global->curVmpCodeAddr = (int)&v23[dataOfFile];
unknown_libname_56(&v19, &v22);
v14 = v19;
unknown_libname_56(&v18, &v21);
v12 = *a6;
sub_47745C(vmpDataSize, v18, v14);
__writefsdword(0, (unsigned int)v15);
v17 = &loc_47709C;
System::__linkproc__ LStrArrayClr(&v18, 2);
return System::__linkproc__ LStrClr(&v27);
}