sub_140A0FD10
__int64 __fastcall sub_140A0FD10(__int64 a1, __int64 a2){
__int64 v2;
__int64 v3;
__int64 v4;
_QWORD *v5;
int v6;
int v7;
_QWORD *v8;
int v9;
char *v10;
__int64 v11;
__int64 v12;
int v13;
__int64 v14;
__int64 v15;
__int64 *v16;
__int64 v17;
unsigned __int64 v18;
__int64 v19;
int v20;
__int64 v21;
int v22;
__int64 v23;
bool v24;
__int64 v25;
int v26;
unsigned int *v27;
unsigned int v28;
__int64 v29;
unsigned int v30;
int *v31;
__int64 v32;
int v33;
int v34;
int v35;
int v36;
__int64 v37;
int v38;
_QWORD *v39;
int v40;
unsigned int v41;
unsigned __int64 v42;
_QWORD *v43;
__int64 v44;
char *v45;
unsigned __int64 v46;
unsigned int v47;
__int64 v48;
__int64 v49;
unsigned __int64 v50;
__int64 v51;
unsigned __int64 v52;
__int64 v53;
unsigned __int64 i;
unsigned int v55;
int v56;
__int64 v57;
__int64 v58;
unsigned __int8 CurrentIrql;
unsigned __int64 v60;
unsigned __int64 v61;
int v62;
__int64 v63;
__int64 v64;
__int64 v65;
__int64 v66;
struct _KPRCB *CurrentPrcb;
void **v68;
__int64 v69;
unsigned __int64 v70;
unsigned __int64 v71;
unsigned int v72;
unsigned __int64 v73;
_QWORD *j;
unsigned __int64 v75;
int v76;
__int64 v77;
__int64 v78;
unsigned __int64 v79;
__int64 v80;
_QWORD *v81;
char *v82;
int v83;
unsigned __int64 v84;
signed __int64 v85;
__int64 v86;
unsigned __int64 v87;
unsigned __int64 v88;
_QWORD *v89;
unsigned __int64 v90;
unsigned __int128 v91;
__int64 v92;
char *v93;
_QWORD *v94;
__int64 v95;
char v96;
unsigned __int64 v97;
int v99;
int v100;
int v101;
int v102;
int v103;
volatile signed __int32 *v104;
signed __int32 v105[8];
__int64 v106;
unsigned int v107;
__int64 v108;
unsigned __int64 v109;
__int64 v110;
__int64 v111;
__int16 v112[8];
char v113[16];
__int64 v114;
__int64 v115;
__int64 v116;
__int64 v117;
v2 = a2;
if( (*(_DWORD *)(a2 + 2448) & 0x110000) != 1114112 )
{
v3 = *(_QWORD *)(a2 + 2272);
v4 = 38i64;
v5 = (_QWORD *)v3;
v6 = 304;
do
{
*v5 = 0i64;
v6 -= 8;
++v5;
--v4;
}
while( v4 );
for( ; v6; --v6 )
{
*(_BYTE *)v5 = 0;
v5 = (_QWORD *)((char *)v5 + 1);
}
*(_OWORD *)(v3 + 16) = *(_OWORD *)(v2 + 2120);
*(_OWORD *)(v3 + 32) = *(_OWORD *)(v2 + 2136);
*(_OWORD *)(v3 + 288) = *(_OWORD *)(v2 + 2152);
v112[0] = 303;
*(_QWORD *)&v112[1] = v3;
*(_WORD *)(v3 + 16) = v2 + 2168;
*(_DWORD *)(v3 + 24) = (unsigned __int64)(v2 + 2168) >> 32;
*(_WORD *)(v3 + 22) = (unsigned int)(v2 + 2168) >> 16;
_disable();
if( *(int *)(v2 + 2448) >= 0 )
{
__sidt(v113);
__lidt(v112);
__writedr(7u, 0i64);
__lidt(v113);
}
else
{
__writedr(7u, 0i64);
}
_enable();
}
*(_DWORD *)(v2 + 2088) += 1568;
v7 = *(_DWORD *)(v2 + 196);
v8 = (_QWORD *)v2;
v9 = *(_DWORD *)(v2 + 2068);
v10 = (char *)v2;
v11 = *(_QWORD *)(v2 + 2072);
*(_DWORD *)(v2 + 196) = 0;
if( v2 < (unsigned __int64)(v2 + 1568) )
{
do
{
_mm_prefetchnta(v10);
v10 += 64;
}
while( (unsigned __int64)v10 < v2 + 1568 );
}
v12 = v11;
v13 = 12;
do
{
v14 = 8i64;
do
{
v15 = v12 ^ *v8;
v16 = v8 + 1;
v17 = *v16;
v8 = v16 + 1;
v12 = __ROL8__(__ROL8__(v15, v9) ^ v17, v9);
--v14;
}
while( v14 );
v18 = __ROL8__(v11 ^ ((unsigned __int64)v8 - v2), 17) ^ v11 ^ ((unsigned __int64)v8 - v2);
v114 = (v18 * (unsigned __int128)0x7010008004002001ui64) >> 64;
v9 = ((unsigned __int8)(v114 ^ v18) ^ (unsigned __int8)v9) & 0x3F;
if( !v9 )
LOBYTE(v9) = 1;
--v13;
}
while( v13 );
LODWORD(v19) = 32;
v20 = 4;
v21 = 4i64;
v22 = 64;
do
{
v12 = __ROL8__(*v8++ ^ v12, v9);
v19 = (unsigned int)(v19 - 8);
--v21;
}
while( v21 );
if( (_DWORD)v19 )
{
do
{
v23 = *(unsigned __int8 *)v8;
v8 = (_QWORD *)((char *)v8 + 1);
v12 = __ROL8__(v23 ^ v12, v9);
v24 = (_DWORD)v19 == 1;
v19 = (unsigned int)(v19 - 1);
}
while( !v24 );
}
*(_DWORD *)(v2 + 196) = v7;
if( *(_QWORD *)(v2 + 2592) != v12 )
{
v25 = *(_QWORD *)(v2 + 1424);
v26 = *(_DWORD *)(v2 + 2020);
*(_QWORD *)v25 = v2;
*(_DWORD *)(v25 + 16) = v26;
v19 = *(_QWORD *)(v2 + 2592);
if( !*(_DWORD *)(v2 + 2296) )
{
*(_QWORD *)(*(_QWORD *)(v2 + 1424) + 24i64) = v19 ^ v12;
if( !*(_DWORD *)(v2 + 2296) )
{
*(_QWORD *)(v2 + 2312) = 0i64;
*(_QWORD *)(v2 + 2304) = v2 - 0x5C5FC0A76E374B18i64;
*(_QWORD *)(v2 + 2320) = 265i64;
*(_QWORD *)(v2 + 2328) = v12;
*(_DWORD *)(v2 + 2296) = 1;
__b8(v2, 0i64);
}
}
}
v106 = 0i64;
v27 = &v107;
do
{
*(_BYTE *)v27 = 0;
v27 = (unsigned int *)((char *)v27 + 1);
--v20;
}
while( v20 );
v28 = 0;
LODWORD(v108) = 0;
if( *(_DWORD *)(v2 + 2016) )
{
while( 1 )
{
v29 = v2;
v30 = 0;
if( *(_QWORD *)(v2 + 2680) )
v29 = *(_QWORD *)(v2 + 2680);
v31 = (int *)(v29 + *(unsigned int *)(v29 + 2056));
if( (_DWORD)v106 && HIDWORD(v106) <= v28 )
{
v30 = HIDWORD(v106);
v31 = (int *)(v29 + v107);
}
if( v30 != v28 )
break;
LABEL_57:
v39 = (_QWORD *)*((_QWORD *)v31 + 1);
v40 = *(_DWORD *)(v2 + 2068);
v41 = (_DWORD)v31 - v29;
v42 = *(_QWORD *)(v2 + 2072);
v43 = v39;
HIDWORD(v106) = v30;
v44 = (unsigned int)v31[4];
*(_DWORD *)(v2 + 2088) += v44;
v107 = v41;
v45 = (char *)v39;
LODWORD(v106) = 1;
if( v39 < (_QWORD *)((char *)v39 + v44) )
{
do
{
_mm_prefetchnta(v45);
v45 += 64;
}
while( v45 < (char *)v39 + v44 );
}
v46 = v42;
v47 = (unsigned int)v44 >> 7;
if( (unsigned int)v44 >> 7 )
{
do
{
v48 = 8i64;
do
{
v49 = v43[1] ^ __ROL8__(*v43 ^ v46, v40);
v43 += 2;
v46 = __ROL8__(v49, v40);
--v48;
}
while( v48 );
v50 = __ROL8__(v42 ^ ((char *)v43 - (char *)v39), 17) ^ v42 ^ ((char *)v43 - (char *)v39);
v19 = (v50 * (unsigned __int128)0x7010008004002001ui64) >> 64;
v115 = v19;
v40 = ((unsigned __int8)(v19 ^ v50) ^ (unsigned __int8)v40) & 0x3F;
if( !v40 )
LOBYTE(v40) = 1;
--v47;
}
while( v47 );
v2 = a2;
}
v51 = v44 & 0x7F;
if( (unsigned int)v51 >= 8 )
{
v52 = (unsigned __int64)(unsigned int)v51 >> 3;
do
{
v46 = __ROL8__(*v43++ ^ v46, v40);
v51 = (unsigned int)(v51 - 8);
--v52;
}
while( v52 );
}
if( (_DWORD)v51 )
{
do
{
v53 = *(unsigned __int8 *)v43;
v43 = (_QWORD *)((char *)v43 + 1);
v46 = __ROL8__(v53 ^ v46, v40);
v24 = (_DWORD)v51 == 1;
v51 = (unsigned int)(v51 - 1);
}
while( !v24 );
}
for( i = v46; ; LODWORD(v46) = i ^ v46 )
{
i >>= 31;
if( !i )
break;
}
v55 = v46 & 0x7FFFFFFF;
v56 = 0;
if( v55 != v31[5] )
{
if( !*v31 && v31[6] )
v56 = 1;
v57 = (unsigned int)v31[4];
v58 = *((_QWORD *)v31 + 1);
if( v31[4] && (*(_DWORD *)(v2 + 2452) & 0x40) != 0 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v60 = v58 & 0xFFFFFFFFFFFFF000ui64;
v110 = (v58 + v57 - 1) | 0xFFF;
v109 = (v58 & 0xFFFFFFFFFFFFF000ui64) - 1;
while( 2 )
{
v61 = CurrentIrql;
while( 1 )
{
v62 = (*(__int64(__fastcall **)(unsigned __int64, _QWORD, __int64, _QWORD *))(v2 + 1128))(
v60,
0i64,
v51,
v43);
if( v62 != -1073741267 )
break;
if( v56 )
goto LABEL_101;
if( CurrentIrql > 1u )
goto LABEL_87;
v61 = CurrentIrql;
__writecr8(CurrentIrql);
KeGetCurrentIrql();
__writecr8(2ui64);
}
if( v62 < 0 )
{
LABEL_101:
__writecr8(v61);
goto LABEL_102;
}
LABEL_87:
v19 = 4096i64;
v60 += 4096i64;
v109 += 4096i64;
if( v109 != v110 )
continue;
break;
}
__writecr8(v61);
}
else
{
LABEL_102:
v76 = *(_DWORD *)(v2 + 2296);
v19 = (unsigned int)v31[5];
if( !v76 )
{
*(_QWORD *)(*(_QWORD *)(v2 + 1424) + 24i64) = v19 ^ v55;
v76 = *(_DWORD *)(v2 + 2296);
}
v77 = *((_QWORD *)v31 + 1);
if( !v76 )
{
*(_QWORD *)(v2 + 2304) = v2 - 0x5C5FC0A76E374B18i64;
*(_QWORD *)(v2 + 2312) = (char *)v31 - 0x4C48B4211BBACBEBi64;
v78 = *v31;
*(_QWORD *)(v2 + 2328) = v77;
*(_QWORD *)(v2 + 2320) = v78;
*(_DWORD *)(v2 + 2296) = 1;
__b8(v2, 0i64);
}
}
}
v22 = 64;
v28 = v108 + 1;
LODWORD(v108) = v28;
if( v28 >= *(_DWORD *)(v2 + 2016) )
goto LABEL_90;
}
v32 = v28 - v30;
v30 = v28;
while( 1 )
{
v33 = *v31;
if( *v31 > 12 )
break;
if( v33 == 12 )
goto LABEL_50;
v34 = v33 - 1;
if( !v34 )
goto LABEL_50;
v35 = v34 - 6;
if( v35 )
{
v36 = v35 - 1;
if( !v36 )
{
v38 = *((unsigned __int16 *)v31 + 16);
LABEL_55:
v37 = (v38 + 55) & 0xFFFFFFF8;
goto LABEL_56;
}
if( v36 != 2 )
goto LABEL_52;
v37 = (unsigned int)(16 * (v31[7] + 3));
}
else
{
v37 = (unsigned int)(24 * (v31[6] + 2));
}
LABEL_56:
v31 = (int *)((char *)v31 + v37);
if( !--v32 )
goto LABEL_57;
}
if( v33 == 28 )
{
v38 = *((unsigned __int16 *)v31 + 20);
goto LABEL_55;
}
if( v33 == 30 )
{
v19 = ((v31[9] != 0 ? v31[9] - 1 : 0) / 0xCu + 7) & 0xFFFFFFF8;
v37 = (unsigned int)v19 + 24 * (*((unsigned __int16 *)v31 + 20) + 2);
goto LABEL_56;
}
if( v33 <= 32 )
{
LABEL_52:
v37 = 48i64;
goto LABEL_56;
}
if( v33 <= 34 )
{
v19 = ((v31[8] & 0xFFF) + (unsigned __int64)(unsigned int)v31[10] + 4095) >> 12;
v37 = (unsigned int)(20 * v19 + 48);
goto LABEL_56;
}
if( v33 != 43 )
goto LABEL_52;
LABEL_50:
v19 = (unsigned int)v31[4] / 0xCui64;
v37 = (unsigned int)(4 * v19 + 48);
goto LABEL_56;
}
LABEL_90:
if( *(_DWORD *)(v2 + 2296) )
{
v63 = *(_QWORD *)(v2 + 2320);
v64 = *(_QWORD *)(v2 + 2328);
v65 = *(_QWORD *)(v2 + 2312);
v66 = *(_QWORD *)(v2 + 2304);
v110 = v64;
v109 = v65;
v108 = v66;
v111 = v2;
if( KeGetCurrentIrql() < 2u )
{
KeGetCurrentIrql();
__writecr8(2ui64);
}
CurrentPrcb = KeGetCurrentPrcb();
v68 = *(void ***)((char *)CurrentPrcb + *(_QWORD *)(v2 + 1592));
v69 = *(_QWORD *)((char *)CurrentPrcb + *(_QWORD *)(v2 + 1608));
if( !*((_BYTE *)CurrentPrcb + *(_QWORD *)(v2 + 1600)) || &v111 > (__int64 *)v68 || &v111 < (__int64 *)v68 - 3072 )
v68 = *(void ***)(v69 + *(_QWORD *)(v2 + 1656));
if( (*(_DWORD *)(v2 + 2448) & 0x8000000) == 0 )
{
v70 = __readcr0();
__writecr0(v70 & 0xFFFFFFFFFFFEFFFFui64);
v71 = v2 + 2728;
v72 = 0;
v73 = v2 + 2728 + 16i64 * *(unsigned int *)(v2 + 2720);
for( j = (_QWORD *)v73; v72 < *(_DWORD *)(v2 + 2724); ++v72 )
{
*(_QWORD *)*j = j[1];
v75 = __readcr4();
if( (v75 & 0x20080) != 0 )
{
__writecr4(v75 ^ 0x80);
__writecr4(v75);
}
else
{
v79 = __readcr3();
__writecr3(v79);
}
j += 2;
}
if( v71 < v73 )
{
do
{
v80 = *(unsigned int *)(v71 + 8);
v81 = j;
v82 = *(char **)v71;
v83 = v80;
if( (unsigned int)v80 >= 8 )
{
v84 = (unsigned __int64)(unsigned int)v80 >> 3;
do
{
v83 -= 8;
*(_QWORD *)v82 = *v81++;
v82 += 8;
--v84;
}
while( v84 );
}
if( v83 )
{
v85 = v82 - (char *)v81;
do
{
*((_BYTE *)v81 + v85) = *(_BYTE *)v81;
v81 = (_QWORD *)((char *)v81 + 1);
--v83;
}
while( v83 );
}
j = (_QWORD *)((char *)j + v80);
v71 += 16i64;
}
while( v71 < v73 );
v64 = v110;
v65 = v109;
}
**(_BYTE **)(v2 + 536) = -61;
__writecr0(v70);
v66 = v108;
}
v99 = *(_DWORD *)(v2 + 2344);
if( v99 )
{
if( KeGetCurrentIrql() < 2u )
{
KeGetCurrentIrql();
__writecr8(2ui64);
v99 = *(_DWORD *)(v2 + 2344);
}
if( v99 )
{
v100 = v99 - 1;
if( v100 )
{
v101 = v100 - 1;
if( v101 )
{
v102 = v101 - 1;
if( v102 )
{
v103 = v102 - 1;
if( v103 )
{
if( v103 == 1 )
_interlockedbittestandset(
*(volatile signed __int32 **)((char *)KeGetCurrentPrcb() + *(_QWORD *)(v2 + 1608)),
(*(_DWORD *)(v2 + 2448) >> 10) & 0x1F);
else
_InterlockedOr64((volatile signed __int64 *)(*(_QWORD *)(v2 + 1464) + 832i64), 1ui64);
}
else
{
_interlockedbittestandset(
*(volatile signed __int32 **)(*(_QWORD *)(v2 + 1704)
+ *(_QWORD *)((char *)KeGetCurrentPrcb() + *(_QWORD *)(v2 + 1608))
+ *(_QWORD *)(v2 + 1672)),
(*(_DWORD *)(v2 + 2448) >> 10) & 0x1F);
}
goto LABEL_151;
}
v104 = *(volatile signed __int32 **)(v2 + 1376);
}
else
{
v104 = *(volatile signed __int32 **)(v2 + 1368);
}
}
else
{
v104 = *(volatile signed __int32 **)(v2 + 1352);
}
_interlockedbittestandset64(v104, 0i64);
}
}
LABEL_151:
*(_QWORD *)(v69 + *(_QWORD *)(v2 + 1680)) = 0i64;
*(_QWORD *)(v69 + *(_QWORD *)(v2 + 1696)) = 0i64;
SdbpCheckDll(265i64, v66, v65, v64, v63, *(__int64(__fastcall **)(__int64))(v2 + 344), v68);
JUMPOUT(0x140A10821i64);
}
v86 = v2 + *(unsigned int *)(v2 + 2032);
if( (*(_DWORD *)(v2 + 2448) & 0x10000000) != 0 )
{
v87 = __rdtsc();
v88 = __ROR8__(v87, 3) ^ v87;
v19 = (v88 * (unsigned __int128)0x7010008004002001ui64) >> 64;
v116 = v19;
v86 = (__int64)KiMachineCheckControl + 16 * (((unsigned __int8)v88 ^ (unsigned __int8)v19) & 0xF);
}
v89 = *(_QWORD **)(v2 + 2568);
if( v89 )
{
v90 = __rdtsc();
v91 = (__ROR8__(v90, 3) ^ v90) * (unsigned __int128)0x7010008004002001ui64;
v117 = *((_QWORD *)&v91 + 1);
*((_QWORD *)&v91 + 1) ^= v91;
v89[2] = *((_QWORD *)&v91 + 1);
*(_QWORD *)&v91 = v86 ^ *((_QWORD *)&v91 + 1);
v19 = v2 ^ *((_QWORD *)&v91 + 1);
v89[3] = v91;
v89[1] = v19;
_InterlockedOr(v105, 0);
v86 = *(_QWORD *)(v2 + 752);
}
else
{
v89 = (_QWORD *)v2;
}
*(_QWORD *)(v2 + 1960) = v86;
*(_QWORD *)(v2 + 1968) = v89;
*(_QWORD *)(v2 + 1944) = 0i64;
_disable();
_enable();
LOBYTE(v92) = (*(__int64(__fastcall **)(__int64, __int64))(v2 + 616))(v2 + 2048, v19);
(*(void(__fastcall **)(__int64, __int64))(v2 + 624))(v2 + 2048, v92);
switch( *(_DWORD *)(v2 + 2104) )
{
case 3:
_disable();
*(_QWORD *)(v2 + 2456) = *(_QWORD *)((char *)KeGetCurrentPrcb() + *(_QWORD *)(v2 + 1608));
_enable();
break;
case 4:
v97 = *(_QWORD *)(v2 + 2528);
*(_QWORD *)(*(_QWORD *)(v97 + 56) ^ *(_QWORD *)(v97 + 64)) = v97 ^ *(_QWORD *)(v97 + 72) ^ *(_QWORD *)(v97 + 64);
*(_QWORD *)(v97 + 72) = 0i64;
*(_QWORD *)(v97 + 56) = 0i64;
break;
case 5:
v93 = (char *)(v2 + 2464);
v94 = (_QWORD *)(*(_QWORD *)(v2 + 2456) + 8i64);
v95 = 8i64;
do
{
v22 -= 8;
*v94 = *(_QWORD *)v93;
v93 += 8;
++v94;
--v95;
}
while( v95 );
for( ; v22; --v22 )
{
v96 = *v93++;
*(_BYTE *)v94 = v96;
v94 = (_QWORD *)((char *)v94 + 1);
}
break;
}
_InterlockedOr(v105, 0);
return v2;
}Referenced by:
RtlpComputeEpilogueOffset