RtlpxVirtualUnwind

__int64 RtlpxVirtualUnwind(int a1, INT64 a2, UINT64 a3, ...){
  INT64 v4; 
  int v5; 
  _BYTE *v7; 
  char v9; 
  unsigned int v10; 
  char *v11; 
  unsigned int v12; 
  int v13; 
  __int64 *v14; 
  unsigned int v15; 
  INT64 v16; 
  __int64 v17; 
  __int64 result; 
  INT64 v19; 
  char v20; 
  __int64 v21; 
  unsigned __int8 *v22; 
  INT64 v23; 
  int v24; 
  __int16 v25; 
  int v26; 
  unsigned int v27; 
  int v28; 
  __int16 v29; 
  int v30; 
  INT64 v31; 
  int v32; 
  unsigned int v33; 
  unsigned int v34; 
  char v35; 
  char *v36; 
  char v37; 
  char *v38; 
  char v39; 
  unsigned int v40; 
  __int64 v41; 
  unsigned int v42; 
  UINT16 v43; 
  bool v44; 
  char v45; 
  __int64 v46; 
  char *v47; 
  char v48; 
  char *v49; 
  int v50; 
  unsigned __int64 v51; 
  unsigned __int64 v52; 
  _DWORD *v53; 
  char v54; 
  __int64 v55; 
  INT64 v56; 
  char v57; 
  unsigned __int64 v58; 
  __int64 v59; 
  __int64 v60; 
  __int64 v61; 
  char v62; 
  unsigned __int64 v63; 
  __int64 v64; 
  __int64 v65; 
  __int64 v66; 
  unsigned __int64 v67; 
  _QWORD *v68; 
  int v69; 
  unsigned int v70; 
  unsigned int v71; 
  _BYTE *v72; 
  va_list va; 
  INT64 v74; 
  char *v75; 
  _QWORD *v76; 
  __int64 *v77; 
  INT64 *v78; 
  INT64 v79; 
  va_list va1; 

  va_start(va1, a3);
  va_start(va, a3);
  v72 = va_arg(va1, _BYTE *);
  v74 = va_arg(va1, _QWORD);
  v75 = va_arg(va1, char *);
  v76 = va_arg(va1, _QWORD *);
  v77 = va_arg(va1, __int64 *);
  v78 = va_arg(va1, INT64 *);
  v79 = va_arg(va1, _QWORD);
  v4 = a2 + *((unsigned int *)v72 + 2);
  v5 = 0;
  v69 = 0;
  v7 = v72;
  if( a3 <= 0x7FFFFFFEFFFFi64 )
  {
    if( (v4 & 3) != 0 )
      goto LABEL_67;
    v7 = v72;
  }
  v9 = *(_BYTE *)v4;
  v10 = 1;
  v11 = v75;
  v12 = *(_BYTE *)v4 & 7;
  if( !v75 || *v75 )
  {
    if( v12 < 2 )
    {
      v22 = (unsigned __int8 *)(v4 + 2);
      v23 = v4;
      v24 = 0;
      if( !*(_BYTE *)(v4 + 2) )
      {
        while( 1 )
        {
          if( (v9 & 0x20) == 0 )
          {
            v7 = v72;
            v5 = 1;
            v69 = 1;
            goto LABEL_5;
          }
          v40 = *v22;
          v41 = v40 + 1;
          if( (v40 & 1) == 0 )
            v41 = v40;
          if( (unsigned int)++v24 > 0x20 )
            RtlRaiseStatus(-1073741569);
          v23 = a2 + *(unsigned int *)(v23 + 2 * v41 + 12);
          if( a3 <= 0x7FFFFFFEFFFFi64 && (v23 & 3) != 0 )
            goto LABEL_67;
          v22 = (unsigned __int8 *)(v23 + 2);
          if( *(_BYTE *)(v23 + 2) )
            break;
          v9 = *(_BYTE *)v23;
        }
        v7 = v72;
      }
      if( a1 < 0 )
        return 3221225512i64;
    }
  }
  else
  {
    v5 = 1;
    v69 = 1;
  }
LABEL_5:
  v13 = a1 & 0x7FFFFFFF;
  v14 = v77;
  v15 = a3 - *(_DWORD *)v7 - a2;
  if( (*(_BYTE *)(v4 + 3) & 0xF) != 0 )
  {
    if( v15 >= *(unsigned __int8 *)(v4 + 1) || (*(_BYTE *)v4 & 0x20) != 0 )
    {
      v16 = v74;
      v20 = *(_BYTE *)(v4 + 3);
    }
    else
    {
      v42 = 0;
      v71 = 0;
      if( *(_BYTE *)(v4 + 2) )
      {
        do
        {
          v43 = *(_WORD *)(v4 + 2i64 * v42 + 4);
          if( (HIBYTE(v43) & 0xF) == 3 )
            break;
          v42 = RtlpUnwindOpSlots(v43) + v71;
          v71 = v42;
        }
        while( v42 < *(unsigned __int8 *)(v4 + 2) );
        v7 = v72;
        v10 = 1;
        v5 = v69;
        v14 = v77;
      }
      v44 = v15 < *(unsigned __int8 *)(v4 + 2i64 * v42 + 4);
      v16 = v74;
      if( v44 )
        goto LABEL_7;
      v20 = *(_BYTE *)(v4 + 3);
    }
    v21 = *(_QWORD *)(v16 + 8i64 * (v20 & 0xF) + 120);
    *v14 = v21;
    v17 = v21 - (*(_BYTE *)(v4 + 3) & 0xF0);
    goto LABEL_8;
  }
  v16 = v74;
LABEL_7:
  v17 = *(_QWORD *)(v16 + 152);
LABEL_8:
  *v14 = v17;
  if( v5 )
    goto LABEL_9;
  if( v12 >= 2 )
  {
    if( !*(_BYTE *)(v4 + 2) )
      goto LABEL_9;
    v25 = *(_WORD *)(v4 + 4);
    if( (HIBYTE(v25) & 0xF) == 6 )
    {
      v7 = v72;
      v26 = a3 - a2;
      v27 = (unsigned __int8)v25;
      if( (v25 & 0x1000) != 0 )
      {
        v28 = *((_DWORD *)v72 + 1) - (unsigned __int8)v25;
        if( v26 - v28 < (unsigned int)(unsigned __int8)v25 )
        {
LABEL_58:
          RtlpUnwindEpilogue(a2, a3, (unsigned int)(v26 - v28), v7, v16, v79);
          v19 = 0i64;
          if( v11 )
            *v11 = 0;
          goto LABEL_12;
        }
      }
      if( *(_BYTE *)(v4 + 2) <= 1u )
        goto LABEL_9;
      while( 1 )
      {
        v29 = *(_WORD *)(v4 + 2i64 * v10 + 4);
        if( (HIBYTE(v29) & 0xF) != 6 )
          break;
        v30 = (unsigned __int8)v29 + (HIBYTE(v29) >> 4 << 8);
        if( !v30 )
          break;
        v7 = v72;
        v28 = *((_DWORD *)v72 + 1) - v30;
        if( v26 - v28 < v27 )
          goto LABEL_58;
        if( ++v10 >= *(unsigned __int8 *)(v4 + 2) )
          goto LABEL_9;
      }
    }
    v7 = v72;
    goto LABEL_9;
  }
  v34 = 0;
  v70 = 0;
  v35 = *(_BYTE *)a3;
  v36 = (char *)a3;
  if( *(_BYTE *)a3 == 72 )
  {
    v39 = *(_BYTE *)(a3 + 1);
    if( v39 == -125 && *(_BYTE *)(a3 + 2) == 0xC4 )
    {
      v36 = (char *)(a3 + 4);
      goto LABEL_47;
    }
    if( v39 == -127 && *(_BYTE *)(a3 + 2) == 0xC4 )
      goto LABEL_93;
  }
  if( (v35 & 0xFE) == 72 && *(_BYTE *)(a3 + 1) == 0x8D )
  {
    v34 = *(_BYTE *)(a3 + 2) & 7 | (8 * (v35 & 1));
    v70 = v34;
    if( v34 )
    {
      if( v34 == (*(_BYTE *)(v4 + 3) & 0xF) )
      {
        v45 = *(_BYTE *)(a3 + 2) & 0xF8;
        if( v45 == 96 )
        {
          v36 = (char *)(a3 + 4);
          goto LABEL_47;
        }
        if( v45 == -96 )
LABEL_93:
          v36 = (char *)(a3 + 7);
      }
    }
  }
LABEL_47:
  while( 1 )
  {
    v37 = *v36;
    if( (*v36 & 0xF8) != 88 )
      break;
    v46 = 1i64;
LABEL_95:
    v36 += v46;
  }
  v38 = v36 + 1;
  if( (v37 & 0xF0) == 64 && (*v38 & 0xF8) == 88 )
  {
    v46 = 2i64;
    goto LABEL_95;
  }
  if( v37 == -14 )
  {
    v37 = *v38;
    ++v36;
  }
  if( (unsigned __int8)(v37 + 62) > 1u )
  {
    if( v37 == -13 )
    {
      if( v36[1] != -61 )
        goto LABEL_55;
    }
    else if( ((v37 + 23) & 0xFD) != 0 )
    {
      if( v37 != -1 || v36[1] != 37 )
      {
LABEL_55:
        if( (v37 & 0xF8) == 72 && v36[1] == -1 && (v36[2] & 0x38) == 32 )
          goto LABEL_97;
LABEL_9:
        result = RtlpUnwindPrologue(a2, a3, *v14, v7, v16, v11, (_BYTE **)va, v79);
        if( (int)result < 0 )
          return result;
        if( !v13 )
        {
LABEL_11:
          v19 = 0i64;
          goto LABEL_12;
        }
        v31 = a2 + *((unsigned int *)v72 + 2);
        if( a3 > 0x7FFFFFFEFFFFi64 || (v31 & 3) == 0 )
        {
          if( (int)a3 - *(_DWORD *)v72 - (int)a2 >= (unsigned int)*(unsigned __int8 *)(v31 + 1)
            && ((*(_BYTE *)v31 >> 3) & (unsigned __int8)v13) != 0 )
          {
            v32 = *(unsigned __int8 *)(v31 + 2);
            v33 = v32 + 1;
            if( (v32 & 1) == 0 )
              v33 = *(unsigned __int8 *)(v31 + 2);
            *v76 = v31 + 2 * (v33 + 2 + 2i64);
            v19 = a2 + *(unsigned int *)(v31 + 2i64 * v33 + 4);
            goto LABEL_12;
          }
          goto LABEL_11;
        }
LABEL_67:
        ExRaiseDatatypeMisalignment();
      }
    }
    else
    {
      v49 = &v36[-a2];
      if( v37 == -21 )
        v50 = v36[1] + 2;
      else
        v50 = *(_DWORD *)(v36 + 1) + 5;
      v51 = *(unsigned int *)v7;
      v52 = (unsigned __int64)&v49[v50];
      if( v52 < v51 || v52 >= *((unsigned int *)v7 + 1) )
      {
        if( a3 <= 0x7FFFFFFEFFFFi64 )
          v7 = v72;
        v53 = RtlpSameFunction((UINT64)v7, a2, a2 + v52);
        if( !v53 || v52 == *v53 )
        {
          v34 = v70;
          goto LABEL_97;
        }
        v14 = v77;
        goto LABEL_9;
      }
      if( v52 != v51 || (*(_BYTE *)v4 & 0x20) != 0 )
        goto LABEL_9;
    }
  }
LABEL_97:
  v47 = (char *)a3;
  if( (*(_BYTE *)a3 & 0xF8) == 72 )
  {
    v48 = *(_BYTE *)(a3 + 1);
    switch( v48 )
    {
      case -125:
        v47 = (char *)(a3 + 4);
        *(_QWORD *)(v16 + 152) += *(char *)(a3 + 3);
        break;
      case -127:
        *(_QWORD *)(v16 + 152) += ((*(unsigned __int8 *)(a3 + 4) | (*(unsigned __int16 *)(a3 + 5) << 8)) << 8) | *(unsigned __int8 *)(a3 + 3);
        goto LABEL_125;
      case -115:
        v54 = *(_BYTE *)(a3 + 2) & 0xF8;
        if( v54 == 96 )
        {
          v47 = (char *)(a3 + 4);
          v55 = *(_QWORD *)(v16 + 8i64 * v34 + 120);
          *(_QWORD *)(v16 + 152) = v55;
          *(_QWORD *)(v16 + 152) = v55 + *(char *)(a3 + 3);
        }
        else if( v54 == -96 )
        {
          *(_QWORD *)(v16 + 152) = *(_QWORD *)(v16 + 8i64 * v34 + 120)
                                 + (*(unsigned __int8 *)(a3 + 3) | ((*(unsigned __int8 *)(a3 + 4) | (*(unsigned __int16 *)(a3 + 5) << 8)) << 8));
LABEL_125:
          v47 = (char *)(a3 + 7);
        }
        break;
    }
  }
  v56 = v79;
  while( 2 )
  {
    v57 = *v47;
    if( (*v47 & 0xF8) == 88 )
    {
      v58 = *(_QWORD *)(v16 + 152);
      if( a3 <= 0x7FFFFFFEFFFFi64 && (v58 & 3) != 0 )
        goto LABEL_67;
      if( *(_QWORD *)v56 && (v58 < **(_QWORD **)v56 || v58 > **(_QWORD **)(v56 + 8) - 8i64) )
        return 3221225512i64;
      v59 = v57 & 7;
      *(_QWORD *)(v16 + 8 * v59 + 120) = *(_QWORD *)v58;
      v60 = *(_QWORD *)(v56 + 16);
      if( v60 )
        *(_QWORD *)(v60 + 8 * v59 + 128) = v58;
      v61 = 1i64;
LABEL_146:
      *(_QWORD *)(v16 + 152) += 8i64;
      v47 += v61;
      continue;
    }
    break;
  }
  if( (v57 & 0xF0) == 64 )
  {
    v62 = v47[1];
    if( (v62 & 0xF8) == 88 )
    {
      v63 = *(_QWORD *)(v16 + 152);
      if( a3 <= 0x7FFFFFFEFFFFi64 && (v63 & 3) != 0 )
        goto LABEL_67;
      if( *(_QWORD *)v56 && (v63 < **(_QWORD **)v56 || v63 > **(_QWORD **)(v56 + 8) - 8i64) )
        return 3221225512i64;
      v64 = v62 & 7 | (8i64 * (v57 & 1));
      *(_QWORD *)(v16 + 8 * v64 + 120) = *(_QWORD *)v63;
      v65 = *(_QWORD *)(v56 + 16);
      if( v65 )
        *(_QWORD *)(v65 + 8 * v64 + 128) = v63;
      v61 = 2i64;
      goto LABEL_146;
    }
  }
  if( a3 <= 0x7FFFFFFEFFFFi64 )
  {
    v66 = *(_QWORD *)(v16 + 152);
    if( (v66 & 3) != 0 )
      goto LABEL_67;
  }
  if( *(_QWORD *)v56 )
  {
    v67 = *(_QWORD *)(v16 + 152);
    if( v67 < **(_QWORD **)v56 || v67 > **(_QWORD **)(v56 + 8) - 8i64 )
      return 3221225512i64;
  }
  v68 = *(_QWORD **)(v16 + 152);
  *(_QWORD *)(v16 + 248) = *v68;
  *(_QWORD *)(v16 + 152) = v68 + 1;
  RtlpPopUserShadowStack(v16);
  v19 = 0i64;
  if( v11 )
    *v11 = 0;
LABEL_12:
  if( v78 )
    *v78 = v19;
  return 0i64;
}

Referenced by:

RtlUnwindEx
RtlVirtualUnwind
RtlpVirtualUnwind
RtlpWalkFrameChain