RtlpReadExtendedContextLayout
NTSTATUS __stdcall RtlpReadExtendedContextLayout(
UINT64 ContextFlags,
VOID *Context,
UINT64 ChunksMask,
_CONTEXT_EX *Layout){
UINT64 v4;
int v6;
unsigned __int64 v7;
unsigned __int64 v8;
int v9;
int v10;
__int64 v11;
UINT64 v12;
__int64 v13;
int v14;
__int128 v15;
unsigned __int64 v16;
int *v17;
v4 = 0i64;
if( ((unsigned int)Context & 0x10000) != 0 )
{
v4 = ChunksMask + 716;
v17[2] = -716;
v17[3] = 204;
if( ((unsigned int)Context & 0x10020) == 65568 )
v17[3] = 716;
}
else
{
if( ((unsigned int)Context & 0x100000) != 0 )
{
v4 = ChunksMask + 1232;
v17[3] = 1232;
LABEL_4:
v17[2] = ChunksMask - v4;
goto LABEL_5;
}
if( ((unsigned int)Context & 0x200000) != 0 )
{
v4 = ChunksMask + 416;
v17[3] = 416;
goto LABEL_4;
}
if( ((unsigned int)Context & 0x400000) != 0 )
{
v4 = ChunksMask + 912;
v17[3] = 912;
goto LABEL_4;
}
}
LABEL_5:
*v17 = v17[2];
v17[1] = v4 - ChunksMask + 24;
if( ((unsigned int)Layout & 0xFFFFFFFE) == 0 )
return 0;
if( (v4 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v15 = *(_OWORD *)v4;
v16 = *(_QWORD *)(v4 + 16);
v6 = *(_QWORD *)(v4 + 8);
v7 = v6 + v4;
if( SDWORD2(v15) <= HIDWORD(v15) + DWORD2(v15) )
{
if( v6 >= 0 )
{
if( v7 < v4 )
return -1073741811;
}
else if( v7 >= v4 )
{
return -1073741811;
}
if( v4 + SDWORD2(v15) + HIDWORD(*((_QWORD *)&v15 + 1)) < v7
|| v17[2] != v6
|| v17[3] > (unsigned int)HIDWORD(*(_QWORD *)(v4 + 8)) )
{
return -1073741811;
}
if( ((unsigned __int8)Layout & 2) != 0 )
{
v8 = (int)v16 + v4;
if( (int)v16 > HIDWORD(v16) + (int)v16 )
return -1073741811;
if( (v16 & 0x80000000) != 0i64 )
{
if( v8 >= v4 )
return -1073741811;
}
else if( v8 < v4 )
{
return -1073741811;
}
if( v4 + HIDWORD(v16) + (int)v16 < v8 )
return -1073741811;
*((_QWORD *)v17 + 2) = v16;
v9 = v17[1];
v10 = *v17;
if( *v17 + v9 > (int)v16 )
{
if( (int)v16 + v17[5] > v10 )
return -1073741811;
v17[1] = v9 + v10 - v16;
*v17 = v16;
}
else
{
v17[1] = v16 + v17[5] - v10;
}
}
v11 = *v17;
v12 = v11 + v4;
v13 = (unsigned int)v17[1];
v14 = v13 + v11;
if( (int)v11 <= (int)v13 + (int)v11 )
{
if( (int)v11 >= 0 )
{
if( v12 < v4 )
return -1073741811;
}
else if( v12 >= v4 )
{
return -1073741811;
}
if( v4 + v11 + v13 >= v12 && (int)v11 >= (int)v15 && (int)v15 + DWORD1(v15) >= v14 && v12 <= v4 && v4 + v14 >= v4 )
return 0;
}
}
return -1073741811;
}Referenced by:
RtlpReadExtendedContext