sub_140A0FD10

__int64 __fastcall sub_140A0FD10(__int64 a1, __int64 a2){
  __int64 v2; 
  __int64 v3; 
  __int64 v4; 
  _QWORD *v5; 
  int v6; 
  int v7; 
  _QWORD *v8; 
  int v9; 
  char *v10; 
  __int64 v11; 
  __int64 v12; 
  int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 *v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  int v20; 
  __int64 v21; 
  int v22; 
  __int64 v23; 
  bool v24; 
  __int64 v25; 
  int v26; 
  unsigned int *v27; 
  unsigned int v28; 
  __int64 v29; 
  unsigned int v30; 
  int *v31; 
  __int64 v32; 
  int v33; 
  int v34; 
  int v35; 
  int v36; 
  __int64 v37; 
  int v38; 
  _QWORD *v39; 
  int v40; 
  unsigned int v41; 
  unsigned __int64 v42; 
  _QWORD *v43; 
  __int64 v44; 
  char *v45; 
  unsigned __int64 v46; 
  unsigned int v47; 
  __int64 v48; 
  __int64 v49; 
  unsigned __int64 v50; 
  __int64 v51; 
  unsigned __int64 v52; 
  __int64 v53; 
  unsigned __int64 i; 
  unsigned int v55; 
  int v56; 
  __int64 v57; 
  __int64 v58; 
  unsigned __int8 CurrentIrql; 
  unsigned __int64 v60; 
  unsigned __int64 v61; 
  int v62; 
  __int64 v63; 
  __int64 v64; 
  __int64 v65; 
  __int64 v66; 
  struct _KPRCB *CurrentPrcb; 
  void **v68; 
  __int64 v69; 
  unsigned __int64 v70; 
  unsigned __int64 v71; 
  unsigned int v72; 
  unsigned __int64 v73; 
  _QWORD *j; 
  unsigned __int64 v75; 
  int v76; 
  __int64 v77; 
  __int64 v78; 
  unsigned __int64 v79; 
  __int64 v80; 
  _QWORD *v81; 
  char *v82; 
  int v83; 
  unsigned __int64 v84; 
  signed __int64 v85; 
  __int64 v86; 
  unsigned __int64 v87; 
  unsigned __int64 v88; 
  _QWORD *v89; 
  unsigned __int64 v90; 
  unsigned __int128 v91; 
  __int64 v92; 
  char *v93; 
  _QWORD *v94; 
  __int64 v95; 
  char v96; 
  unsigned __int64 v97; 
  int v99; 
  int v100; 
  int v101; 
  int v102; 
  int v103; 
  volatile signed __int32 *v104; 
  signed __int32 v105[8]; 
  __int64 v106; 
  unsigned int v107; 
  __int64 v108; 
  unsigned __int64 v109; 
  __int64 v110; 
  __int64 v111; 
  __int16 v112[8]; 
  char v113[16]; 
  __int64 v114; 
  __int64 v115; 
  __int64 v116; 
  __int64 v117; 
  v2 = a2;
  if( (*(_DWORD *)(a2 + 2448) & 0x110000) != 1114112 )
  {
    v3 = *(_QWORD *)(a2 + 2272);
    v4 = 38i64;
    v5 = (_QWORD *)v3;
    v6 = 304;
    do
    {
      *v5 = 0i64;
      v6 -= 8;
      ++v5;
      --v4;
    }
    while( v4 );
    for( ; v6; --v6 )
    {
      *(_BYTE *)v5 = 0;
      v5 = (_QWORD *)((char *)v5 + 1);
    }
    *(_OWORD *)(v3 + 16) = *(_OWORD *)(v2 + 2120);
    *(_OWORD *)(v3 + 32) = *(_OWORD *)(v2 + 2136);
    *(_OWORD *)(v3 + 288) = *(_OWORD *)(v2 + 2152);
    v112[0] = 303;
    *(_QWORD *)&v112[1] = v3;
    *(_WORD *)(v3 + 16) = v2 + 2168;
    *(_DWORD *)(v3 + 24) = (unsigned __int64)(v2 + 2168) >> 32;
    *(_WORD *)(v3 + 22) = (unsigned int)(v2 + 2168) >> 16;
    _disable();
    if( *(int *)(v2 + 2448) >= 0 )
    {
      __sidt(v113);
      __lidt(v112);
      __writedr(7u, 0i64);
      __lidt(v113);
    }
    else
    {
      __writedr(7u, 0i64);
    }
    _enable();
  }
  *(_DWORD *)(v2 + 2088) += 1568;
  v7 = *(_DWORD *)(v2 + 196);
  v8 = (_QWORD *)v2;
  v9 = *(_DWORD *)(v2 + 2068);
  v10 = (char *)v2;
  v11 = *(_QWORD *)(v2 + 2072);
  *(_DWORD *)(v2 + 196) = 0;
  if( v2 < (unsigned __int64)(v2 + 1568) )
  {
    do
    {
      _mm_prefetchnta(v10);
      v10 += 64;
    }
    while( (unsigned __int64)v10 < v2 + 1568 );
  }
  v12 = v11;
  v13 = 12;
  do
  {
    v14 = 8i64;
    do
    {
      v15 = v12 ^ *v8;
      v16 = v8 + 1;
      v17 = *v16;
      v8 = v16 + 1;
      v12 = __ROL8__(__ROL8__(v15, v9) ^ v17, v9);
      --v14;
    }
    while( v14 );
    v18 = __ROL8__(v11 ^ ((unsigned __int64)v8 - v2), 17) ^ v11 ^ ((unsigned __int64)v8 - v2);
    v114 = (v18 * (unsigned __int128)0x7010008004002001ui64) >> 64;
    v9 = ((unsigned __int8)(v114 ^ v18) ^ (unsigned __int8)v9) & 0x3F;
    if( !v9 )
      LOBYTE(v9) = 1;
    --v13;
  }
  while( v13 );
  LODWORD(v19) = 32;
  v20 = 4;
  v21 = 4i64;
  v22 = 64;
  do
  {
    v12 = __ROL8__(*v8++ ^ v12, v9);
    v19 = (unsigned int)(v19 - 8);
    --v21;
  }
  while( v21 );
  if( (_DWORD)v19 )
  {
    do
    {
      v23 = *(unsigned __int8 *)v8;
      v8 = (_QWORD *)((char *)v8 + 1);
      v12 = __ROL8__(v23 ^ v12, v9);
      v24 = (_DWORD)v19 == 1;
      v19 = (unsigned int)(v19 - 1);
    }
    while( !v24 );
  }
  *(_DWORD *)(v2 + 196) = v7;
  if( *(_QWORD *)(v2 + 2592) != v12 )
  {
    v25 = *(_QWORD *)(v2 + 1424);
    v26 = *(_DWORD *)(v2 + 2020);
    *(_QWORD *)v25 = v2;
    *(_DWORD *)(v25 + 16) = v26;
    v19 = *(_QWORD *)(v2 + 2592);
    if( !*(_DWORD *)(v2 + 2296) )
    {
      *(_QWORD *)(*(_QWORD *)(v2 + 1424) + 24i64) = v19 ^ v12;
      if( !*(_DWORD *)(v2 + 2296) )
      {
        *(_QWORD *)(v2 + 2312) = 0i64;
        *(_QWORD *)(v2 + 2304) = v2 - 0x5C5FC0A76E374B18i64;
        *(_QWORD *)(v2 + 2320) = 265i64;
        *(_QWORD *)(v2 + 2328) = v12;
        *(_DWORD *)(v2 + 2296) = 1;
        __b8(v2, 0i64);
      }
    }
  }
  v106 = 0i64;
  v27 = &v107;
  do
  {
    *(_BYTE *)v27 = 0;
    v27 = (unsigned int *)((char *)v27 + 1);
    --v20;
  }
  while( v20 );
  v28 = 0;
  LODWORD(v108) = 0;
  if( *(_DWORD *)(v2 + 2016) )
  {
    while( 1 )
    {
      v29 = v2;
      v30 = 0;
      if( *(_QWORD *)(v2 + 2680) )
        v29 = *(_QWORD *)(v2 + 2680);
      v31 = (int *)(v29 + *(unsigned int *)(v29 + 2056));
      if( (_DWORD)v106 && HIDWORD(v106) <= v28 )
      {
        v30 = HIDWORD(v106);
        v31 = (int *)(v29 + v107);
      }
      if( v30 != v28 )
        break;
LABEL_57:
      v39 = (_QWORD *)*((_QWORD *)v31 + 1);
      v40 = *(_DWORD *)(v2 + 2068);
      v41 = (_DWORD)v31 - v29;
      v42 = *(_QWORD *)(v2 + 2072);
      v43 = v39;
      HIDWORD(v106) = v30;
      v44 = (unsigned int)v31[4];
      *(_DWORD *)(v2 + 2088) += v44;
      v107 = v41;
      v45 = (char *)v39;
      LODWORD(v106) = 1;
      if( v39 < (_QWORD *)((char *)v39 + v44) )
      {
        do
        {
          _mm_prefetchnta(v45);
          v45 += 64;
        }
        while( v45 < (char *)v39 + v44 );
      }
      v46 = v42;
      v47 = (unsigned int)v44 >> 7;
      if( (unsigned int)v44 >> 7 )
      {
        do
        {
          v48 = 8i64;
          do
          {
            v49 = v43[1] ^ __ROL8__(*v43 ^ v46, v40);
            v43 += 2;
            v46 = __ROL8__(v49, v40);
            --v48;
          }
          while( v48 );
          v50 = __ROL8__(v42 ^ ((char *)v43 - (char *)v39), 17) ^ v42 ^ ((char *)v43 - (char *)v39);
          v19 = (v50 * (unsigned __int128)0x7010008004002001ui64) >> 64;
          v115 = v19;
          v40 = ((unsigned __int8)(v19 ^ v50) ^ (unsigned __int8)v40) & 0x3F;
          if( !v40 )
            LOBYTE(v40) = 1;
          --v47;
        }
        while( v47 );
        v2 = a2;
      }
      v51 = v44 & 0x7F;
      if( (unsigned int)v51 >= 8 )
      {
        v52 = (unsigned __int64)(unsigned int)v51 >> 3;
        do
        {
          v46 = __ROL8__(*v43++ ^ v46, v40);
          v51 = (unsigned int)(v51 - 8);
          --v52;
        }
        while( v52 );
      }
      if( (_DWORD)v51 )
      {
        do
        {
          v53 = *(unsigned __int8 *)v43;
          v43 = (_QWORD *)((char *)v43 + 1);
          v46 = __ROL8__(v53 ^ v46, v40);
          v24 = (_DWORD)v51 == 1;
          v51 = (unsigned int)(v51 - 1);
        }
        while( !v24 );
      }
      for( i = v46; ; LODWORD(v46) = i ^ v46 )
      {
        i >>= 31;
        if( !i )
          break;
      }
      v55 = v46 & 0x7FFFFFFF;
      v56 = 0;
      if( v55 != v31[5] )
      {
        if( !*v31 && v31[6] )
          v56 = 1;
        v57 = (unsigned int)v31[4];
        v58 = *((_QWORD *)v31 + 1);
        if( v31[4] && (*(_DWORD *)(v2 + 2452) & 0x40) != 0 )
        {
          CurrentIrql = KeGetCurrentIrql();
          __writecr8(2ui64);
          v60 = v58 & 0xFFFFFFFFFFFFF000ui64;
          v110 = (v58 + v57 - 1) | 0xFFF;
          v109 = (v58 & 0xFFFFFFFFFFFFF000ui64) - 1;
          while( 2 )
          {
            v61 = CurrentIrql;
            while( 1 )
            {
              v62 = (*(__int64(__fastcall **)(unsigned __int64, _QWORD, __int64, _QWORD *))(v2 + 1128))(
                      v60,
                      0i64,
                      v51,
                      v43);
              if( v62 != -1073741267 )
                break;
              if( v56 )
                goto LABEL_101;
              if( CurrentIrql > 1u )
                goto LABEL_87;
              v61 = CurrentIrql;
              __writecr8(CurrentIrql);
              KeGetCurrentIrql();
              __writecr8(2ui64);
            }
            if( v62 < 0 )
            {
LABEL_101:
              __writecr8(v61);
              goto LABEL_102;
            }
LABEL_87:
            v19 = 4096i64;
            v60 += 4096i64;
            v109 += 4096i64;
            if( v109 != v110 )
              continue;
            break;
          }
          __writecr8(v61);
        }
        else
        {
LABEL_102:
          v76 = *(_DWORD *)(v2 + 2296);
          v19 = (unsigned int)v31[5];
          if( !v76 )
          {
            *(_QWORD *)(*(_QWORD *)(v2 + 1424) + 24i64) = v19 ^ v55;
            v76 = *(_DWORD *)(v2 + 2296);
          }
          v77 = *((_QWORD *)v31 + 1);
          if( !v76 )
          {
            *(_QWORD *)(v2 + 2304) = v2 - 0x5C5FC0A76E374B18i64;
            *(_QWORD *)(v2 + 2312) = (char *)v31 - 0x4C48B4211BBACBEBi64;
            v78 = *v31;
            *(_QWORD *)(v2 + 2328) = v77;
            *(_QWORD *)(v2 + 2320) = v78;
            *(_DWORD *)(v2 + 2296) = 1;
            __b8(v2, 0i64);
          }
        }
      }
      v22 = 64;
      v28 = v108 + 1;
      LODWORD(v108) = v28;
      if( v28 >= *(_DWORD *)(v2 + 2016) )
        goto LABEL_90;
    }
    v32 = v28 - v30;
    v30 = v28;
    while( 1 )
    {
      v33 = *v31;
      if( *v31 > 12 )
        break;
      if( v33 == 12 )
        goto LABEL_50;
      v34 = v33 - 1;
      if( !v34 )
        goto LABEL_50;
      v35 = v34 - 6;
      if( v35 )
      {
        v36 = v35 - 1;
        if( !v36 )
        {
          v38 = *((unsigned __int16 *)v31 + 16);
LABEL_55:
          v37 = (v38 + 55) & 0xFFFFFFF8;
          goto LABEL_56;
        }
        if( v36 != 2 )
          goto LABEL_52;
        v37 = (unsigned int)(16 * (v31[7] + 3));
      }
      else
      {
        v37 = (unsigned int)(24 * (v31[6] + 2));
      }
LABEL_56:
      v31 = (int *)((char *)v31 + v37);
      if( !--v32 )
        goto LABEL_57;
    }
    if( v33 == 28 )
    {
      v38 = *((unsigned __int16 *)v31 + 20);
      goto LABEL_55;
    }
    if( v33 == 30 )
    {
      v19 = ((v31[9] != 0 ? v31[9] - 1 : 0) / 0xCu + 7) & 0xFFFFFFF8;
      v37 = (unsigned int)v19 + 24 * (*((unsigned __int16 *)v31 + 20) + 2);
      goto LABEL_56;
    }
    if( v33 <= 32 )
    {
LABEL_52:
      v37 = 48i64;
      goto LABEL_56;
    }
    if( v33 <= 34 )
    {
      v19 = ((v31[8] & 0xFFF) + (unsigned __int64)(unsigned int)v31[10] + 4095) >> 12;
      v37 = (unsigned int)(20 * v19 + 48);
      goto LABEL_56;
    }
    if( v33 != 43 )
      goto LABEL_52;
LABEL_50:
    v19 = (unsigned int)v31[4] / 0xCui64;
    v37 = (unsigned int)(4 * v19 + 48);
    goto LABEL_56;
  }
LABEL_90:
  if( *(_DWORD *)(v2 + 2296) )
  {
    v63 = *(_QWORD *)(v2 + 2320);
    v64 = *(_QWORD *)(v2 + 2328);
    v65 = *(_QWORD *)(v2 + 2312);
    v66 = *(_QWORD *)(v2 + 2304);
    v110 = v64;
    v109 = v65;
    v108 = v66;
    v111 = v2;
    if( KeGetCurrentIrql() < 2u )
    {
      KeGetCurrentIrql();
      __writecr8(2ui64);
    }
    CurrentPrcb = KeGetCurrentPrcb();
    v68 = *(void ***)((char *)CurrentPrcb + *(_QWORD *)(v2 + 1592));
    v69 = *(_QWORD *)((char *)CurrentPrcb + *(_QWORD *)(v2 + 1608));
    if( !*((_BYTE *)CurrentPrcb + *(_QWORD *)(v2 + 1600)) || &v111 > (__int64 *)v68 || &v111 < (__int64 *)v68 - 3072 )
      v68 = *(void ***)(v69 + *(_QWORD *)(v2 + 1656));
    if( (*(_DWORD *)(v2 + 2448) & 0x8000000) == 0 )
    {
      v70 = __readcr0();
      __writecr0(v70 & 0xFFFFFFFFFFFEFFFFui64);
      v71 = v2 + 2728;
      v72 = 0;
      v73 = v2 + 2728 + 16i64 * *(unsigned int *)(v2 + 2720);
      for( j = (_QWORD *)v73; v72 < *(_DWORD *)(v2 + 2724); ++v72 )
      {
        *(_QWORD *)*j = j[1];
        v75 = __readcr4();
        if( (v75 & 0x20080) != 0 )
        {
          __writecr4(v75 ^ 0x80);
          __writecr4(v75);
        }
        else
        {
          v79 = __readcr3();
          __writecr3(v79);
        }
        j += 2;
      }
      if( v71 < v73 )
      {
        do
        {
          v80 = *(unsigned int *)(v71 + 8);
          v81 = j;
          v82 = *(char **)v71;
          v83 = v80;
          if( (unsigned int)v80 >= 8 )
          {
            v84 = (unsigned __int64)(unsigned int)v80 >> 3;
            do
            {
              v83 -= 8;
              *(_QWORD *)v82 = *v81++;
              v82 += 8;
              --v84;
            }
            while( v84 );
          }
          if( v83 )
          {
            v85 = v82 - (char *)v81;
            do
            {
              *((_BYTE *)v81 + v85) = *(_BYTE *)v81;
              v81 = (_QWORD *)((char *)v81 + 1);
              --v83;
            }
            while( v83 );
          }
          j = (_QWORD *)((char *)j + v80);
          v71 += 16i64;
        }
        while( v71 < v73 );
        v64 = v110;
        v65 = v109;
      }
      **(_BYTE **)(v2 + 536) = -61;
      __writecr0(v70);
      v66 = v108;
    }
    v99 = *(_DWORD *)(v2 + 2344);
    if( v99 )
    {
      if( KeGetCurrentIrql() < 2u )
      {
        KeGetCurrentIrql();
        __writecr8(2ui64);
        v99 = *(_DWORD *)(v2 + 2344);
      }
      if( v99 )
      {
        v100 = v99 - 1;
        if( v100 )
        {
          v101 = v100 - 1;
          if( v101 )
          {
            v102 = v101 - 1;
            if( v102 )
            {
              v103 = v102 - 1;
              if( v103 )
              {
                if( v103 == 1 )
                  _interlockedbittestandset(
                    *(volatile signed __int32 **)((char *)KeGetCurrentPrcb() + *(_QWORD *)(v2 + 1608)),
                    (*(_DWORD *)(v2 + 2448) >> 10) & 0x1F);
                else
                  _InterlockedOr64((volatile signed __int64 *)(*(_QWORD *)(v2 + 1464) + 832i64), 1ui64);
              }
              else
              {
                _interlockedbittestandset(
                  *(volatile signed __int32 **)(*(_QWORD *)(v2 + 1704)
                                              + *(_QWORD *)((char *)KeGetCurrentPrcb() + *(_QWORD *)(v2 + 1608))
                                              + *(_QWORD *)(v2 + 1672)),
                  (*(_DWORD *)(v2 + 2448) >> 10) & 0x1F);
              }
              goto LABEL_151;
            }
            v104 = *(volatile signed __int32 **)(v2 + 1376);
          }
          else
          {
            v104 = *(volatile signed __int32 **)(v2 + 1368);
          }
        }
        else
        {
          v104 = *(volatile signed __int32 **)(v2 + 1352);
        }
        _interlockedbittestandset64(v104, 0i64);
      }
    }
LABEL_151:
    *(_QWORD *)(v69 + *(_QWORD *)(v2 + 1680)) = 0i64;
    *(_QWORD *)(v69 + *(_QWORD *)(v2 + 1696)) = 0i64;
    SdbpCheckDll(265i64, v66, v65, v64, v63, *(__int64(__fastcall **)(__int64))(v2 + 344), v68);
    JUMPOUT(0x140A10821i64);
  }
  v86 = v2 + *(unsigned int *)(v2 + 2032);
  if( (*(_DWORD *)(v2 + 2448) & 0x10000000) != 0 )
  {
    v87 = __rdtsc();
    v88 = __ROR8__(v87, 3) ^ v87;
    v19 = (v88 * (unsigned __int128)0x7010008004002001ui64) >> 64;
    v116 = v19;
    v86 = (__int64)KiMachineCheckControl + 16 * (((unsigned __int8)v88 ^ (unsigned __int8)v19) & 0xF);
  }
  v89 = *(_QWORD **)(v2 + 2568);
  if( v89 )
  {
    v90 = __rdtsc();
    v91 = (__ROR8__(v90, 3) ^ v90) * (unsigned __int128)0x7010008004002001ui64;
    v117 = *((_QWORD *)&v91 + 1);
    *((_QWORD *)&v91 + 1) ^= v91;
    v89[2] = *((_QWORD *)&v91 + 1);
    *(_QWORD *)&v91 = v86 ^ *((_QWORD *)&v91 + 1);
    v19 = v2 ^ *((_QWORD *)&v91 + 1);
    v89[3] = v91;
    v89[1] = v19;
    _InterlockedOr(v105, 0);
    v86 = *(_QWORD *)(v2 + 752);
  }
  else
  {
    v89 = (_QWORD *)v2;
  }
  *(_QWORD *)(v2 + 1960) = v86;
  *(_QWORD *)(v2 + 1968) = v89;
  *(_QWORD *)(v2 + 1944) = 0i64;
  _disable();
  _enable();
  LOBYTE(v92) = (*(__int64(__fastcall **)(__int64, __int64))(v2 + 616))(v2 + 2048, v19);
  (*(void(__fastcall **)(__int64, __int64))(v2 + 624))(v2 + 2048, v92);
  switch( *(_DWORD *)(v2 + 2104) )
  {
    case 3:
      _disable();
      *(_QWORD *)(v2 + 2456) = *(_QWORD *)((char *)KeGetCurrentPrcb() + *(_QWORD *)(v2 + 1608));
      _enable();
      break;
    case 4:
      v97 = *(_QWORD *)(v2 + 2528);
      *(_QWORD *)(*(_QWORD *)(v97 + 56) ^ *(_QWORD *)(v97 + 64)) = v97 ^ *(_QWORD *)(v97 + 72) ^ *(_QWORD *)(v97 + 64);
      *(_QWORD *)(v97 + 72) = 0i64;
      *(_QWORD *)(v97 + 56) = 0i64;
      break;
    case 5:
      v93 = (char *)(v2 + 2464);
      v94 = (_QWORD *)(*(_QWORD *)(v2 + 2456) + 8i64);
      v95 = 8i64;
      do
      {
        v22 -= 8;
        *v94 = *(_QWORD *)v93;
        v93 += 8;
        ++v94;
        --v95;
      }
      while( v95 );
      for( ; v22; --v22 )
      {
        v96 = *v93++;
        *(_BYTE *)v94 = v96;
        v94 = (_QWORD *)((char *)v94 + 1);
      }
      break;
  }
  _InterlockedOr(v105, 0);
  return v2;
}

Referenced by:

RtlpComputeEpilogueOffset