sub_140A1BFE4

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

Argument1
sub_140A0C0FC