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