sub_140A0F5E8
int __fastcall sub_140A0F5E8(__int64 a1, __int64 *a2, unsigned int a3){
unsigned int v4;
__int64 *v5;
__int64 *v6;
__int64 *v7;
int v8;
unsigned __int64 v9;
INT64(*v10)(void);
char v11;
unsigned __int8 CurrentIrql;
volatile signed __int32 *v13;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned int v16;
struct _KPRCB *CurrentPrcb;
__int64 v18;
__int64 v19;
__int64 v20;
char v21;
__int64 v22;
unsigned __int8 v23;
volatile signed __int32 *v24;
unsigned __int64 v25;
unsigned __int64 v26;
unsigned int v27;
struct _KPRCB *v28;
__int64 v29;
__int64 v30;
__int64 v31;
signed __int64 v32;
bool v33;
unsigned int v34;
INT64(*v35)(void);
unsigned __int64 v36;
char v37;
unsigned __int8 v38;
volatile signed __int32 *v39;
unsigned __int64 v40;
__int64 v41;
unsigned int v42;
struct _KPRCB *v43;
__int64 v44;
__int64 v45;
__int64 v46;
char v47;
volatile signed __int32 *v48;
unsigned __int64 v49;
__int64 v50;
unsigned int v51;
unsigned __int8 v52;
struct _KPRCB *v53;
__int64 v54;
__int64 v55;
__int64 v56;
__int64 v57;
int i;
unsigned int v60;
unsigned __int64 v61;
__int64 v62;
__int64 v63;
__int64 v64;
__int64 v65;
__int64 v66;
__int64 v67;
char v68;
__int64 *v69;
char v70;
unsigned int v71;
v70 = a3;
v69 = a2;
v4 = a3;
*(_DWORD *)(a1 + 2088) += a3;
v5 = a2;
v6 = a2;
v7 = (__int64 *)((char *)a2 + a3);
if( a2 < v7 )
{
do
{
_mm_prefetchnta(v6);
v6 += 8;
}
while( v6 < v7 );
}
v8 = *(_DWORD *)(a1 + 2068);
v9 = *(_QWORD *)(a1 + 2072);
v61 = v9;
v68 = v8;
v60 = v4 >> 7;
if( v4 >> 7 )
{
v10 = (INT64(*)(void))((char *)a2 - 6);
do
{
v71 = 128;
do
{
v11 = *((_BYTE *)v10 + 5);
if( *(_BYTE *)v10 == 76
&& *((_BYTE *)v10 + 1) == 0x87
&& !*((_BYTE *)v10 + 2)
&& *((_BYTE *)v10 + 3) == 0x98
&& *((_BYTE *)v10 + 4) == 0xC3
&& (v11 == -112 || v11 == -15) )
{
CurrentIrql = -1;
v13 = 0i64;
v14 = __rdtsc();
v15 = __ROR8__(v14, 3) ^ v14;
v63 = (v15 * (unsigned __int128)0x7010008004002001ui64) >> 64;
v16 = ((unsigned __int8)v63 ^ (unsigned __int8)v15) & 3;
if( v16 <= 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v18 = *(_QWORD *)(a1 + 1608);
v13 = v16 ? *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
+ *(_QWORD *)((char *)&CurrentPrcb->_MxCsr + v18)
+ *(_QWORD *)(a1 + 1672)) : *(volatile signed __int32 **)((char *)&CurrentPrcb->_MxCsr + v18);
if( _interlockedbittestandset(v13, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
{
v13 = 0i64;
__writecr8(CurrentIrql);
}
}
LODWORD(v19) = KiAccessPage(v10);
v20 = v19;
if( v13 )
{
_InterlockedAnd(v13, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
__writecr8(CurrentIrql);
}
LOBYTE(v8) = v68;
}
else
{
v20 = 0i64;
}
v21 = *((_BYTE *)v10 + 5);
v22 = __ROL8__(v9 ^ v20, v8);
if( *(_BYTE *)v10 == 76
&& *((_BYTE *)v10 + 1) == 0x87
&& !*((_BYTE *)v10 + 2)
&& *((_BYTE *)v10 + 3) == 0x98
&& *((_BYTE *)v10 + 4) == 0xC3
&& (v21 == -112 || v21 == -15) )
{
v23 = -1;
v24 = 0i64;
v25 = __rdtsc();
v26 = __ROR8__(v25, 3) ^ v25;
v64 = (v26 * (unsigned __int128)0x7010008004002001ui64) >> 64;
v27 = ((unsigned __int8)v64 ^ (unsigned __int8)v26) & 3;
if( v27 <= 1 )
{
v23 = KeGetCurrentIrql();
__writecr8(2ui64);
v28 = KeGetCurrentPrcb();
v29 = *(_QWORD *)(a1 + 1608);
v24 = v27 ? *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
+ *(_QWORD *)((char *)&v28->_MxCsr + v29)
+ *(_QWORD *)(a1 + 1672)) : *(volatile signed __int32 **)((char *)&v28->_MxCsr + v29);
if( _interlockedbittestandset(v24, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
{
v24 = 0i64;
__writecr8(v23);
}
}
LODWORD(v30) = KiAccessPage(v10);
v31 = v30;
if( v24 )
{
_InterlockedAnd(v24, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
__writecr8(v23);
}
LOBYTE(v8) = v68;
}
else
{
v31 = 0i64;
}
v9 = __ROL8__(v22 ^ v31, v8);
v5 += 2;
v71 -= 16;
}
while( v71 >= 8 );
v32 = __ROL8__(v61 ^ ((char *)v5 - (char *)v69), 17) ^ v61 ^ ((char *)v5 - (char *)v69);
v65 = ((unsigned __int64)v32 * (unsigned __int128)0x7010008004002001ui64) >> 64;
v8 = ((unsigned __int8)v8 ^ (unsigned __int8)(v65 ^ v32)) & 0x3F;
if( !v8 )
LOBYTE(v8) = 1;
v33 = v60-- == 1;
v68 = v8;
}
while( !v33 );
LOBYTE(v4) = v70;
a2 = v69;
}
v34 = v4 & 0x7F;
if( v34 >= 8 )
{
v35 = (INT64(*)(void))((char *)a2 - 6);
v36 = (unsigned __int64)v34 >> 3;
do
{
v37 = *((_BYTE *)v35 + 5);
if( *(_BYTE *)v35 == 76
&& *((_BYTE *)v35 + 1) == 0x87
&& !*((_BYTE *)v35 + 2)
&& *((_BYTE *)v35 + 3) == 0x98
&& *((_BYTE *)v35 + 4) == 0xC3
&& (v37 == -112 || v37 == -15) )
{
v38 = -1;
v39 = 0i64;
v40 = __rdtsc();
v41 = __ROR8__(v40, 3);
v66 = ((v41 ^ v40) * (unsigned __int128)0x7010008004002001ui64) >> 64;
v42 = ((unsigned __int8)v66 ^ (unsigned __int8)(v41 ^ v40)) & 3;
if( v42 <= 1 )
{
v38 = KeGetCurrentIrql();
__writecr8(2ui64);
v43 = KeGetCurrentPrcb();
v44 = *(_QWORD *)(a1 + 1608);
v39 = v42 ? *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
+ *(_QWORD *)((char *)&v43->_MxCsr + v44)
+ *(_QWORD *)(a1 + 1672)) : *(volatile signed __int32 **)((char *)&v43->_MxCsr + v44);
if( _interlockedbittestandset(v39, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
{
v39 = 0i64;
__writecr8(v38);
}
}
LODWORD(v45) = KiAccessPage(v35);
v46 = v45;
if( v39 )
{
_InterlockedAnd(v39, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
__writecr8(v38);
}
}
else
{
v46 = 0i64;
}
v9 = __ROL8__(v46 ^ v9, v68);
++v5;
v34 -= 8;
--v36;
}
while( v36 );
}
if( ((unsigned __int16)v5 & 0xFFFu) <= 0xFF8 )
{
v47 = *((_BYTE *)v69 - 1);
if( *((_BYTE *)v69 - 6) == 76
&& *((_BYTE *)v69 - 5) == 0x87
&& !*((_BYTE *)v69 - 4)
&& *((_BYTE *)v69 - 3) == 0x98
&& *((_BYTE *)v69 - 2) == 0xC3
&& (v47 == -112 || v47 == -15) )
{
v48 = 0i64;
v49 = __rdtsc();
v50 = __ROR8__(v49, 3);
v67 = ((v50 ^ v49) * (unsigned __int128)0x7010008004002001ui64) >> 64;
v51 = ((unsigned __int8)v67 ^ (unsigned __int8)(v50 ^ v49)) & 3;
if( v51 > 1 )
{
v52 = -1;
}
else
{
v52 = KeGetCurrentIrql();
__writecr8(2ui64);
v53 = KeGetCurrentPrcb();
v54 = *(_QWORD *)(a1 + 1608);
if( v51 )
v48 = *(volatile signed __int32 **)(*(_QWORD *)(a1 + 1704)
+ *(_QWORD *)((char *)&v53->_MxCsr + v54)
+ *(_QWORD *)(a1 + 1672));
else
v48 = *(volatile signed __int32 **)((char *)&v53->_MxCsr + v54);
if( _interlockedbittestandset(v48, (*(_DWORD *)(a1 + 2448) >> 10) & 0x1F) )
{
v48 = 0i64;
__writecr8(v52);
}
}
LODWORD(v55) = KiAccessPage((INT64(*)(void))((char *)v69 - 6));
v56 = v55;
if( v48 )
{
_InterlockedAnd(v48, ~(1 << ((*(_DWORD *)(a1 + 2448) >> 10) & 0x1F)));
__writecr8(v52);
}
}
else
{
v56 = 0i64;
}
v62 = v56;
v5 = &v62;
}
for( ; v34; --v34 )
{
v57 = *(unsigned __int8 *)v5;
v5 = (__int64 *)((char *)v5 + 1);
v9 = __ROL8__(v57 ^ v9, v68);
}
for( i = v9; ; i ^= v9 )
{
v9 >>= 31;
if( !v9 )
break;
}
return i & 0x7FFFFFFF;
}Referenced by:
sub_1403DCCA0