RtlpReadExtendedContextLayout
INT64 __fastcall RtlpReadExtendedContextLayout(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 *a5){
unsigned __int64 v5;
int v7;
unsigned __int64 v8;
unsigned __int64 v9;
int v10;
int v11;
__int64 v12;
unsigned __int64 v13;
__int64 v14;
int v15;
__int128 v16;
unsigned __int64 v17;
v5 = 0i64;
if( (a2 & 0x10000) != 0 )
{
v5 = a3 + 716;
*((_DWORD *)a5 + 2) = -716;
*((_DWORD *)a5 + 3) = 204;
if( (a2 & 0x10020) == 65568 )
*((_DWORD *)a5 + 3) = 716;
}
else
{
if( (a2 & 0x100000) != 0 )
{
v5 = a3 + 1232;
*((_DWORD *)a5 + 3) = 1232;
LABEL_4:
*((_DWORD *)a5 + 2) = a3 - v5;
goto LABEL_5;
}
if( (a2 & 0x200000) != 0 )
{
v5 = a3 + 416;
*((_DWORD *)a5 + 3) = 416;
goto LABEL_4;
}
if( (a2 & 0x400000) != 0 )
{
v5 = a3 + 912;
*((_DWORD *)a5 + 3) = 912;
goto LABEL_4;
}
}
LABEL_5:
*(_DWORD *)a5 = *((_DWORD *)a5 + 2);
*((_DWORD *)a5 + 1) = v5 - a3 + 24;
if( (a4 & 0xFFFFFFFE) == 0 )
return 0i64;
if( (v5 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v16 = *(_OWORD *)v5;
v17 = *(_QWORD *)(v5 + 16);
v7 = *(_QWORD *)(v5 + 8);
v8 = v7 + v5;
if( SDWORD2(v16) <= HIDWORD(v16) + DWORD2(v16) )
{
if( v7 >= 0 )
{
if( v8 < v5 )
return 3221225485i64;
}
else if( v8 >= v5 )
{
return 3221225485i64;
}
if( v5 + SDWORD2(v16) + HIDWORD(*((_QWORD *)&v16 + 1)) < v8
|| *((_DWORD *)a5 + 2) != v7
|| *((_DWORD *)a5 + 3) > (unsigned int)HIDWORD(*(_QWORD *)(v5 + 8)) )
{
return 3221225485i64;
}
if( (a4 & 2) != 0 )
{
v9 = (int)v17 + v5;
if( (int)v17 > HIDWORD(v17) + (int)v17 )
return 3221225485i64;
if( (v17 & 0x80000000) != 0i64 )
{
if( v9 >= v5 )
return 3221225485i64;
}
else if( v9 < v5 )
{
return 3221225485i64;
}
if( v5 + HIDWORD(v17) + (int)v17 < v9 )
return 3221225485i64;
a5[2] = v17;
v10 = *((_DWORD *)a5 + 1);
v11 = *(_DWORD *)a5;
if( *(_DWORD *)a5 + v10 > (int)v17 )
{
if( (int)v17 + *((_DWORD *)a5 + 5) > v11 )
return 3221225485i64;
*((_DWORD *)a5 + 1) = v10 + v11 - v17;
*(_DWORD *)a5 = v17;
}
else
{
*((_DWORD *)a5 + 1) = v17 + *((_DWORD *)a5 + 5) - v11;
}
}
v12 = *(int *)a5;
v13 = v12 + v5;
v14 = *((unsigned int *)a5 + 1);
v15 = v14 + v12;
if( (int)v12 <= (int)v14 + (int)v12 )
{
if( (int)v12 >= 0 )
{
if( v13 < v5 )
return 3221225485i64;
}
else if( v13 >= v5 )
{
return 3221225485i64;
}
if( v5 + v12 + v14 >= v13 && (int)v12 >= (int)v16 && (int)v16 + DWORD1(v16) >= v15 && v13 <= v5 && v5 + v15 >= v5 )
return 0i64;
}
}
return 3221225485i64;
}Referenced by:
RtlpReadExtendedContext