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