sub_140A1BFE4

__int64 __fastcall sub_140A1BFE4(__int64 a1, char *a2, char a3){
  _BYTE *v3; 
  __int64 v5; 
  int v6; 
  __int64 v7; 
  unsigned __int8 CurrentIrql; 
  int v9; 
  unsigned int *v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  int v13; 
  __int128 *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  int v18; 
  unsigned int v19; 
  unsigned int v20; 
  int v21; 
  _BYTE *v22; 
  int v23; 
  unsigned int v24; 
  __int64 v25; 
  int v26; 
  unsigned __int64 v27; 
  int v28; 
  int v29; 
  int v30; 
  __int64 v31; 
  _QWORD *v32; 
  __int64 v33; 
  unsigned __int64 v34; 
  unsigned __int64 i; 
  _QWORD *v36; 
  __int64 v37; 
  __int128 *v38; 
  char v39; 
  unsigned __int64 v40; 
  _BOOL4 v41; 
  _QWORD *v42; 
  unsigned __int64 v43; 
  int v44; 
  __int64 v45; 
  int v46; 
  __int16 v47; 
  unsigned __int8 *v48; 
  int v49; 
  __int64 v50; 
  __int64 v51; 
  __int64 v52; 
  __int64 *v53; 
  unsigned int v54; 
  __int64 *v55; 
  __int64 v56; 
  __int64 v57; 
  __int64 v58; 
  __int64 v59; 
  unsigned __int8 *v60; 
  int v61; 
  __int64 v62; 
  __int64 v63; 
  unsigned __int8 *v64; 
  int v65; 
  __int64 v66; 
  __int64 v67; 
  bool v68; 
  unsigned int v69; 
  unsigned int v70; 
  NTSTATUS v71; 
  char *v72; 
  __int64 v73; 
  __int64 v74; 
  _BOOL4 v75; 
  char *v76; 
  unsigned int v77; 
  _DWORD *v78; 
  int v79; 
  int v80; 
  char *v81; 
  int v82; 
  __int16 v83; 
  char *v84; 
  int v85; 
  signed __int64 v86; 
  __int64 v87; 
  __int64 v88; 
  __int64 *v89; 
  unsigned int v90; 
  __int64 *v91; 
  __int64 v92; 
  __int64 v93; 
  __int64 v94; 
  __int64 v95; 
  char *v96; 
  int v97; 
  __int64 v98; 
  __int64 v99; 
  char *v100; 
  int v101; 
  signed __int64 v102; 
  __int64 v103; 
  __int64 v104; 
  unsigned int v105; 
  NTSTATUS v106; 
  __int64 *v107; 
  int v108; 
  unsigned int *v109; 
  unsigned __int64 v110; 
  __int64 v111; 
  __int64 v112; 
  __int64 v113; 
  __int64 v114; 
  char **v115; 
  unsigned int v116; 
  __int64 v117; 
  unsigned int v118; 
  char *v119; 
  char *v120; 
  char *v121; 
  char *v122; 
  int v123; 
  char *j; 
  __int64 v125; 
  unsigned __int64 v126; 
  __int64 v127; 
  __int64 v128; 
  unsigned __int64 v129; 
  unsigned __int64 v130; 
  unsigned __int64 v131; 
  __int64 v132; 
  char *v133; 
  __int64 v134; 
  _DWORD *v135; 
  _QWORD *v136; 
  char *v137; 
  int v138; 
  char *v139; 
  _QWORD *v140; 
  __int64 v141; 
  char v142; 
  int v143; 
  __int64 k; 
  __int64 v145; 
  __int64 v146; 
  bool v147; 
  __int64 v148; 
  int v149; 
  int v150; 
  unsigned int v151; 
  __int64 v152; 
  int v153; 
  unsigned int v154; 
  __int64 v155; 
  int v156; 
  unsigned __int64 v157; 
  int v158; 
  int v159; 
  __int64 v161; 
  int v162; 
  _QWORD *v163; 
  __int64 v164; 
  _QWORD *v165; 
  int v166; 
  char *v167; 
  unsigned __int64 v168; 
  unsigned int v169; 
  __int64 v170; 
  __int64 v171; 
  unsigned __int128 v172; 
  unsigned int v173; 
  unsigned __int64 v174; 
  __int64 v175; 
  unsigned __int64 m; 
  int v177; 
  char *v178; 
  int v179; 
  __int64 v180; 
  char *v181; 
  unsigned int v182; 
  unsigned int v183; 
  __int64 v184; 
  unsigned __int64 v185; 
  unsigned __int64 v186; 
  __int64 v187; 
  __int64 v188; 
  _BYTE *v189; 
  __int64 v190; 
  char **v191; 
  __int128 v192; 
  __int64 v193; 
  unsigned __int8 *v194; 
  __int64 *v195; 
  unsigned __int8 *v196; 
  unsigned __int8 *v197; 
  char *v198; 
  __int64 *v199; 
  char *v200; 
  char *v201; 
  __int64 v202; 
  __int64 v203; 
  __int64 v204; 
  __int64 v205; 
  __int64 v206; 
  char v207[104]; 
  char *v209; 
  int v211; 
  unsigned __int16 v212; 
  unsigned int v213; 
  unsigned __int64 v214; 
  int v215; 

  v209 = a2;
  v3 = *(_BYTE **)a1;
  v5 = (*(__int64(__fastcall **)(char *))(*(_QWORD *)a1 + 504i64))(a2);
  if( v5 )
  {
    LODWORD(v184) = (*((__int64(__fastcall **)(char *))v3 + 85))(a2);
    v212 = *(_WORD *)(v5 + 6);
    if( v212 && *(_DWORD *)(v5 + 56) >= 0x1000u && ((unsigned __int16)a2 & 0xFFF) == 0 )
    {
      v6 = -1073741275;
      v7 = *((_QWORD *)v3 + 168);
      v183 = *(_DWORD *)(v5 + 84);
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(0xFui64);
      (*((void(__fastcall **)(__int64))v3 + 42))(v7);
      v9 = 24;
      v10 = (unsigned int *)**((_QWORD **)v3 + 194);
      v11 = (unsigned __int64)(v10 + 4);
      while( *(char **)(v11 + 8) != a2 )
      {
        v11 += 24i64;
        if( v11 >= (unsigned __int64)&v10[6 * *v10 + 4] )
          goto LABEL_10;
      }
      v6 = 0;
      v12 = *(_QWORD *)(v11 + 16);
      v192 = *(_OWORD *)v11;
      v193 = v12;
LABEL_10:
      (*((void(__fastcall **)(_QWORD))v3 + 50))(*((_QWORD *)v3 + 168));
      __writecr8(CurrentIrql);
      if( v6 >= 0 )
      {
        v16 = (unsigned int)v193;
      }
      else
      {
        v13 = 24;
        v14 = &v192;
        v15 = 3i64;
        do
        {
          *(_QWORD *)v14 = 0i64;
          v13 -= 8;
          v14 = (__int128 *)((char *)v14 + 8);
          --v15;
        }
        while( v15 );
        for( ; v13; --v13 )
        {
          *(_BYTE *)v14 = 0;
          v14 = (__int128 *)((char *)v14 + 1);
        }
        v16 = *(unsigned int *)(v5 + 80);
        LODWORD(v193) = *(_DWORD *)(v5 + 80);
        *((_QWORD *)&v192 + 1) = a2;
        *(_QWORD *)&v192 = 1i64;
      }
      v17 = *((unsigned int *)v3 + 505);
      v18 = *((_DWORD *)v3 + 585);
      v186 = ((unsigned __int64)((unsigned __int16)a2 & 0xFFF) + 4095 + v16) >> 12;
      v19 = 20 * v186;
      v20 = 20 * v186 + v17 + 48;
      v21 = ((_DWORD)v184 != 0) + 33;
      v177 = v21;
      if( v20 <= *((_DWORD *)v3 + 647) )
      {
        v22 = v3;
        v189 = v3;
        *((_DWORD *)v3 + 505) = v20;
      }
      else
      {
        v189 = (_BYTE *)sub_140A0EB30(v3, v20, v18);
        v22 = v189;
        if( !v189 )
          return 3221225626i64;
        v23 = *((_DWORD *)v3 + 612);
        if( (v23 & 4) == 0 )
        {
          v24 = *((_DWORD *)v3 + 505);
          v25 = *((_QWORD *)v3 + 249);
          v26 = (v23 & 0x20000000) != 0 ? *((_DWORD *)v3 + 585) : 0;
          if( v24 >= 8 )
          {
            v27 = (unsigned __int64)v24 >> 3;
            do
            {
              *(_QWORD *)v3 = 0i64;
              v24 -= 8;
              v3 += 8;
              --v27;
            }
            while( v27 );
          }
          for( ; v24; --v24 )
            *v3++ = 0;
          v28 = *((_DWORD *)v22 + 585);
          *((_DWORD *)v22 + 585) = v26;
          if( v26 == 3 )
          {
            (*((void(__fastcall **)(__int64))v22 + 109))(v25);
          }
          else
          {
            v29 = 0;
            if( (*((_DWORD *)v22 + 612) & 0x10000000) == 0 )
              v29 = v26;
            if( v29 )
              (*((void(__fastcall **)(__int64, _QWORD))v22 + 69))(v25 - 8, *(_QWORD *)(v25 - 8));
            else(*((void(__fastcall **)(__int64))v22 + 32))(v25);
          }
          *((_DWORD *)v22 + 585) = v28;
        }
        *((_DWORD *)v22 + 612) &= ~4u;
        v21 = v177;
      }
      ++*((_DWORD *)v22 + 515);
      v30 = 48;
      v31 = (__int64)&v22[v17];
      v202 = v31;
      v32 = (_QWORD *)v31;
      v33 = 6i64;
      do
      {
        *v32 = 0i64;
        v30 -= 8;
        ++v32;
        --v33;
      }
      while( v33 );
      for( ; v30; --v30 )
      {
        *(_BYTE *)v32 = 0;
        v32 = (_QWORD *)((char *)v32 + 1);
      }
      *(_DWORD *)v31 = v21;
      *(_QWORD *)(v31 + 8) = 0i64;
      *(_DWORD *)(v31 + 16) = 0;
      v34 = *((_QWORD *)v22 + 259);
      for( i = v34; ; LODWORD(v34) = i ^ v34 )
      {
        i >>= 31;
        if( !i )
          break;
      }
      v36 = (_QWORD *)(v31 + 24);
      v203 = v31;
      *(_DWORD *)(v31 + 20) = v34 & 0x7FFFFFFF;
      v37 = 3i64;
      v38 = &v192;
      *(_QWORD *)a1 = v22;
      do
      {
        v9 -= 8;
        *v36 = *(_QWORD *)v38;
        v38 = (__int128 *)((char *)v38 + 8);
        ++v36;
        --v37;
      }
      while( v37 );
      for( ; v9; --v9 )
      {
        v39 = *(_BYTE *)v38;
        v38 = (__int128 *)((char *)v38 + 1);
        *(_BYTE *)v36 = v39;
        v36 = (_QWORD *)((char *)v36 + 1);
      }
      LOBYTE(v36) = 1;
      v40 = (*((__int64(__fastcall **)(char *, _QWORD *, __int64, unsigned int *))v22 + 62))(v209, v36, 12i64, &v182);
      v185 = v40;
      v182 &= -(v40 != 0);
      v211 = a3 & 1;
      v41 = 0;
      if( !v211 )
      {
        v40 = 0i64;
        v182 = 0;
        v185 = 0i64;
      }
      v190 = v31 + 48;
      v180 = v31 + 48;
      v187 = v31 + 48 + 20i64 * (unsigned int)v186;
      v42 = (_QWORD *)(v31 + 48);
      if( v19 >= 8 )
      {
        v43 = (unsigned __int64)v19 >> 3;
        do
        {
          *v42 = -1i64;
          v19 -= 8;
          ++v42;
          --v43;
        }
        while( v43 );
      }
      for( ; v19; --v19 )
      {
        *(_BYTE *)v42 = -1;
        v42 = (_QWORD *)((char *)v42 + 1);
      }
      v44 = 0;
      v45 = v5 + *(unsigned __int16 *)(v5 + 20) + 24i64;
      v186 = v45 + 40i64 * v212;
      if( (*(_DWORD *)(v45 + 36) & 0x2000000) != 0
        || (v46 = *(_DWORD *)v45, *(_DWORD *)v45 == 1414090313) && *(_DWORD *)(v45 + 4) == 1195525195
        || v46 == 1162297680 && ((v47 = *(_WORD *)(v45 + 4), v47 == 30839) || v47 == 29303 || v47 == 30583)
        || v46 == 1095914053 && *(_WORD *)(v45 + 4) == 16724 )
      {
LABEL_81:
        v44 = 1;
      }
      else
      {
        v48 = (unsigned __int8 *)*((_QWORD *)v22 + 294);
        v49 = 7;
        v195 = (__int64 *)*((_QWORD *)v22 + 295);
        v50 = v45 - (_QWORD)v48;
        v196 = (unsigned __int8 *)*((_QWORD *)v22 + 296);
        v197 = (unsigned __int8 *)*((_QWORD *)v22 + 297);
        v194 = v48;
        while( 1 )
        {
          v51 = v48[v50];
          v52 = *v48++;
          if( v51 != v52 )
            break;
          if( !--v49 )
          {
LABEL_80:
            v40 = v185;
            goto LABEL_81;
          }
        }
        v53 = v195;
        v54 = 8;
        v55 = (__int64 *)v45;
        while( 1 )
        {
          v56 = *v55++;
          v57 = *v53++;
          if( v56 != v57 )
            break;
          v54 -= 8;
          if( v54 < 8 )
          {
            if( !v54 )
              goto LABEL_80;
            while( 1 )
            {
              v58 = *(unsigned __int8 *)v55;
              v55 = (__int64 *)((char *)v55 + 1);
              v59 = *(unsigned __int8 *)v53;
              v53 = (__int64 *)((char *)v53 + 1);
              if( v58 != v59 )
                goto LABEL_73;
              if( !--v54 )
                goto LABEL_80;
            }
          }
        }
LABEL_73:
        v60 = v196;
        v61 = 4;
        while( 1 )
        {
          v62 = v60[v45 - (_QWORD)v196];
          v63 = *v60++;
          if( v62 != v63 )
            break;
          if( !--v61 )
            goto LABEL_80;
        }
        v64 = v197;
        v65 = 6;
        while( 1 )
        {
          v66 = v64[v45 - (_QWORD)v197];
          v67 = *v64++;
          if( v66 != v67 )
            break;
          if( !--v65 )
            goto LABEL_80;
        }
        v40 = v185;
      }
      if( *(int *)(v45 + 36) < 0 )
        v44 = 1;
      v68 = v44 == 0;
      if( v44 )
      {
        if( *(_DWORD *)v45 == 1414090313
          && *(_DWORD *)(v45 + 4) == 1195525195
          && (*((_DWORD *)v22 + 613) & 0x2000) != 0 )
        {
          v44 = 0;
        }
        v68 = v44 == 0;
      }
      v69 = *(_DWORD *)(v45 + 16);
      LOBYTE(v41) = v68;
      v213 = *(_DWORD *)(v45 + 12);
      if( v69 <= *(_DWORD *)(v45 + 8) )
        v69 = *(_DWORD *)(v45 + 8);
      v70 = (v69 + *(_DWORD *)(v45 + 12) + 4095) & 0xFFFFF000;
      v71 = MmImageSectionPagable((_IMAGE_SECTION_HEADER *)v45);
      v72 = v209;
      v73 = v180;
      v74 = v187;
      v75 = v71 != 0;
      v76 = v209;
      v178 = v209;
      v77 = 0;
      if( v180 != v187 )
      {
        v78 = (_DWORD *)(v45 + 4);
        while( 1 )
        {
          if( v77 < v213 )
          {
            if( v77 < v183 )
            {
LABEL_141:
              v107 = (__int64 *)&v185;
              v108 = 0;
              v109 = &v182;
              while( 1 )
              {
                v110 = *v107;
                if( *v109 )
                {
                  if( (unsigned __int64)v178 >= v110 && (unsigned __int64)v178 <= v110 + *v109 - 1i64 )
                    break;
                }
                ++v108;
                ++v109;
                ++v107;
                if( v108 )
                {
                  if( v77 >= v213 && v75 )
                  {
                    v111 = v180;
                  }
                  else
                  {
                    v111 = v180;
                    *(_DWORD *)(v180 + 16) &= ~0x80000000;
                  }
                  *(_BYTE *)(v111 + 15) &= ~0x80u;
                  break;
                }
              }
              v73 = v180;
              v76 = v178;
              v74 = v187;
            }
          }
          else
          {
            if( v77 >= v70 )
            {
              if( v78 + 9 == (_DWORD *)v186 || v77 < v78[12] )
              {
                v76 = v178;
                goto LABEL_153;
              }
              v79 = v78[18];
              v78 += 10;
              v80 = 0;
              if( (v79 & 0x2000000) != 0
                || (v81 = (char *)(v78 - 1), v82 = *(v78 - 1), v82 == 1414090313) && *v78 == 1195525195
                || v82 == 1162297680 && ((v83 = *(_WORD *)v78, *(_WORD *)v78 == 30839) || v83 == 29303 || v83 == 30583)
                || v82 == 1095914053 && *(_WORD *)v78 == 16724 )
              {
                v80 = 1;
              }
              else
              {
                v84 = (char *)*((_QWORD *)v22 + 294);
                v85 = 7;
                v199 = (__int64 *)*((_QWORD *)v22 + 295);
                v86 = v81 - v84;
                v200 = (char *)*((_QWORD *)v22 + 296);
                v201 = (char *)*((_QWORD *)v22 + 297);
                v198 = v84;
                while( 1 )
                {
                  v87 = (unsigned __int8)v84[v86];
                  v88 = (unsigned __int8)*v84++;
                  if( v87 != v88 )
                    break;
                  if( !--v85 )
                  {
LABEL_126:
                    v80 = 1;
                    goto LABEL_127;
                  }
                }
                v89 = v199;
                v90 = 8;
                v91 = (__int64 *)(v78 - 1);
                while( 1 )
                {
                  v92 = *v91++;
                  v93 = *v89++;
                  if( v92 != v93 )
                    break;
                  v90 -= 8;
                  if( v90 < 8 )
                  {
                    if( !v90 )
                      goto LABEL_126;
                    while( 1 )
                    {
                      v94 = *(unsigned __int8 *)v91;
                      v91 = (__int64 *)((char *)v91 + 1);
                      v95 = *(unsigned __int8 *)v89;
                      v89 = (__int64 *)((char *)v89 + 1);
                      if( v94 != v95 )
                        goto LABEL_119;
                      if( !--v90 )
                        goto LABEL_126;
                    }
                  }
                }
LABEL_119:
                v96 = v200;
                v97 = 4;
                while( 1 )
                {
                  v98 = (unsigned __int8)v96[v81 - v200];
                  v99 = (unsigned __int8)*v96++;
                  if( v98 != v99 )
                    break;
                  if( !--v97 )
                    goto LABEL_126;
                }
                v100 = v201;
                v101 = 6;
                v102 = v81 - v201;
                while( 1 )
                {
                  v103 = (unsigned __int8)v100[v102];
                  v104 = (unsigned __int8)*v100++;
                  if( v103 != v104 )
                    break;
                  if( !--v101 )
                    goto LABEL_126;
                }
              }
LABEL_127:
              if( (int)v78[8] < 0 )
                v80 = 1;
              if( v80 && *(v78 - 1) == 1414090313 && *v78 == 1195525195 && (*((_DWORD *)v22 + 613) & 0x2000) != 0 )
                v80 = 0;
              v105 = v78[3];
              v41 = v80 == 0;
              if( v105 <= v78[1] )
                v105 = v78[1];
              v70 = (v105 + 4095 + v78[2]) & 0xFFFFF000;
              v106 = MmImageSectionPagable((_IMAGE_SECTION_HEADER *)(v78 - 1));
              v73 = v180;
              v74 = v187;
              v68 = v106 == 0;
              v76 = v178;
              v75 = !v68;
            }
            if( v41 )
              goto LABEL_141;
          }
LABEL_153:
          v76 += 4096;
          v73 += 20i64;
          v77 += 4096;
          v178 = v76;
          v180 = v73;
          if( v73 == v74 )
          {
            v40 = v185;
            v72 = v209;
            break;
          }
        }
      }
      v112 = v190;
      if( v190 != v74 )
      {
        do
        {
          LODWORD(v113) = 0;
          if( v112 != v74 )
          {
            v114 = v112;
            do
            {
              if( *(char *)(v114 + 15) < 0 )
                break;
              v113 = (unsigned int)(v113 + 1);
              v114 = v112 + 20 * v113;
            }
            while( v114 != v74 );
            v179 = v113;
            if( (_DWORD)v113 )
            {
              v115 = (char **)*((_QWORD *)v22 + 337);
              v116 = v113;
              v183 = v113;
              v191 = v115;
              v186 = v112;
              v181 = v72;
              do
              {
                v117 = 8i64;
                v118 = 0;
                if( v116 < 8 )
                  v117 = v116;
                v119 = v181;
                v120 = v207;
                do
                {
                  v115[1] = (char *)4096;
                  v121 = &v119[4096 * v118];
                  *v115 = v121;
                  v122 = v121;
                  *((_DWORD *)v22 + 522) += 4096;
                  v123 = *((_DWORD *)v22 + 517);
                  v214 = *((_QWORD *)v22 + 259);
                  for( j = v121; j < v121 + 4096; j += 64 )
                    _mm_prefetchnta(j);
                  v125 = *((_QWORD *)v22 + 259);
                  v126 = v214;
                  v215 = 32;
                  do
                  {
                    v127 = 8i64;
                    do
                    {
                      v128 = *((_QWORD *)v122 + 1) ^ __ROL8__(*(_QWORD *)v122 ^ v126, v123);
                      v122 += 16;
                      v126 = __ROL8__(v128, v123);
                      --v127;
                    }
                    while( v127 );
                    v129 = __ROL8__(v125 ^ (v122 - v121), 17) ^ v125 ^ (v122 - v121);
                    v204 = (v129 * (unsigned __int128)0x7010008004002001ui64) >> 64;
                    v123 = ((unsigned __int8)(v204 ^ v129) ^ (unsigned __int8)v123) & 0x3F;
                    if( !v123 )
                      LOBYTE(v123) = 1;
                    --v215;
                  }
                  while( v215 );
                  v22 = v189;
                  v130 = v126;
                  v119 = v181;
                  while( 1 )
                  {
                    v130 >>= 31;
                    if( !v130 )
                      break;
                    LODWORD(v126) = v130 ^ v126;
                  }
                  ++v118;
                  *(_DWORD *)v120 = v126 & 0x7FFFFFFF;
                  v115 += 6;
                  v120 += 4;
                }
                while( v118 < (unsigned int)v117 );
                v131 = v186;
                v132 = (__int64)v191;
                sub_1403E933C((__int64)v22, (__int64)v191, v117);
                v133 = v207;
                v134 = (unsigned int)v117;
                v135 = (_DWORD *)(v131 + 16);
                v136 = (_QWORD *)v131;
                v137 = (char *)(v132 + 16);
                do
                {
                  v138 = 16;
                  v139 = v137;
                  v140 = v136;
                  v141 = 2i64;
                  do
                  {
                    v138 -= 8;
                    *v140 = *(_QWORD *)v139;
                    v139 += 8;
                    ++v140;
                    --v141;
                  }
                  while( v141 );
                  for( ; v138; --v138 )
                  {
                    v142 = *v139++;
                    *(_BYTE *)v140 = v142;
                    v140 = (_QWORD *)((char *)v140 + 1);
                  }
                  v137 += 48;
                  v136 = (_QWORD *)((char *)v136 + 20);
                  v143 = (*(_DWORD *)v133 ^ *v135) & 0x7FFFFFFF;
                  v133 += 4;
                  *v135 ^= v143;
                  v135 += 5;
                  --v134;
                }
                while( v134 );
                v22 = v189;
                v115 = v191;
                v181 += (unsigned int)((_DWORD)v117 << 12);
                v116 = v183 - v117;
                v186 = v131 + 20 * v117;
                *((_DWORD *)v189 + 522) += (_DWORD)v117 << 15;
                v183 = v116;
              }
              while( v116 );
              LODWORD(v113) = v179;
              v112 = v190;
              v74 = v187;
            }
          }
          for( k = 5i64 * (unsigned int)v113; ; k = 5 * v113 )
          {
            v145 = v112 + 4 * k;
            if( v145 == v74 || *(char *)(v145 + 15) >= 0 )
              break;
            v113 = (unsigned int)(v113 + 1);
          }
          v72 = &v209[(_DWORD)v113 << 12];
          v209 = v72;
          v112 += 20i64 * (unsigned int)v113;
          v190 = v112;
        }
        while( v112 != v74 );
        v40 = v185;
      }
      if( !v211 )
        return 0i64;
      v146 = v182;
      if( !v182 )
        return 0i64;
      v147 = (_DWORD)v184 != 0;
      LODWORD(v184) = -(int)v184;
      v148 = *((unsigned int *)v22 + 505);
      v149 = *((_DWORD *)v22 + 585);
      v205 = 0i64;
      v150 = v147 + 13;
      v151 = v148 + 48;
      if( (unsigned int)(v148 + 48) <= *((_DWORD *)v22 + 647) )
      {
        v152 = (__int64)v22;
        *((_DWORD *)v22 + 505) = v151;
LABEL_212:
        ++*(_DWORD *)(v152 + 2060);
        v161 = v152 + v148;
        v162 = 48;
        v206 = v152 + v148;
        v163 = (_QWORD *)(v152 + v148);
        v164 = 6i64;
        do
        {
          *v163 = 0i64;
          v162 -= 8;
          ++v163;
          --v164;
        }
        while( v164 );
        for( ; v162; --v162 )
        {
          *(_BYTE *)v163 = 0;
          v163 = (_QWORD *)((char *)v163 + 1);
        }
        *(_DWORD *)v161 = v150;
        *(_QWORD *)(v161 + 8) = v40;
        v165 = (_QWORD *)v40;
        *(_DWORD *)(v161 + 16) = v146;
        *(_DWORD *)(v152 + 2088) += v146;
        v166 = *(_DWORD *)(v152 + 2068);
        if( v40 < v40 + v146 )
        {
          v167 = (char *)v40;
          do
          {
            _mm_prefetchnta(v167);
            v167 += 64;
          }
          while( (unsigned __int64)v167 < v40 + v146 );
        }
        v168 = *(_QWORD *)(v152 + 2072);
        v169 = (unsigned int)v146 >> 7;
        if( (unsigned int)v146 >> 7 )
        {
          do
          {
            v170 = 8i64;
            do
            {
              v171 = v165[1] ^ __ROL8__(*v165 ^ v168, v166);
              v165 += 2;
              v168 = __ROL8__(v171, v166);
              --v170;
            }
            while( v170 );
            v172 = (__ROL8__(*(_QWORD *)(v152 + 2072) ^ ((unsigned __int64)v165 - v40), 17) ^ *(_QWORD *)(v152 + 2072) ^ ((unsigned __int64)v165 - v40))
                 * (unsigned __int128)0x7010008004002001ui64;
            v166 = ((unsigned __int8)v172 ^ (unsigned __int8)(BYTE8(v172) ^ v166)) & 0x3F;
            if( !v166 )
              LOBYTE(v166) = 1;
            --v169;
          }
          while( v169 );
          v161 = v152 + v148;
        }
        v173 = v146 & 0x7F;
        if( v173 >= 8 )
        {
          v174 = (unsigned __int64)(v146 & 0x7F) >> 3;
          do
          {
            v168 = __ROL8__(*v165++ ^ v168, v166);
            v173 -= 8;
            --v174;
          }
          while( v174 );
        }
        for( ; v173; --v173 )
        {
          v175 = *(unsigned __int8 *)v165;
          v165 = (_QWORD *)((char *)v165 + 1);
          v168 = __ROL8__(v175 ^ v168, v166);
        }
        for( m = v168; ; LODWORD(v168) = m ^ v168 )
        {
          m >>= 31;
          if( !m )
            break;
        }
        *(_DWORD *)(v161 + 20) = v168 & 0x7FFFFFFF;
        *(_DWORD *)(v152 + 2088) += v146;
        if( (*(_DWORD *)(v152 + 2448) & 0x40000000) != 0 )
        {
          if( (_DWORD)v146 )
            sub_1403E92DC(v152, v40, v146, v161 + 28);
        }
        *(_DWORD *)(v161 + 24) = 1;
        *(_QWORD *)a1 = v152;
        return 0i64;
      }
      v152 = sub_140A0EB30(v22, v151, v149);
      if( v152 )
      {
        v153 = *((_DWORD *)v22 + 612);
        if( (v153 & 4) == 0 )
        {
          v154 = *((_DWORD *)v22 + 505);
          v155 = *((_QWORD *)v22 + 249);
          v156 = (v153 & 0x20000000) != 0 ? *((_DWORD *)v22 + 585) : 0;
          if( v154 >= 8 )
          {
            v157 = (unsigned __int64)v154 >> 3;
            do
            {
              *(_QWORD *)v22 = 0i64;
              v154 -= 8;
              v22 += 8;
              --v157;
            }
            while( v157 );
          }
          for( ; v154; --v154 )
            *v22++ = 0;
          v158 = *(_DWORD *)(v152 + 2340);
          *(_DWORD *)(v152 + 2340) = v156;
          if( v156 == 3 )
          {
            (*(void(__fastcall **)(__int64))(v152 + 872))(v155);
          }
          else
          {
            v159 = 0;
            if( (*(_DWORD *)(v152 + 2448) & 0x10000000) == 0 )
              v159 = v156;
            if( v159 )
              (*(void(__fastcall **)(__int64, _QWORD))(v152 + 552))(v155 - 8, *(_QWORD *)(v155 - 8));
            else(*(void(__fastcall **)(__int64))(v152 + 256))(v155);
          }
          *(_DWORD *)(v152 + 2340) = v158;
        }
        *(_DWORD *)(v152 + 2448) &= ~4u;
        goto LABEL_212;
      }
      return 3221225626i64;
    }
    if( (*((_DWORD *)v3 + 612) & 0x200000) == 0 )
    {
      LODWORD(v188) = -805294751;
      KeBugCheckEx(__ROR4__(-805306349, 92), (PVOID)0xA, a2, (PVOID)4, 0i64);
    }
    if( !*((_DWORD *)v3 + 574) )
    {
      *((_QWORD *)v3 + 289) = 0i64;
      *((_QWORD *)v3 + 290) = 271i64;
      *((_QWORD *)v3 + 288) = v3 - 0x5C5FC0A76E374B18i64;
      *((_QWORD *)v3 + 291) = a2;
      *((_DWORD *)v3 + 574) = 1;
      __b8((__int64)v3, 0i64);
    }
  }
  return 3221225595i64;
}

Referenced by:

sub_1403DCCA0
sub_140A0C0FC