sub_1403EA328

unsigned __int64 __fastcall sub_1403EA328(__int64 a1, int *a2, __int64 a3){
  unsigned __int64 result; 
  __int64 v6; 
  int v7; 
  unsigned __int64 v8; 
  unsigned __int64 j; 
  _QWORD *v10; 
  __int64 v11; 
  _QWORD *v12; 
  char *v13; 
  int v14; 
  __int64 v15; 
  unsigned int v16; 
  unsigned __int64 i; 
  __int64 v18; 
  unsigned __int64 v19; 
  _QWORD *v20; 
  __int64 v21; 
  __int64 v22; 
  int v23; 
  unsigned int v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  unsigned int v27; 
  int v28; 
  unsigned __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  __int64 CurrentIrql; 
  unsigned __int64 v33; 
  unsigned __int64 v34; 
  int v35; 
  __int64 v36; 
  __int64 v37; 
  unsigned int v38; 
  unsigned __int64 *v39; 
  char *v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  int v44; 
  __int64 v45; 
  unsigned __int64 v46; 
  unsigned __int64 v47; 
  unsigned __int64 v48; 
  __int64 v49; 
  char v50[72]; 
  unsigned __int64 v51; 
  unsigned __int8 v52; 
  unsigned __int8 v53; 
  __int64 v54; 
  __int64 v55; 

  result = (unsigned int)a2[10];
  LOBYTE(a3) = 4;
  if( (result & 2) == 0 )
  {
LABEL_14:
    result = (unsigned int)a2[10];
    if( (result & 4) != 0 )
      return result;
    v10 = (_QWORD *)*((_QWORD *)a2 + 1);
    v11 = (unsigned int)a2[4];
    v12 = v10;
    *(_DWORD *)(a1 + 2088) += v11;
    v13 = (char *)v10;
    v14 = *(_DWORD *)(a1 + 2068);
    v15 = *(_QWORD *)(a1 + 2072);
    if( v10 < (_QWORD *)((char *)v10 + v11) )
    {
      do
      {
        _mm_prefetchnta(v13);
        v13 += 64;
      }
      while( v13 < (char *)v10 + v11 );
    }
    v16 = (unsigned int)v11 >> 7;
    for( i = *(_QWORD *)(a1 + 2072); v16; --v16 )
    {
      v18 = 8i64;
      do
      {
        v19 = *v12 ^ i;
        v20 = v12 + 1;
        v21 = *v20 ^ __ROL8__(v19, v14);
        v12 = v20 + 1;
        i = __ROL8__(v21, v14);
        --v18;
      }
      while( v18 );
      v22 = __ROL8__(v15 ^ ((char *)v12 - (char *)v10), 17);
      LOBYTE(v22) = v14 ^ (((v22 ^ v15 ^ (unsigned __int64)((char *)v12 - (char *)v10))
                          * (unsigned __int128)0x7010008004002001ui64) >> 64) ^ v22 ^ v15 ^ ((_BYTE)v12 - (_BYTE)v10);
      LOBYTE(v14) = 1;
      v23 = v22 & 0x3F;
      if( v23 )
        LOBYTE(v14) = v23;
    }
    v24 = v11 & 0x7F;
    if( v24 >= 8 )
    {
      v25 = (unsigned __int64)v24 >> 3;
      do
      {
        i = __ROL8__(*v12++ ^ i, v14);
        v24 -= 8;
        --v25;
      }
      while( v25 );
    }
    for( ; v24; --v24 )
    {
      v26 = *(unsigned __int8 *)v12;
      v12 = (_QWORD *)((char *)v12 + 1);
      i = __ROL8__(v26 ^ i, v14);
    }
    for( result = i; ; LODWORD(i) = result ^ i )
    {
      result >>= 31;
      if( !result )
        break;
    }
    v27 = i & 0x7FFFFFFF;
    v28 = 0;
    v29 = 0xB3B74BDEE4453415ui64;
    if( v27 != a2[5] )
    {
      if( !*a2 && a2[6] )
        v28 = 1;
      v30 = (unsigned int)a2[4];
      v31 = *((_QWORD *)a2 + 1);
      if( a2[4] && (*(_DWORD *)(a1 + 2452) & 0x40) != 0 )
      {
        CurrentIrql = KeGetCurrentIrql();
        v53 = CurrentIrql;
        __writecr8(2ui64);
        v33 = (unsigned __int8)CurrentIrql;
        v34 = v31 & 0xFFFFFFFFFFFFF000ui64;
        v55 = (v31 + v30 - 1) | 0xFFF;
        v51 = (v31 & 0xFFFFFFFFFFFFF000ui64) - 1;
        while( 1 )
        {
          while( 1 )
          {
            v35 = (*(__int64(__fastcall **)(unsigned __int64, _QWORD, __int64, unsigned __int64))(a1 + 1128))(
                    v34,
                    0i64,
                    CurrentIrql,
                    v29);
            if( v35 == -1073741267 )
              break;
            if( v35 < 0 )
            {
LABEL_45:
              __writecr8(v33);
              goto LABEL_46;
            }
LABEL_43:
            v34 += 4096i64;
            result = v51 + 4096;
            v51 = result;
            if( result == v55 )
            {
              __writecr8(v33);
              goto LABEL_50;
            }
          }
          if( v28 )
            goto LABEL_45;
          if( v53 > 1u )
            goto LABEL_43;
          __writecr8(v33);
          KeGetCurrentIrql();
          __writecr8(2ui64);
        }
      }
LABEL_46:
      result = *(unsigned int *)(a1 + 2296);
      if( !(_DWORD)result )
      {
        *(_QWORD *)(*(_QWORD *)(a1 + 1424) + 24i64) = v27 ^ (unsigned __int64)(unsigned int)a2[5];
        result = *(unsigned int *)(a1 + 2296);
      }
      v36 = *((_QWORD *)a2 + 1);
      if( !(_DWORD)result )
      {
        *(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
        *(_QWORD *)(a1 + 2312) = (char *)a2 - 0x4C48B4211BBACBEBi64;
        *(_QWORD *)(a1 + 2320) = *a2;
        *(_QWORD *)(a1 + 2328) = v36;
        *(_DWORD *)(a1 + 2296) = 1;
        result = __b8(a1, 0i64);
      }
    }
LABEL_50:
    v37 = (unsigned int)a2[4];
    if( !(_DWORD)v37 )
      return result;
    sub_1403E92DC(a1, *((_QWORD *)a2 + 1), v37, (__int64)v50);
    v38 = 16;
    v39 = (unsigned __int64 *)(a2 + 6);
    v40 = v50;
    do
    {
      v41 = *(_QWORD *)v40;
      v40 += 8;
      result = *v39++;
      if( v41 != result )
        goto LABEL_58;
      v38 -= 8;
    }
    while( v38 >= 8 );
    if( v38 )
    {
      while( 1 )
      {
        v42 = (unsigned __int8)*v40++;
        result = *(unsigned __int8 *)v39;
        v39 = (unsigned __int64 *)((char *)v39 + 1);
        if( v42 != result )
          break;
        if( !--v38 )
          goto LABEL_70;
      }
LABEL_58:
      v43 = *((_QWORD *)a2 + 1);
      v44 = a2[10] & 1;
      result = *(unsigned int *)(a1 + 2452);
      if( (result & 0x40) != 0 )
      {
        v45 = KeGetCurrentIrql();
        v52 = v45;
        __writecr8(2ui64);
        v46 = (unsigned __int8)v45;
        v47 = v43 & 0xFFFFFFFFFFFFF000ui64;
        v54 = (v37 + v43 - 1) | 0xFFF;
        v48 = (v43 & 0xFFFFFFFFFFFFF000ui64) - 1;
        while( 1 )
        {
          while( 1 )
          {
            result = (*(__int64(__fastcall **)(unsigned __int64, _QWORD, __int64, unsigned __int64 *))(a1 + 1128))(
                       v47,
                       0i64,
                       v45,
                       v39);
            if( (_DWORD)result == -1073741267 )
              break;
            if( (result & 0x80000000) != 0i64 )
            {
LABEL_67:
              __writecr8(v46);
              goto LABEL_68;
            }
LABEL_65:
            result = 4096i64;
            v47 += 4096i64;
            v48 += 4096i64;
            if( v48 == v54 )
            {
              __writecr8(v46);
              goto LABEL_70;
            }
          }
          if( v44 )
            goto LABEL_67;
          if( v52 > 1u )
            goto LABEL_65;
          __writecr8(v46);
          KeGetCurrentIrql();
          __writecr8(2ui64);
        }
      }
LABEL_68:
      v49 = *((_QWORD *)a2 + 1);
      if( !*(_DWORD *)(a1 + 2296) )
      {
        *(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
        *(_QWORD *)(a1 + 2312) = (char *)a2 - 0x4C48B4211BBACBEBi64;
        *(_QWORD *)(a1 + 2320) = *a2;
        *(_QWORD *)(a1 + 2328) = v49;
        *(_DWORD *)(a1 + 2296) = 1;
        result = __b8(a1, 0i64);
      }
    }
LABEL_70:
    *(_DWORD *)(a1 + 2088) += 16 * v37;
    return result;
  }
  if( !*(_QWORD *)(a1 + 2432) )
    goto LABEL_13;
  v6 = *(unsigned int *)(a1 + 2452);
  v7 = *(_DWORD *)(a1 + 2452);
  if( !*(_DWORD *)(a1 + 2084) )
  {
    v7 = v6 ^ ((unsigned __int8)v6 ^ (unsigned __int8)(8 * v7)) & 0x20;
    *(_DWORD *)(a1 + 2452) = v7;
    goto LABEL_6;
  }
  result = (unsigned int)v6 ^ ((unsigned int)v6 >> 3);
  if( (((unsigned __int8)v6 ^ (unsigned __int8)((unsigned int)v6 >> 3)) & 4) != 0 )
  {
LABEL_13:
    *(_DWORD *)(a1 + 2084) = 0;
    return result;
  }
LABEL_6:
  if( (v7 & 4) == 0 )
    goto LABEL_14;
  v8 = *((_QWORD *)a2 + 1) & 0xFFFFFFFFFFFFF000ui64;
  for( j = ((a2[2] & 0xFFF) + (unsigned __int64)(unsigned int)a2[4] + 4095) >> 12; j; v8 += 4096i64 )
  {
    --j;
    result = (*(__int64(__fastcall **)(unsigned __int64, __int64, __int64))(a1 + 688))(v8, v6, a3);
    if( (_BYTE)result )
    {
      if( !*(_DWORD *)(a1 + 2296) )
      {
        *(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
        *(_QWORD *)(a1 + 2312) = (char *)a2 - 0x4C48B4211BBACBEBi64;
        *(_QWORD *)(a1 + 2320) = *a2;
        *(_QWORD *)(a1 + 2328) = v8;
        *(_DWORD *)(a1 + 2296) = 1;
        result = __b8(a1, 0i64);
      }
    }
    *(_DWORD *)(a1 + 2088) += 256;
  }
  return result;
}

Referenced by:

sub_1403DCCA0