sub_140A0F5E8

int __fastcall sub_140A0F5E8(__int64 a1, __int64 *a2, unsigned int a3){
  unsigned int v4; 
  __int64 *v5; 
  __int64 *v6; 
  __int64 *v7; 
  int v8; 
  unsigned __int64 v9; 
  INT64(*v10)(void); 
  char v11; 
  unsigned __int8 CurrentIrql; 
  volatile signed __int32 *v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned int v16; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  char v21; 
  __int64 v22; 
  unsigned __int8 v23; 
  volatile signed __int32 *v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  unsigned int v27; 
  struct _KPRCB *v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  signed __int64 v32; 
  bool v33; 
  unsigned int v34; 
  INT64(*v35)(void); 
  unsigned __int64 v36; 
  char v37; 
  unsigned __int8 v38; 
  volatile signed __int32 *v39; 
  unsigned __int64 v40; 
  __int64 v41; 
  unsigned int v42; 
  struct _KPRCB *v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  char v47; 
  volatile signed __int32 *v48; 
  unsigned __int64 v49; 
  __int64 v50; 
  unsigned int v51; 
  unsigned __int8 v52; 
  struct _KPRCB *v53; 
  __int64 v54; 
  __int64 v55; 
  __int64 v56; 
  __int64 v57; 
  int i; 
  unsigned int v60; 
  unsigned __int64 v61; 
  __int64 v62; 
  __int64 v63; 
  __int64 v64; 
  __int64 v65; 
  __int64 v66; 
  __int64 v67; 
  char v68; 
  __int64 *v69; 
  char v70; 
  unsigned int v71; 

  v70 = a3;
  v69 = a2;
  v4 = a3;
  *(_DWORD *)(a1 + 2088) += a3;
  v5 = a2;
  v6 = a2;
  v7 = (__int64 *)((char *)a2 + a3);
  if( a2 < v7 )
  {
    do
    {
      _mm_prefetchnta(v6);
      v6 += 8;
    }
    while( v6 < v7 );
  }
  v8 = *(_DWORD *)(a1 + 2068);
  v9 = *(_QWORD *)(a1 + 2072);
  v61 = v9;
  v68 = v8;
  v60 = v4 >> 7;
  if( v4 >> 7 )
  {
    v10 = (INT64(*)(void))((char *)a2 - 6);
    do
    {
      v71 = 128;
      do
      {
        v11 = *((_BYTE *)v10 + 5);
        if( *(_BYTE *)v10 == 76
          && *((_BYTE *)v10 + 1) == 0x87
          && !*((_BYTE *)v10 + 2)
          && *((_BYTE *)v10 + 3) == 0x98
          && *((_BYTE *)v10 + 4) == 0xC3
          && (v11 == -112 || v11 == -15) )
        {
          CurrentIrql = -1;
          v13 = 0i64;
          v14 = __rdtsc();
          v15 = __ROR8__(v14, 3) ^ v14;
          v63 = (v15 * (unsigned __int128)0x7010008004002001ui64) >> 64;
          v16 = ((unsigned __int8)v63 ^ (unsigned __int8)v15) & 3;
          if( v16 <= 1 )
          {
            CurrentIrql = KeGetCurrentIrql();
            __writecr8(2ui64);
            CurrentPrcb = KeGetCurrentPrcb();
            v18 = *(_QWORD *)(a1 + 1608);
            v13 = v16 ? *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
                                                    + *(_QWORD *)((char *)&CurrentPrcb->_MxCsr + v18)
                                                    + *(_QWORD *)(a1 + 1672)) : *(volatile signed __int32 **)((char *)&CurrentPrcb->_MxCsr + v18);
            if( _interlockedbittestandset(v13, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
            {
              v13 = 0i64;
              __writecr8(CurrentIrql);
            }
          }
          LODWORD(v19) = KiAccessPage(v10);
          v20 = v19;
          if( v13 )
          {
            _InterlockedAnd(v13, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
            __writecr8(CurrentIrql);
          }
          LOBYTE(v8) = v68;
        }
        else
        {
          v20 = 0i64;
        }
        v21 = *((_BYTE *)v10 + 5);
        v22 = __ROL8__(v9 ^ v20, v8);
        if( *(_BYTE *)v10 == 76
          && *((_BYTE *)v10 + 1) == 0x87
          && !*((_BYTE *)v10 + 2)
          && *((_BYTE *)v10 + 3) == 0x98
          && *((_BYTE *)v10 + 4) == 0xC3
          && (v21 == -112 || v21 == -15) )
        {
          v23 = -1;
          v24 = 0i64;
          v25 = __rdtsc();
          v26 = __ROR8__(v25, 3) ^ v25;
          v64 = (v26 * (unsigned __int128)0x7010008004002001ui64) >> 64;
          v27 = ((unsigned __int8)v64 ^ (unsigned __int8)v26) & 3;
          if( v27 <= 1 )
          {
            v23 = KeGetCurrentIrql();
            __writecr8(2ui64);
            v28 = KeGetCurrentPrcb();
            v29 = *(_QWORD *)(a1 + 1608);
            v24 = v27 ? *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
                                                    + *(_QWORD *)((char *)&v28->_MxCsr + v29)
                                                    + *(_QWORD *)(a1 + 1672)) : *(volatile signed __int32 **)((char *)&v28->_MxCsr + v29);
            if( _interlockedbittestandset(v24, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
            {
              v24 = 0i64;
              __writecr8(v23);
            }
          }
          LODWORD(v30) = KiAccessPage(v10);
          v31 = v30;
          if( v24 )
          {
            _InterlockedAnd(v24, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
            __writecr8(v23);
          }
          LOBYTE(v8) = v68;
        }
        else
        {
          v31 = 0i64;
        }
        v9 = __ROL8__(v22 ^ v31, v8);
        v5 += 2;
        v71 -= 16;
      }
      while( v71 >= 8 );
      v32 = __ROL8__(v61 ^ ((char *)v5 - (char *)v69), 17) ^ v61 ^ ((char *)v5 - (char *)v69);
      v65 = ((unsigned __int64)v32 * (unsigned __int128)0x7010008004002001ui64) >> 64;
      v8 = ((unsigned __int8)v8 ^ (unsigned __int8)(v65 ^ v32)) & 0x3F;
      if( !v8 )
        LOBYTE(v8) = 1;
      v33 = v60-- == 1;
      v68 = v8;
    }
    while( !v33 );
    LOBYTE(v4) = v70;
    a2 = v69;
  }
  v34 = v4 & 0x7F;
  if( v34 >= 8 )
  {
    v35 = (INT64(*)(void))((char *)a2 - 6);
    v36 = (unsigned __int64)v34 >> 3;
    do
    {
      v37 = *((_BYTE *)v35 + 5);
      if( *(_BYTE *)v35 == 76
        && *((_BYTE *)v35 + 1) == 0x87
        && !*((_BYTE *)v35 + 2)
        && *((_BYTE *)v35 + 3) == 0x98
        && *((_BYTE *)v35 + 4) == 0xC3
        && (v37 == -112 || v37 == -15) )
      {
        v38 = -1;
        v39 = 0i64;
        v40 = __rdtsc();
        v41 = __ROR8__(v40, 3);
        v66 = ((v41 ^ v40) * (unsigned __int128)0x7010008004002001ui64) >> 64;
        v42 = ((unsigned __int8)v66 ^ (unsigned __int8)(v41 ^ v40)) & 3;
        if( v42 <= 1 )
        {
          v38 = KeGetCurrentIrql();
          __writecr8(2ui64);
          v43 = KeGetCurrentPrcb();
          v44 = *(_QWORD *)(a1 + 1608);
          v39 = v42 ? *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
                                                  + *(_QWORD *)((char *)&v43->_MxCsr + v44)
                                                  + *(_QWORD *)(a1 + 1672)) : *(volatile signed __int32 **)((char *)&v43->_MxCsr + v44);
          if( _interlockedbittestandset(v39, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
          {
            v39 = 0i64;
            __writecr8(v38);
          }
        }
        LODWORD(v45) = KiAccessPage(v35);
        v46 = v45;
        if( v39 )
        {
          _InterlockedAnd(v39, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
          __writecr8(v38);
        }
      }
      else
      {
        v46 = 0i64;
      }
      v9 = __ROL8__(v46 ^ v9, v68);
      ++v5;
      v34 -= 8;
      --v36;
    }
    while( v36 );
  }
  if( ((unsigned __int16)v5 & 0xFFFu) <= 0xFF8 )
  {
    v47 = *((_BYTE *)v69 - 1);
    if( *((_BYTE *)v69 - 6) == 76
      && *((_BYTE *)v69 - 5) == 0x87
      && !*((_BYTE *)v69 - 4)
      && *((_BYTE *)v69 - 3) == 0x98
      && *((_BYTE *)v69 - 2) == 0xC3
      && (v47 == -112 || v47 == -15) )
    {
      v48 = 0i64;
      v49 = __rdtsc();
      v50 = __ROR8__(v49, 3);
      v67 = ((v50 ^ v49) * (unsigned __int128)0x7010008004002001ui64) >> 64;
      v51 = ((unsigned __int8)v67 ^ (unsigned __int8)(v50 ^ v49)) & 3;
      if( v51 > 1 )
      {
        v52 = -1;
      }
      else
      {
        v52 = KeGetCurrentIrql();
        __writecr8(2ui64);
        v53 = KeGetCurrentPrcb();
        v54 = *(_QWORD *)(a1 + 1608);
        if( v51 )
          v48 = *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
                                            + *(_QWORD *)((char *)&v53->_MxCsr + v54)
                                            + *(_QWORD *)(a1 + 1672));
        else
          v48 = *(volatile signed __int32 **)((char *)&v53->_MxCsr + v54);
        if( _interlockedbittestandset(v48, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
        {
          v48 = 0i64;
          __writecr8(v52);
        }
      }
      LODWORD(v55) = KiAccessPage((INT64(*)(void))((char *)v69 - 6));
      v56 = v55;
      if( v48 )
      {
        _InterlockedAnd(v48, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
        __writecr8(v52);
      }
    }
    else
    {
      v56 = 0i64;
    }
    v62 = v56;
    v5 = &v62;
  }
  for( ; v34; --v34 )
  {
    v57 = *(unsigned __int8 *)v5;
    v5 = (__int64 *)((char *)v5 + 1);
    v9 = __ROL8__(v57 ^ v9, v68);
  }
  for( i = v9; ; i ^= v9 )
  {
    v9 >>= 31;
    if( !v9 )
      break;
  }
  return i & 0x7FFFFFFF;
}

Referenced by:

sub_1403DCCA0