RtlpUnwindPrologue

__int64 __fastcall RtlpUnwindPrologue(
        __int64 a1,
        unsigned __int64 a2,
        __int64 a3,
        _DWORD *a4,
        __int64 a5,
        char *a6,
        _QWORD *a7,
        __int64 a8){
  unsigned int v9; 
  __int64 v10; 
  unsigned int v12; 
  char v13; 
  unsigned int v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned __int8 v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  _QWORD *v23; 
  unsigned __int64 v25; 
  __int64 v26; 
  int v27; 
  unsigned int v28; 
  unsigned int v29; 
  __int64 v30; 
  unsigned __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  __int64(__fastcall **v35)(int, int, int, int, int, int, int, __int64); 
  __int64 v36; 
  __int64 v37; 
  unsigned __int64 v38; 
  unsigned __int64 v39; 
  unsigned __int64 *v40; 
  _QWORD *v41; 
  _QWORD *v42; 
  __int64 v43; 
  __int64 v44; 
  char *ExtendedFeature2; 
  __int64 v46; 
  unsigned int v47; 

  v46 = a1;
  v9 = 0;
  v10 = a3;
  v47 = 0;
  v12 = 0;
  while( 1 )
  {
    v13 = 0;
    v14 = a2 - *a4 - a1;
    v15 = a1 + (unsigned int)a4[2];
    LODWORD(v16) = 0;
    if( a2 <= 0x7FFFFFFEFFFFi64 && (v15 & 3) != 0 )
      goto LABEL_87;
    v17 = *(_BYTE *)(v15 + 2);
    if( v17 )
    {
      do
      {
        v18 = v15 + 2i64 * (unsigned int)v16;
        v19 = *(unsigned __int8 *)(v18 + 5) >> 4;
        if( v14 < *(unsigned __int8 *)(v18 + 4) )
        {
          LODWORD(v16) = RtlpUnwindOpSlots(*(_WORD *)(v18 + 4)) + v16;
        }
        else
        {
          if( (*(_BYTE *)(v15 + 2i64 * (unsigned int)v16 + 5) & 0xF) != 0 )
          {
            if( (*(_BYTE *)(v15 + 2i64 * (unsigned int)v16 + 5) & 0xF) == 4 )
            {
              v16 = (unsigned int)(v16 + 1);
              v25 = v10 + 8i64 * *(unsigned __int16 *)(v15 + 2 * v16 + 4);
              if( a2 <= 0x7FFFFFFEFFFFi64 && (v25 & 3) != 0 )
                goto LABEL_87;
              if( *(_QWORD *)a8 && (v25 < **(_QWORD **)a8 || v25 > **(_QWORD **)(a8 + 8) - 8i64) )
                return 3221225512i64;
              *(_QWORD *)(a5 + 8 * v19 + 120) = *(_QWORD *)v25;
              v26 = *(_QWORD *)(a8 + 16);
              if( v26 )
                *(_QWORD *)(v26 + 8 * v19 + 128) = v25;
            }
            else
            {
              switch( *(_BYTE *)(v15 + 2i64 * (unsigned int)v16 + 5) & 0xF )
              {
                case 1:
                  v16 = (unsigned int)(v16 + 1);
                  v27 = *(unsigned __int16 *)(v15 + 2 * v16 + 4);
                  if( (_DWORD)v19 )
                  {
                    v16 = (unsigned int)(v16 + 1);
                    v28 = (*(unsigned __int16 *)(v15 + 2 * v16 + 4) << 16) + v27;
                  }
                  else
                  {
                    v28 = 8 * v27;
                  }
                  *(_QWORD *)(a5 + 152) += v28;
                  break;
                case 2:
                  *(_QWORD *)(a5 + 152) += (unsigned int)(8 * v19 + 8);
                  break;
                case 3:
                  v30 = *(_QWORD *)(a5 + 8i64 * (*(_BYTE *)(v15 + 3) & 0xF) + 120);
                  *(_QWORD *)(a5 + 152) = v30;
                  *(_QWORD *)(a5 + 152) = v30 - (*(_BYTE *)(v15 + 3) & 0xF0);
                  break;
                case 5:
                  v16 = (unsigned int)(v16 + 2);
                  v41 = (_QWORD *)(v10
                                 + ((unsigned __int64)*(unsigned __int16 *)(v15 + 2 * v16 + 4) << 16)
                                 + *(unsigned __int16 *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4));
                  if( a2 <= 0x7FFFFFFEFFFFi64
                    && (((_BYTE)v10 + (unsigned __int8)*(_WORD *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4)) & 3) != 0 )
                  {
                    goto LABEL_87;
                  }
                  if( *(_QWORD *)a8
                    && ((unsigned __int64)v41 < **(_QWORD **)a8 || (unsigned __int64)v41 > **(_QWORD **)(a8 + 8) - 8i64) )
                  {
                    return 3221225512i64;
                  }
                  *(_QWORD *)(a5 + 8 * v19 + 120) = *v41;
                  break;
                case 6:
                  LODWORD(v16) = v16 + 1;
                  break;
                case 7:
                  LODWORD(v16) = v16 + 2;
                  break;
                case 8:
                  v16 = (unsigned int)(v16 + 1);
                  v31 = v10 + 16i64 * *(unsigned __int16 *)(v15 + 2 * v16 + 4);
                  if( a2 <= 0x7FFFFFFEFFFFi64 && (v31 & 3) != 0 )
                    goto LABEL_87;
                  if( *(_QWORD *)a8 && (v31 < **(_QWORD **)a8 || v31 > **(_QWORD **)(a8 + 8) - 16i64) )
                    return 3221225512i64;
                  v32 = 2i64 * (unsigned int)v19;
                  *(_QWORD *)(a5 + 8 * v32 + 416) = *(_QWORD *)v31;
                  *(_QWORD *)(a5 + 8 * v32 + 424) = *(_QWORD *)(v31 + 8);
                  v33 = *(_QWORD *)(a8 + 16);
                  if( v33 )
                    *(_QWORD *)(v33 + 8 * v19) = v31;
                  break;
                case 9:
                  v16 = (unsigned int)(v16 + 2);
                  v42 = (_QWORD *)(v10
                                 + ((unsigned __int64)*(unsigned __int16 *)(v15 + 2 * v16 + 4) << 16)
                                 + *(unsigned __int16 *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4));
                  if( a2 <= 0x7FFFFFFEFFFFi64
                    && (((_BYTE)v10 + (unsigned __int8)*(_WORD *)(v15 + 2i64 * (unsigned int)(v16 - 1) + 4)) & 3) != 0 )
                  {
                    goto LABEL_87;
                  }
                  if( *(_QWORD *)a8
                    && ((unsigned __int64)v42 < **(_QWORD **)a8 || (unsigned __int64)v42 > **(_QWORD **)(a8 + 8) - 16i64) )
                  {
                    return 3221225512i64;
                  }
                  v43 = 2i64 * (unsigned int)v19;
                  *(_QWORD *)(a5 + 8 * v43 + 416) = *v42;
                  *(_QWORD *)(a5 + 8 * v43 + 424) = v42[1];
                  v44 = *(_QWORD *)(a8 + 16);
                  if( v44 )
                    *(_QWORD *)(v44 + 8 * v19) = v42;
                  break;
                case 0xA:
                  v36 = *(_QWORD *)(a5 + 152);
                  v37 = 32i64;
                  if( !(_DWORD)v19 )
                    v37 = 24i64;
                  v38 = v36 + v37;
                  v13 = 1;
                  v39 = v36 + 8;
                  if( !(_DWORD)v19 )
                    v39 = *(_QWORD *)(a5 + 152);
                  if( a2 <= 0x7FFFFFFEFFFFi64 && (v39 & 3) != 0 )
                    goto LABEL_87;
                  v40 = *(unsigned __int64 **)a8;
                  if( *(_QWORD *)a8 && (v39 < *v40 || v39 > **(_QWORD **)(a8 + 8) - 8i64) )
                    return 3221225512i64;
                  if( a2 > 0x7FFFFFFEFFFFi64 )
                    goto LABEL_73;
                  if( (v38 & 3) != 0 )
                    goto LABEL_87;
                  v40 = *(unsigned __int64 **)a8;
LABEL_73:
                  if( v40 && (v38 < *v40 || v38 > **(_QWORD **)(a8 + 8) - 8i64) )
                    return 3221225512i64;
                  *(_QWORD *)(a5 + 248) = *(_QWORD *)v39;
                  *(_QWORD *)(a5 + 152) = *(_QWORD *)v38;
                  break;
                default:
                  goto LABEL_103;
              }
            }
          }
          else
          {
            v20 = *(_QWORD *)(a5 + 152);
            if( a2 <= 0x7FFFFFFEFFFFi64 && (v20 & 3) != 0 )
              goto LABEL_87;
            if( *(_QWORD *)a8 && (v20 < **(_QWORD **)a8 || v20 > **(_QWORD **)(a8 + 8) - 8i64) )
              return 3221225512i64;
            *(_QWORD *)(a5 + 8 * v19 + 120) = *(_QWORD *)v20;
            v21 = *(_QWORD *)(a8 + 16);
            if( v21 )
              *(_QWORD *)(v21 + 8 * v19 + 128) = v20;
            *(_QWORD *)(a5 + 152) += 8i64;
          }
          LODWORD(v16) = v16 + 1;
        }
        v10 = a3;
        v17 = *(_BYTE *)(v15 + 2);
      }
      while( (unsigned int)v16 < v17 );
      v12 = v47;
      v9 = 0;
    }
    if( (*(_BYTE *)v15 & 0x20) == 0 )
      break;
    v29 = v17;
    if( (v17 & 1) != 0 )
      v29 = v17 + 1;
    a4 = (_DWORD *)(v15 + 2 * (v29 + 2i64));
    if( a2 <= 0x7FFFFFFEFFFFi64 && ((unsigned __int8)a4 & 3) != 0 )
      goto LABEL_87;
    a1 = v46;
    v47 = ++v12;
    if( v12 > 0x20 )
LABEL_103:
      RtlRaiseStatus(-1073741569);
  }
  if( v13 )
  {
    if( !a6 )
    {
LABEL_28:
      *a7 = a4;
      return 0i64;
    }
    v35 = &RtlpSafeMachineFrameEntries;
    while( (__int64(__fastcall *)(int, int, int, int, int, int, int, __int64))v15 != *v35 )
    {
      ++v9;
      ++v35;
      if( v9 >= 3 )
        goto LABEL_26;
    }
    v13 = 0;
LABEL_26:
    if( a6 )
      *a6 = v13;
    goto LABEL_28;
  }
  if( a2 <= 0x7FFFFFFEFFFFi64 )
  {
    v34 = *(_QWORD *)(a5 + 152);
    if( (v34 & 3) != 0 )
LABEL_87:
      ExRaiseDatatypeMisalignment();
  }
  if( !*(_QWORD *)a8 || (v22 = *(_QWORD *)(a5 + 152), v22 >= **(_QWORD **)a8) && v22 <= **(_QWORD **)(a8 + 8) - 8i64 )
  {
    v23 = *(_QWORD **)(a5 + 152);
    *(_QWORD *)(a5 + 248) = *v23;
    *(_QWORD *)(a5 + 152) = v23 + 1;
    if( (*(_DWORD *)(a5 + 48) & 0x100040) == 1048640 )
    {
      ExtendedFeature2 = RtlLocateExtendedFeature2((_DWORD *)(a5 + 1232), 0xBu, 0xFFFFF780000003D8ui64, 0i64);
      if( ExtendedFeature2 )
      {
        if( (*ExtendedFeature2 & 1) != 0 )
          *((_QWORD *)ExtendedFeature2 + 1) += 8i64;
      }
    }
    goto LABEL_26;
  }
  return 3221225512i64;
}

Referenced by:

RtlpxVirtualUnwind