RtlpUnwindEpilogue
NTSTATUS __stdcall RtlpUnwindEpilogue(INT64 a1, UINT64 a2, UINT64 a3, _BYTE *a4, INT64 a5, INT64 a6){
unsigned int v7;
int v9;
INT64 v10;
unsigned int v11;
__int64 v12;
UINT16 v13;
unsigned int v14;
unsigned int v15;
__int64 v16;
unsigned __int64 v17;
__int64 v18;
unsigned __int64 v19;
__int64 v20;
__int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
unsigned __int64 *v25;
__int16 v26;
v7 = a3;
v9 = 0;
while( 1 )
{
v10 = a1 + *((unsigned int *)a4 + 2);
if( a2 <= 0x7FFFFFFEFFFFi64 && (v10 & 3) != 0 )
goto LABEL_55;
v11 = *(unsigned __int8 *)(v10 + 2);
v12 = 0i64;
if( *(_BYTE *)(v10 + 2) )
{
do
{
v13 = *(_WORD *)(v10 + 2 * v12 + 4);
if( (v13 & 0xF00) == 0 )
break;
if( (HIBYTE(v13) & 0xF) == 10 )
break;
v12 = (unsigned int)(RtlpUnwindOpSlots(v13) + v12);
}
while( (unsigned int)v12 < v11 );
if( (unsigned int)v12 < v11 )
goto LABEL_8;
}
if( (*(_BYTE *)v10 & 0x20) == 0 )
{
LABEL_8:
v14 = 0;
if( (unsigned int)v12 >= v11 )
goto LABEL_18;
while( 1 )
{
v15 = v14;
v26 = *(_WORD *)(v10 + 2 * v12 + 4);
v16 = HIBYTE(v26) >> 4;
if( (v26 & 0xF00) != 0 )
break;
if( v14 >= v7 )
{
v17 = *(_QWORD *)(a5 + 152);
if( a2 <= 0x7FFFFFFEFFFFi64 && (v17 & 3) != 0 )
goto LABEL_55;
if( *(_QWORD *)a6 && (v17 < **(_QWORD **)a6 || v17 > **(_QWORD **)(a6 + 8) - 8i64) )
return -1073741784;
*(_QWORD *)(a5 + 152) += 8i64;
*(_QWORD *)(a5 + 8 * v16 + 120) = *(_QWORD *)v17;
v18 = *(_QWORD *)(a6 + 16);
if( v18 )
*(_QWORD *)(v18 + 8 * v16 + 128) = v17;
}
v12 = (unsigned int)(v12 + 1);
v14 = v15 + 2 - ((unsigned int)v16 < 8);
if( (unsigned int)v12 >= v11 )
goto LABEL_18;
}
if( (HIBYTE(v26) & 0xF) == 2 && !(_DWORD)v16 )
{
if( v14 >= v7 )
*(_QWORD *)(a5 + 152) += 8i64;
v12 = (unsigned int)(v12 + 1);
}
if( (unsigned int)v12 < v11 && (*(_BYTE *)(v10 + 2 * v12 + 5) & 0xF) == 10 )
{
v23 = *(_QWORD *)(a5 + 152);
v24 = v23 + 24;
if( a2 > 0x7FFFFFFEFFFFi64 || (v23 & 3) == 0 )
{
v25 = *(unsigned __int64 **)a6;
if( *(_QWORD *)a6 && (v23 < *v25 || v23 > **(_QWORD **)(a6 + 8) - 8i64) )
return -1073741784;
if( a2 > 0x7FFFFFFEFFFFi64 )
goto LABEL_50;
if( (v24 & 3) == 0 )
{
v25 = *(unsigned __int64 **)a6;
LABEL_50:
if( !v25 || v24 >= *v25 && v24 <= **(_QWORD **)(a6 + 8) - 8i64 )
{
*(_QWORD *)(a5 + 248) = *(_QWORD *)v23;
*(_QWORD *)(a5 + 152) = *(_QWORD *)v24;
return 0;
}
return -1073741784;
}
}
}
else
{
LABEL_18:
v19 = *(_QWORD *)(a5 + 152);
if( a2 > 0x7FFFFFFEFFFFi64 || (v19 & 3) == 0 )
{
if( !*(_QWORD *)a6 || v19 >= **(_QWORD **)a6 && v19 <= **(_QWORD **)(a6 + 8) - 8i64 )
{
v20 = *(_QWORD *)v19;
*(_QWORD *)(a5 + 152) += 8i64;
*(_QWORD *)(a5 + 248) = v20;
RtlpPopUserShadowStack(a5);
return 0;
}
return -1073741784;
}
}
LABEL_55:
ExRaiseDatatypeMisalignment();
}
if( (unsigned int)++v9 > 0x20 )
return -1073741569;
v22 = v11 + 1;
if( (v11 & 1) == 0 )
v22 = v11;
a4 = (_BYTE *)(v10 + 2 * (v22 + 2));
}
}Referenced by:
RtlpxVirtualUnwind