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