sub_140A0E098

INT64 __fastcall sub_140A0E098(INT64 a1, UINT64 *a2, UINT64 a3, INT64 a4, INT64 a5, CHAR a6, INT64 *a7, UINT64 *a8){
  _BYTE *v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned int v11; 
  __int64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  __int64 v15; 
  int v16; 
  unsigned int v17; 
  __int64 v18; 
  int v19; 
  unsigned __int64 v20; 
  int v21; 
  int v22; 
  __int64 v24; 
  int v25; 
  _QWORD *v26; 
  __int64 v27; 
  UINT64 *v28; 
  UINT64 *v29; 
  int v30; 
  unsigned __int64 v31; 
  unsigned int v32; 
  __int64 v33; 
  UINT64 v34; 
  UINT64 v35; 
  signed __int64 v36; 
  __int64 v37; 
  unsigned __int64 v38; 
  __int64 v39; 
  bool v40; 
  unsigned __int64 i; 
  int v42; 
  _OWORD *v43; 
  __int64 v44; 
  unsigned __int8 CurrentIrql; 
  int v46; 
  unsigned int *v47; 
  unsigned __int64 v48; 
  _QWORD *v49; 
  __int64 v50; 
  _QWORD *v51; 
  unsigned __int64 v52; 
  UINT64 *v53; 
  int v54; 
  __int64 v55; 
  int v56; 
  unsigned int v57; 
  UINT64 *v58; 
  CHAR v59; 
  char *v60; 
  __int64 v61; 
  int v62; 
  int v63; 
  __int16 v64; 
  char *v65; 
  int v66; 
  signed __int64 v67; 
  __int64 v68; 
  __int64 v69; 
  __int64 *v70; 
  unsigned int v71; 
  __int64 *v72; 
  __int64 v73; 
  __int64 v74; 
  __int64 v75; 
  __int64 v76; 
  unsigned __int8 *v77; 
  int v78; 
  __int64 v79; 
  __int64 v80; 
  unsigned __int8 *v81; 
  int v82; 
  __int64 v83; 
  __int64 v84; 
  int v85; 
  unsigned int v86; 
  unsigned int v87; 
  __int64 v88; 
  unsigned int v89; 
  unsigned int v90; 
  int v91; 
  __int64 v92; 
  INT64 v93; 
  int v94; 
  __int64 v95; 
  unsigned __int64 v96; 
  char v97; 
  unsigned int v98; 
  unsigned __int8 v99; 
  unsigned __int64 v100; 
  unsigned __int64 v101; 
  unsigned __int64 v102; 
  int v103; 
  _QWORD *v104; 
  int v105; 
  char *v106; 
  unsigned __int64 v107; 
  unsigned __int64 v108; 
  unsigned int v109; 
  __int64 v110; 
  __int64 v111; 
  __int64 v112; 
  unsigned __int128 v113; 
  unsigned int v114; 
  unsigned __int64 v115; 
  __int64 v116; 
  unsigned __int64 j; 
  char *v118; 
  __int64 v119; 
  int v120; 
  unsigned int v121; 
  int v122; 
  unsigned __int64 v123; 
  __int64 v124; 
  CHAR v125; 
  unsigned int v126; 
  int *v127; 
  unsigned int *v128; 
  __int64 v129; 
  char *v130; 
  UINT64 *v131; 
  int v133; 
  v8 = *(_BYTE **)a1;
  v9 = (unsigned int)a3;
  v129 = (*(__int64(__fastcall **)(INT64))(*(_QWORD *)a1 + 504i64))(a4);
  if( !v129 )
    return 3221225595i64;
  v10 = v9 / 0xC;
  v11 = (_DWORD)a5 ? 12 : (a6 & 0x10) != 0 ? 43 : 1;
  v12 = *((unsigned int *)v8 + 505);
  v13 = 4 * v10;
  v14 = 4 * v10 + v12 + 48;
  if( v14 <= *((_DWORD *)v8 + 647) )
  {
    v15 = (__int64)v8;
    *((_DWORD *)v8 + 505) = v14;
  }
  else
  {
    v15 = sub_140A0EB30(v8, v14, *((unsigned int *)v8 + 585));
    if( !v15 )
      return 3221225626i64;
    v16 = *((_DWORD *)v8 + 612);
    if( (v16 & 4) == 0 )
    {
      v17 = *((_DWORD *)v8 + 505);
      v18 = *((_QWORD *)v8 + 249);
      v19 = (v16 & 0x20000000) != 0 ? *((_DWORD *)v8 + 585) : 0;
      if( v17 >= 8 )
      {
        v20 = (unsigned __int64)v17 >> 3;
        do
        {
          *(_QWORD *)v8 = 0i64;
          v17 -= 8;
          v8 += 8;
          --v20;
        }
        while( v20 );
      }
      for( ; v17; --v17 )
        *v8++ = 0;
      v21 = *(_DWORD *)(v15 + 2340);
      *(_DWORD *)(v15 + 2340) = v19;
      if( v19 == 3 )
      {
        (*(void(__fastcall **)(__int64))(v15 + 872))(v18);
      }
      else
      {
        v22 = 0;
        if( (*(_DWORD *)(v15 + 2448) & 0x10000000) == 0 )
          v22 = v19;
        if( v22 )
          (*(void(__fastcall **)(__int64, _QWORD))(v15 + 552))(v18 - 8, *(_QWORD *)(v18 - 8));
        else(*(void(__fastcall **)(__int64))(v15 + 256))(v18);
      }
      *(_DWORD *)(v15 + 2340) = v21;
    }
    *(_DWORD *)(v15 + 2448) &= ~4u;
  }
  ++*(_DWORD *)(v15 + 2060);
  v24 = v15 + v12;
  v25 = 48;
  v127 = (int *)(v15 + v12);
  v26 = (_QWORD *)(v15 + v12);
  v27 = 6i64;
  do
  {
    *v26 = 0i64;
    v25 -= 8;
    ++v26;
    --v27;
  }
  while( v27 );
  for( ; v25; --v25 )
  {
    *(_BYTE *)v26 = 0;
    v26 = (_QWORD *)((char *)v26 + 1);
  }
  *(_DWORD *)v24 = v11;
  v28 = a2;
  *(_QWORD *)(v24 + 8) = a2;
  v29 = a2;
  *(_DWORD *)(v24 + 16) = v9;
  *(_DWORD *)(v15 + 2088) += v9;
  v30 = *(_DWORD *)(v15 + 2068);
  if( v29 < (UINT64 *)((char *)v29 + v9) )
  {
    do
    {
      _mm_prefetchnta(v29);
      v29 += 8;
    }
    while( v29 < (UINT64 *)((char *)a2 + v9) );
  }
  v31 = *(_QWORD *)(v15 + 2072);
  v32 = (unsigned int)v9 >> 7;
  if( (unsigned int)v9 >> 7 )
  {
    do
    {
      v33 = 8i64;
      do
      {
        v34 = v31 ^ *v28;
        v35 = v28[1];
        v28 += 2;
        v31 = __ROL8__(__ROL8__(v34, v30) ^ v35, v30);
        --v33;
      }
      while( v33 );
      v36 = __ROL8__(*(_QWORD *)(v15 + 2072) ^ ((char *)v28 - (char *)a2), 17) ^ *(_QWORD *)(v15 + 2072) ^ ((char *)v28 - (char *)a2);
      v30 = ((unsigned __int8)((((unsigned __int64)v36 * (unsigned __int128)0x7010008004002001ui64) >> 64) ^ v36) ^ (unsigned __int8)v30) & 0x3F;
      if( !v30 )
        LOBYTE(v30) = 1;
      --v32;
    }
    while( v32 );
    LODWORD(v10) = v9 / 0xC;
  }
  v37 = v9 & 0x7F;
  if( (unsigned int)v37 >= 8 )
  {
    v38 = (v9 & 0x7F) >> 3;
    do
    {
      v31 = __ROL8__(*v28++ ^ v31, v30);
      v37 = (unsigned int)(v37 - 8);
      --v38;
    }
    while( v38 );
  }
  if( (_DWORD)v37 )
  {
    do
    {
      v39 = *(unsigned __int8 *)v28;
      v28 = (UINT64 *)((char *)v28 + 1);
      v31 = __ROL8__(v39 ^ v31, v30);
      v40 = (_DWORD)v37 == 1;
      v37 = (unsigned int)(v37 - 1);
    }
    while( !v40 );
  }
  for( i = v31; ; v31 = (unsigned int)i ^ (unsigned int)v31 )
  {
    i >>= 31;
    if( !i )
      break;
  }
  LODWORD(v31) = v31 & 0x7FFFFFFF;
  v42 = -1073741275;
  v127[5] = v31;
  *(_DWORD *)(v15 + 2088) += v9;
  v43 = v127 + 6;
  *(_QWORD *)a1 = v15;
  v44 = *(_QWORD *)(v15 + 1344);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  (*(void(__fastcall **)(__int64, __int64, unsigned __int64, UINT64 *))(v15 + 336))(v44, v37, v31, v28);
  v46 = 24;
  v47 = **(unsigned int ***)(v15 + 1552);
  v48 = (unsigned __int64)(v47 + 4);
  while( *(_QWORD *)(v48 + 8) != a4 )
  {
    v48 += 24i64;
    if( v48 >= (unsigned __int64)&v47[6 * *v47 + 4] )
      goto LABEL_50;
  }
  v42 = 0;
  *v43 = *(_OWORD *)v48;
  *((_QWORD *)v127 + 5) = *(_QWORD *)(v48 + 16);
LABEL_50:
  (*(void(__fastcall **)(_QWORD))(v15 + 400))(*(_QWORD *)(v15 + 1344));
  __writecr8(CurrentIrql);
  if( v42 < 0 )
  {
    v49 = v127 + 6;
    v50 = 3i64;
    do
    {
      *v49 = 0i64;
      v46 -= 8;
      ++v49;
      --v50;
    }
    while( v50 );
    for( ; v46; --v46 )
    {
      *(_BYTE *)v49 = 0;
      v49 = (_QWORD *)((char *)v49 + 1);
    }
    *(_QWORD *)v43 = 1i64;
  }
  v128 = (unsigned int *)(v127 + 12);
  v51 = v127 + 12;
  if( v13 >= 8 )
  {
    v52 = (unsigned __int64)v13 >> 3;
    do
    {
      *v51 = -1i64;
      v13 -= 8;
      ++v51;
      --v52;
    }
    while( v52 );
  }
  for( ; v13; --v13 )
  {
    *(_BYTE *)v51 = -1;
    v51 = (_QWORD *)((char *)v51 + 1);
  }
  v53 = a2;
  v54 = -1;
  v55 = (unsigned int)v10;
  v56 = 0;
  v133 = -1;
  v57 = 0;
  v121 = 0;
  v123 = 0i64;
  v58 = (UINT64 *)((char *)a2 + 12 * v55);
  v59 = -9;
  v131 = v58;
  if( (*(_DWORD *)(v15 + 2452) & 0x40) != 0 )
    v59 = a6;
  v125 = v59;
  if( a2 == v58 )
  {
    *(_DWORD *)a7 = 0;
    *(_DWORD *)a8 = 0;
    return 0i64;
  }
  v60 = (char *)(*(__int64(__fastcall **)(__int64, INT64, _QWORD))(v15 + 528))(v129, a4, *(unsigned int *)a2);
  v61 = v11;
  v124 = v11;
LABEL_168:
  v130 = v60;
  v118 = v60;
  if( !v60 )
    return 3221225595i64;
  v62 = 0;
  if( (*((_DWORD *)v60 + 9) & 0x2000000) != 0
    || (v63 = *(_DWORD *)v60, *(_DWORD *)v60 == 1414090313) && *((_DWORD *)v60 + 1) == 1195525195
    || v63 == 1162297680 && ((v64 = *((_WORD *)v60 + 2), v64 == 30839) || v64 == 29303 || v64 == 30583)
    || v63 == 1095914053 && *((_WORD *)v118 + 2) == 16724 )
  {
LABEL_94:
    v62 = 1;
  }
  else
  {
    v65 = *(char **)(v15 + 2352);
    v66 = 7;
    v67 = v118 - v65;
    while( 1 )
    {
      v68 = (unsigned __int8)v65[v67];
      v69 = (unsigned __int8)*v65++;
      if( v68 != v69 )
        break;
      if( !--v66 )
        goto LABEL_94;
    }
    v70 = *(__int64 **)(v15 + 2360);
    v71 = 8;
    v72 = (__int64 *)v118;
    while( 1 )
    {
      v73 = *v72++;
      v74 = *v70++;
      if( v73 != v74 )
        break;
      v71 -= 8;
      if( v71 < 8 )
      {
        if( !v71 )
          goto LABEL_94;
        while( 1 )
        {
          v75 = *(unsigned __int8 *)v72;
          v72 = (__int64 *)((char *)v72 + 1);
          v76 = *(unsigned __int8 *)v70;
          v70 = (__int64 *)((char *)v70 + 1);
          if( v75 != v76 )
            goto LABEL_87;
          if( !--v71 )
            goto LABEL_94;
        }
      }
    }
LABEL_87:
    v77 = *(unsigned __int8 **)(v15 + 2368);
    v78 = 4;
    while( 1 )
    {
      v79 = (unsigned __int8)v118[(_QWORD)v77 - *(_QWORD *)(v15 + 2368)];
      v80 = *v77++;
      if( v79 != v80 )
        break;
      if( !--v78 )
        goto LABEL_94;
    }
    v81 = *(unsigned __int8 **)(v15 + 2376);
    v82 = 6;
    while( 1 )
    {
      v83 = (unsigned __int8)v118[(_QWORD)v81 - *(_QWORD *)(v15 + 2376)];
      v84 = *v81++;
      if( v83 != v84 )
        break;
      if( !--v82 )
        goto LABEL_94;
    }
  }
  v85 = *((_DWORD *)v118 + 9);
  if( v85 < 0 )
    v62 = 1;
  v122 = v62;
  if( v61 == 43 )
  {
    if( (v85 & 0x20000000) == 0 )
      v62 = 1;
    v122 = v62;
  }
  if( v62 && *(_DWORD *)v118 == 1414090313 && *((_DWORD *)v118 + 1) == 1195525195 )
  {
    if( (*(_DWORD *)(v15 + 2452) & 0x2000) != 0 )
      v62 = 0;
    v122 = v62;
  }
  v86 = *((_DWORD *)v118 + 4);
  v87 = *((_DWORD *)v118 + 3);
  if( v86 <= *((_DWORD *)v118 + 2) )
    v86 = *((_DWORD *)v118 + 2);
  v88 = v87 + v86;
  v126 = v88;
  while( 1 )
  {
    v89 = *((_DWORD *)v53 + 2);
    v90 = v54;
    if( (v89 & 1) == 0 )
    {
      v91 = *((_DWORD *)v53 + 2);
      if( v89 >= v90 )
        v91 = v90;
      v133 = v91;
      if( v89 > v57 )
      {
        v121 = *((_DWORD *)v53 + 2);
        v133 = v91;
      }
    }
    v92 = *(unsigned int *)v53;
    v93 = a4;
    v94 = v62;
    v95 = (unsigned int)(*((_DWORD *)v53 + 1) - v92);
    v96 = a4 + v92;
    if( v124 != 43 )
      goto LABEL_127;
    if( v62 || v87 - (unsigned int)v92 < 6 || (unsigned int)(v92 - v56) < 6 )
    {
LABEL_128:
      v98 = 0x80000000;
      goto LABEL_164;
    }
    v97 = *(_BYTE *)(v96 - 1);
    if( *(_BYTE *)(v96 - 6) != 76
      || *(_BYTE *)(v96 - 5) != 0x87
      || *(_BYTE *)(v96 - 4)
      || *(_BYTE *)(v96 - 3) != 0x98
      || *(_BYTE *)(v96 - 2) != 0xC3
      || v97 != -112 && v97 != -15 )
    {
      v94 = 1;
LABEL_127:
      if( v94 )
        goto LABEL_128;
    }
    if( (v125 & 8) != 0
      && ((((v96 & 0xFFF) + v95 + 4095) & 0xFFFFFFFFFFFFF000ui64) != 4096 || (v96 & 0xFFFFFFFFFFFFF000ui64) != v123) )
    {
      if( (_DWORD)v95 && (*(_DWORD *)(v15 + 2452) & 0x40) != 0 )
      {
        v99 = KeGetCurrentIrql();
        __writecr8(2ui64);
        v100 = v96 & 0xFFFFFFFFFFFFF000ui64;
        v101 = (v96 & 0xFFFFFFFFFFFFF000ui64) - 1;
        while( 2 )
        {
          v102 = v99;
          while( 1 )
          {
            v103 = (*(__int64(__fastcall **)(unsigned __int64, __int64))(v15 + 1128))(v100, 1i64);
            if( v103 != -1073741267 )
              break;
            if( v99 > 1u )
              goto LABEL_140;
            v102 = v99;
            __writecr8(v99);
            KeGetCurrentIrql();
            __writecr8(2ui64);
          }
          if( v103 < 0 )
          {
            __writecr8(v102);
            goto LABEL_143;
          }
LABEL_140:
          v100 += 4096i64;
          v101 += 4096i64;
          if( v101 != ((v96 + v95 - 1) | 0xFFF) )
            continue;
          break;
        }
        __writecr8(v102);
      }
      else
      {
LABEL_143:
        if( !*(_DWORD *)(v15 + 2296) )
        {
          *(_QWORD *)(v15 + 2304) = v15 - 0x5C5FC0A76E374B18i64;
          *(_QWORD *)(v15 + 2312) = (char *)v127 - 0x4C48B4211BBACBEBi64;
          *(_QWORD *)(v15 + 2320) = *v127;
          *(_QWORD *)(v15 + 2328) = v96;
          *(_DWORD *)(v15 + 2296) = 1;
          __b8(v15, 0i64);
        }
      }
      v53 = a2;
      v123 = (v96 + (unsigned int)v95) & 0xFFFFFFFFFFFFF000ui64;
    }
    *(_DWORD *)(v15 + 2088) += v95;
    v104 = (_QWORD *)v96;
    v105 = *(_DWORD *)(v15 + 2068);
    v106 = (char *)v96;
    v107 = v96 + (unsigned int)v95;
    if( v96 < v107 )
    {
      do
      {
        _mm_prefetchnta(v106);
        v106 += 64;
      }
      while( (unsigned __int64)v106 < v107 );
    }
    v108 = *(_QWORD *)(v15 + 2072);
    v109 = (unsigned int)v95 >> 7;
    if( (unsigned int)v95 >> 7 )
    {
      do
      {
        v110 = 8i64;
        do
        {
          v111 = v108 ^ *v104;
          v112 = v104[1];
          v104 += 2;
          v108 = __ROL8__(__ROL8__(v111, v105) ^ v112, v105);
          --v110;
        }
        while( v110 );
        v113 = (__ROL8__(*(_QWORD *)(v15 + 2072) ^ ((unsigned __int64)v104 - v96), 17) ^ *(_QWORD *)(v15 + 2072) ^ ((unsigned __int64)v104 - v96))
             * (unsigned __int128)0x7010008004002001ui64;
        v105 = (BYTE8(v113) ^ (unsigned __int8)(v113 ^ v105)) & 0x3F;
        if( !v105 )
          LOBYTE(v105) = 1;
        --v109;
      }
      while( v109 );
      v53 = a2;
    }
    v114 = v95 & 0x7F;
    if( v114 >= 8 )
    {
      v115 = (unsigned __int64)v114 >> 3;
      do
      {
        v108 = __ROL8__(*v104++ ^ v108, v105);
        v114 -= 8;
        --v115;
      }
      while( v115 );
    }
    for( ; v114; --v114 )
    {
      v116 = *(unsigned __int8 *)v104;
      v104 = (_QWORD *)((char *)v104 + 1);
      v108 = __ROL8__(v116 ^ v108, v105);
    }
    for( j = v108 >> 31; j; j >>= 31 )
      LODWORD(v108) = j ^ v108;
    v118 = v130;
    v98 = v108 & 0x7FFFFFFF;
    v62 = v122;
    v88 = v126;
    v93 = a4;
LABEL_164:
    *v128 = v98;
    v56 = *((_DWORD *)v53 + 1);
    v53 = (UINT64 *)((char *)v53 + 12);
    a2 = v53;
    if( v53 == v131 )
      break;
    v119 = *(unsigned int *)v53;
    v87 = *((_DWORD *)v118 + 3);
    ++v128;
    if( (unsigned int)v119 >= v87 )
    {
      v54 = v133;
      v57 = v121;
      if( *((_DWORD *)v53 + 1) <= (unsigned int)v88 )
        continue;
    }
    v60 = (char *)(*(__int64(__fastcall **)(__int64, INT64, __int64, __int64))(v15 + 528))(v129, v93, v119, v88);
    v54 = v133;
    v57 = v121;
    v61 = v124;
    goto LABEL_168;
  }
  v120 = v133;
  if( v133 == -1 )
    v120 = -(v121 != 0);
  *(_DWORD *)a7 = v120;
  *(_DWORD *)a8 = v121;
  return 0i64;
}

Referenced by:

Argument1
sub_140A0C0FC