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