RtlpUnwindPrologue
__int64 __fastcall RtlpUnwindPrologue(
__int64 a1,
unsigned __int64 a2,
__int64 a3,
_DWORD *a4,
__int64 a5,
char *a6,
_QWORD *a7,
__int64 a8){
unsigned int v9;
__int64 v10;
unsigned int v12;
char v13;
unsigned int v14;
__int64 v15;
__int64 v16;
unsigned __int8 v17;
__int64 v18;
__int64 v19;
unsigned __int64 v20;
__int64 v21;
unsigned __int64 v22;
_QWORD *v23;
unsigned __int64 v25;
__int64 v26;
int v27;
unsigned int v28;
unsigned int v29;
__int64 v30;
unsigned __int64 v31;
__int64 v32;
__int64 v33;
__int64 v34;
__int64(__fastcall **v35)(int, int, int, int, int, int, int, __int64);
__int64 v36;
__int64 v37;
unsigned __int64 v38;
unsigned __int64 v39;
unsigned __int64 *v40;
_QWORD *v41;
_QWORD *v42;
__int64 v43;
__int64 v44;
char *ExtendedFeature2;
__int64 v46;
unsigned int v47;
v46 = a1;
v9 = 0;
v10 = a3;
v47 = 0;
v12 = 0;
while( 1 )
{
v13 = 0;
v14 = a2 - *a4 - a1;
v15 = a1 + (unsigned int)a4[2];
LODWORD(v16) = 0;
if( a2 <= 0x7FFFFFFEFFFFi64 && (v15 & 3) != 0 )
goto LABEL_87;
v17 = *(_BYTE *)(v15 + 2);
if( v17 )
{
do
{
v18 = v15 + 2i64 * (unsigned int)v16;
v19 = *(unsigned __int8 *)(v18 + 5) >> 4;
if( v14 < *(unsigned __int8 *)(v18 + 4) )
{
LODWORD(v16) = RtlpUnwindOpSlots(*(_WORD *)(v18 + 4)) + v16;
}
else
{
if( (*(_BYTE *)(v15 + 2i64 * (unsigned int)v16 + 5) & 0xF) != 0 )
{
if( (*(_BYTE *)(v15 + 2i64 * (unsigned int)v16 + 5) & 0xF) == 4 )
{
v16 = (unsigned int)(v16 + 1);
v25 = v10 + 8i64 * *(unsigned __int16 *)(v15 + 2 * v16 + 4);
if( a2 <= 0x7FFFFFFEFFFFi64 && (v25 & 3) != 0 )
goto LABEL_87;
if( *(_QWORD *)a8 && (v25 < **(_QWORD **)a8 || v25 > **(_QWORD **)(a8 + 8) - 8i64) )
return 3221225512i64;
*(_QWORD *)(a5 + 8 * v19 + 120) = *(_QWORD *)v25;
v26 = *(_QWORD *)(a8 + 16);
if( v26 )
*(_QWORD *)(v26 + 8 * v19 + 128) = v25;
}
else
{
switch( *(_BYTE *)(v15 + 2i64 * (unsigned int)v16 + 5) & 0xF )
{
case 1:
v16 = (unsigned int)(v16 + 1);
v27 = *(unsigned __int16 *)(v15 + 2 * v16 + 4);
if( (_DWORD)v19 )
{
v16 = (unsigned int)(v16 + 1);
v28 = (*(unsigned __int16 *)(v15 + 2 * v16 + 4) << 16) + v27;
}
else
{
v28 = 8 * v27;
}
*(_QWORD *)(a5 + 152) += v28;
break;
case 2:
*(_QWORD *)(a5 + 152) += (unsigned int)(8 * v19 + 8);
break;
case 3:
v30 = *(_QWORD *)(a5 + 8i64 * (*(_BYTE *)(v15 + 3) & 0xF) + 120);
*(_QWORD *)(a5 + 152) = v30;
*(_QWORD *)(a5 + 152) = v30 - (*(_BYTE *)(v15 + 3) & 0xF0);
break;
case 5:
v16 = (unsigned int)(v16 + 2);
v41 = (_QWORD *)(v10
+ ((unsigned __int64)*(unsigned __int16 *)(v15 + 2 * v16 + 4) << 16)
+ *(unsigned __int16 *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4));
if( a2 <= 0x7FFFFFFEFFFFi64
&& (((_BYTE)v10 + (unsigned __int8)*(_WORD *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4)) & 3) != 0 )
{
goto LABEL_87;
}
if( *(_QWORD *)a8
&& ((unsigned __int64)v41 < **(_QWORD **)a8 || (unsigned __int64)v41 > **(_QWORD **)(a8 + 8) - 8i64) )
{
return 3221225512i64;
}
*(_QWORD *)(a5 + 8 * v19 + 120) = *v41;
break;
case 6:
LODWORD(v16) = v16 + 1;
break;
case 7:
LODWORD(v16) = v16 + 2;
break;
case 8:
v16 = (unsigned int)(v16 + 1);
v31 = v10 + 16i64 * *(unsigned __int16 *)(v15 + 2 * v16 + 4);
if( a2 <= 0x7FFFFFFEFFFFi64 && (v31 & 3) != 0 )
goto LABEL_87;
if( *(_QWORD *)a8 && (v31 < **(_QWORD **)a8 || v31 > **(_QWORD **)(a8 + 8) - 16i64) )
return 3221225512i64;
v32 = 2i64 * (unsigned int)v19;
*(_QWORD *)(a5 + 8 * v32 + 416) = *(_QWORD *)v31;
*(_QWORD *)(a5 + 8 * v32 + 424) = *(_QWORD *)(v31 + 8);
v33 = *(_QWORD *)(a8 + 16);
if( v33 )
*(_QWORD *)(v33 + 8 * v19) = v31;
break;
case 9:
v16 = (unsigned int)(v16 + 2);
v42 = (_QWORD *)(v10
+ ((unsigned __int64)*(unsigned __int16 *)(v15 + 2 * v16 + 4) << 16)
+ *(unsigned __int16 *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4));
if( a2 <= 0x7FFFFFFEFFFFi64
&& (((_BYTE)v10 + (unsigned __int8)*(_WORD *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4)) & 3) != 0 )
{
goto LABEL_87;
}
if( *(_QWORD *)a8
&& ((unsigned __int64)v42 < **(_QWORD **)a8 || (unsigned __int64)v42 > **(_QWORD **)(a8 + 8) - 16i64) )
{
return 3221225512i64;
}
v43 = 2i64 * (unsigned int)v19;
*(_QWORD *)(a5 + 8 * v43 + 416) = *v42;
*(_QWORD *)(a5 + 8 * v43 + 424) = v42[1];
v44 = *(_QWORD *)(a8 + 16);
if( v44 )
*(_QWORD *)(v44 + 8 * v19) = v42;
break;
case 0xA:
v36 = *(_QWORD *)(a5 + 152);
v37 = 32i64;
if( !(_DWORD)v19 )
v37 = 24i64;
v38 = v36 + v37;
v13 = 1;
v39 = v36 + 8;
if( !(_DWORD)v19 )
v39 = *(_QWORD *)(a5 + 152);
if( a2 <= 0x7FFFFFFEFFFFi64 && (v39 & 3) != 0 )
goto LABEL_87;
v40 = *(unsigned __int64 **)a8;
if( *(_QWORD *)a8 && (v39 < *v40 || v39 > **(_QWORD **)(a8 + 8) - 8i64) )
return 3221225512i64;
if( a2 > 0x7FFFFFFEFFFFi64 )
goto LABEL_73;
if( (v38 & 3) != 0 )
goto LABEL_87;
v40 = *(unsigned __int64 **)a8;
LABEL_73:
if( v40 && (v38 < *v40 || v38 > **(_QWORD **)(a8 + 8) - 8i64) )
return 3221225512i64;
*(_QWORD *)(a5 + 248) = *(_QWORD *)v39;
*(_QWORD *)(a5 + 152) = *(_QWORD *)v38;
break;
default:
goto LABEL_103;
}
}
}
else
{
v20 = *(_QWORD *)(a5 + 152);
if( a2 <= 0x7FFFFFFEFFFFi64 && (v20 & 3) != 0 )
goto LABEL_87;
if( *(_QWORD *)a8 && (v20 < **(_QWORD **)a8 || v20 > **(_QWORD **)(a8 + 8) - 8i64) )
return 3221225512i64;
*(_QWORD *)(a5 + 8 * v19 + 120) = *(_QWORD *)v20;
v21 = *(_QWORD *)(a8 + 16);
if( v21 )
*(_QWORD *)(v21 + 8 * v19 + 128) = v20;
*(_QWORD *)(a5 + 152) += 8i64;
}
LODWORD(v16) = v16 + 1;
}
v10 = a3;
v17 = *(_BYTE *)(v15 + 2);
}
while( (unsigned int)v16 < v17 );
v12 = v47;
v9 = 0;
}
if( (*(_BYTE *)v15 & 0x20) == 0 )
break;
v29 = v17;
if( (v17 & 1) != 0 )
v29 = v17 + 1;
a4 = (_DWORD *)(v15 + 2 * (v29 + 2i64));
if( a2 <= 0x7FFFFFFEFFFFi64 && ((unsigned __int8)a4 & 3) != 0 )
goto LABEL_87;
a1 = v46;
v47 = ++v12;
if( v12 > 0x20 )
LABEL_103:
RtlRaiseStatus(-1073741569);
}
if( v13 )
{
if( !a6 )
{
LABEL_28:
*a7 = a4;
return 0i64;
}
v35 = &RtlpSafeMachineFrameEntries;
while( (__int64(__fastcall *)(int, int, int, int, int, int, int, __int64))v15 != *v35 )
{
++v9;
++v35;
if( v9 >= 3 )
goto LABEL_26;
}
v13 = 0;
LABEL_26:
if( a6 )
*a6 = v13;
goto LABEL_28;
}
if( a2 <= 0x7FFFFFFEFFFFi64 )
{
v34 = *(_QWORD *)(a5 + 152);
if( (v34 & 3) != 0 )
LABEL_87:
ExRaiseDatatypeMisalignment();
}
if( !*(_QWORD *)a8 || (v22 = *(_QWORD *)(a5 + 152), v22 >= **(_QWORD **)a8) && v22 <= **(_QWORD **)(a8 + 8) - 8i64 )
{
v23 = *(_QWORD **)(a5 + 152);
*(_QWORD *)(a5 + 248) = *v23;
*(_QWORD *)(a5 + 152) = v23 + 1;
if( (*(_DWORD *)(a5 + 48) & 0x100040) == 1048640 )
{
ExtendedFeature2 = RtlLocateExtendedFeature2((_DWORD *)(a5 + 1232), 0xBu, 0xFFFFF780000003D8ui64, 0i64);
if( ExtendedFeature2 )
{
if( (*ExtendedFeature2 & 1) != 0 )
*((_QWORD *)ExtendedFeature2 + 1) += 8i64;
}
}
goto LABEL_26;
}
return 3221225512i64;
}Referenced by:
RtlpxVirtualUnwind