sub_140A10830
INT64 __fastcall sub_140A10830(INT64 a1){
_DWORD *v2;
char *v3;
__int64 v4;
int v5;
__int64 v6;
__int64 v7;
unsigned __int64 v8;
_WORD *v9;
char *v10;
char v11;
_WORD *v12;
int v13;
char *v14;
char *v15;
__int64 v16;
char v17;
unsigned __int64 v18;
_QWORD *v19;
unsigned __int64 v20;
int v21;
__int64 v22;
INT64 v23;
char *v24;
char v25;
__int64 *v26;
__int64 v27;
__int64 v28;
__int64 v29;
unsigned __int64 v30;
_QWORD *v31;
unsigned __int64 v32;
unsigned __int64 v33;
volatile signed __int32 *v34;
char *v35;
_QWORD *v36;
_QWORD *v37;
unsigned int v38;
_QWORD *v39;
struct _KPRCB *CurrentPrcb;
char v41;
int v42;
_QWORD *v43;
__int64 v44;
char v45;
unsigned __int64 v46;
unsigned __int64 v47;
int v48;
int v49;
__int64 v50;
_QWORD *v51;
char *v52;
int v53;
__int64 v54;
char v55;
int v56;
char *v57;
__int64 v58;
char v59;
__int64 *v61;
__int64 v62;
char v63[16];
char v64[16];
__int64 v65[11];
unsigned __int64 v66;
_QWORD *v67;
v2 = *(_DWORD **)(a1 + 2656);
if( *v2 == 44 )
{
_disable();
RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
v66 = *(_QWORD *)(a1 + 2664);
do
{
v3 = v63;
v4 = *(_QWORD *)(a1 + 2240);
v5 = 16;
v6 = *(unsigned int *)(a1 + 2292);
v7 = 2i64;
v8 = *((_QWORD *)KeGetPcr() + 7);
v9 = (_WORD *)(v4 + 32);
v10 = (char *)(v4 + 32);
do
{
v5 -= 8;
*(_QWORD *)v3 = *(_QWORD *)v10;
v10 += 8;
v3 += 8;
--v7;
}
while( v7 );
for( ; v5; --v5 )
{
v11 = *v10++;
*v3++ = v11;
}
v12 = (_WORD *)(v4 + 288);
v13 = 16;
v14 = v64;
v15 = (char *)(v4 + 288);
v16 = 2i64;
do
{
v13 -= 8;
*(_QWORD *)v14 = *(_QWORD *)v15;
v15 += 8;
v14 += 8;
--v16;
}
while( v16 );
for( ; v13; --v13 )
{
v17 = *v15++;
*v14++ = v17;
}
v61 = (__int64 *)(*(_QWORD *)(a1 + 1504) + ((v8 >> 9) & 0x7FFFFFFFF8i64));
v62 = *v61;
if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
{
v18 = v6 + a1 + 16;
v19 = (_QWORD *)(v4 + 1024);
*v9 = v18;
v20 = v18 >> 16;
v21 = 4096;
v22 = 512i64;
*(_DWORD *)(v4 + 40) = HIDWORD(v18);
v23 = v6 + a1 + 144;
*(_WORD *)(v4 + 38) = v20;
*v12 = v23;
*(_WORD *)(v4 + 294) = WORD1(v23);
v24 = (char *)v66;
*(_DWORD *)(v4 + 296) = HIDWORD(v23);
do
{
v21 -= 8;
*v19 = *(_QWORD *)v24;
v24 += 8;
++v19;
--v22;
}
while( v22 );
for( ; v21; --v21 )
{
v25 = *v24++;
*(_BYTE *)v19 = v25;
v19 = (_QWORD *)((char *)v19 + 1);
}
*(_DWORD *)(a1 + 2206) = -255817396;
v26 = v65;
*(_DWORD *)(a1 + 2210) = 296816456;
*(_DWORD *)(a1 + 2214) = -1010789361;
LODWORD(v27) = 4;
*(_QWORD *)(v4 + 5128) = v66;
v28 = 4i64;
*(_QWORD *)(v4 + 5136) = v66;
*(_QWORD *)(v4 + 5120) = a1;
*(_DWORD *)(v4 + 5172) = -1;
*(_DWORD *)(v4 + 5168) = 4;
v29 = *(_QWORD *)(a1 + 1504);
v30 = v29 + ((v66 >> 9) & 0x7FFFFFFFF8i64);
do
{
*v26++ = v30;
v30 = v29 + ((v30 >> 9) & 0x7FFFFFFFF8i64);
--v28;
}
while( v28 );
do
v27 = (unsigned int)(v27 - 1);
while( (_DWORD)v27 && (*(_DWORD *)v65[v27] & 0x80) == 0 );
v31 = (_QWORD *)v65[v27];
*(_QWORD *)(v4 + 5160) = v31;
*(_QWORD *)(v4 + 5152) = *v31;
}
RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
*v61 = v62 ^ (v62 ^ (*(_QWORD *)(v4 + 5144) << 12)) & 0xFFFFFFFFF000i64;
**(_QWORD **)(v4 + 5160) = *(_QWORD *)(v4 + 5152) | 0x42i64;
v32 = __readcr4();
if( (v32 & 0x20080) != 0 )
{
__writecr4(v32 ^ 0x80);
__writecr4(v32);
}
else
{
v33 = __readcr3();
__writecr3(v33);
}
v34 = (volatile signed __int32 *)(v4 + 5168);
if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
_InterlockedAnd(v34, 0xFFFFFFFB);
if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
{
v35 = (char *)(v4 + 1024);
v36 = (_QWORD *)(v4 + 1024);
*(_DWORD *)(v4 + 5172) = *((_DWORD *)KeGetPcr() + 105);
v67 = (_QWORD *)(v4 + 1024);
v37 = (_QWORD *)(v4 + 5136);
v38 = 0;
while( 1 )
{
v39 = (_QWORD *)v66;
if( (*(_DWORD *)(a1 + 2452) & 0x20000) == 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
**(_QWORD **)(a1 + 1216) = a1 - 0x5C5FC0A76E374B18i64;
**(_QWORD **)(a1 + 1224) = CurrentPrcb;
v36 = v67;
**(_QWORD **)(a1 + 1232) = v38 + v66;
**(_QWORD **)(a1 + 1240) = 276i64;
}
*v37 = v38 + v66;
if( _InterlockedCompareExchange(v34, 2, 0) )
break;
if( (v38 & 7) == 0 )
{
v41 = ((__int64(__fastcall *)(unsigned __int64, unsigned __int64, _QWORD))(a1 + 2206))(
v38 + v66,
0xC3C3C3C3C3C3C3C3ui64,
*v36);
v37 = (_QWORD *)(v4 + 5136);
if( !v41 )
{
_InterlockedAnd(v34, 0xFFFFFFFD);
LABEL_38:
v39 = (_QWORD *)v66;
break;
}
}
((void(__fastcall *)(_QWORD *))(a1 + 2195))(v37);
_InterlockedAnd(v34, 0xFFFFFFFD);
v37 = (_QWORD *)(v4 + 5136);
v36 = (_QWORD *)((char *)v67 + 1);
++v38;
v67 = (_QWORD *)((char *)v67 + 1);
if( v38 >= 0x1000 )
goto LABEL_38;
}
v42 = 4096;
if( v38 != 4096 )
{
_InterlockedOr(v34, 8u);
*v37 = (char *)v39 + 4095;
}
v43 = v39;
v44 = 512i64;
do
{
v42 -= 8;
*v43 = *(_QWORD *)v35;
v35 += 8;
++v43;
--v44;
}
while( v44 );
for( ; v42; --v42 )
{
v45 = *v35++;
*(_BYTE *)v43 = v45;
v43 = (_QWORD *)((char *)v43 + 1);
}
_InterlockedOr(v34, 4u);
v12 = (_WORD *)(v4 + 288);
v9 = (_WORD *)(v4 + 32);
if( (*(_DWORD *)(a1 + 2452) & 0x20000) == 0 )
{
**(_QWORD **)(a1 + 1216) = 0xA3A03F5891C8B4E8ui64;
**(_QWORD **)(a1 + 1224) = 0i64;
**(_QWORD **)(a1 + 1232) = 0i64;
**(_QWORD **)(a1 + 1240) = 0i64;
}
}
RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
**(_QWORD **)(v4 + 5160) = *(_QWORD *)(v4 + 5152);
*v61 = v62;
v46 = __readcr4();
if( (v46 & 0x20080) != 0 )
{
__writecr4(v46 ^ 0x80);
__writecr4(v46);
}
else
{
v47 = __readcr3();
__writecr3(v47);
}
v48 = *(_DWORD *)(v4 + 5168);
if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
{
*(_QWORD *)(v4 + 5120) = 0i64;
v49 = 4096;
*(_QWORD *)(v4 + 5128) = 0i64;
v50 = 512i64;
*(_QWORD *)(v4 + 5136) = 0i64;
*(_QWORD *)(v4 + 5152) = 0i64;
*(_QWORD *)(v4 + 5160) = 0i64;
*(_QWORD *)(v4 + 5168) = 0i64;
v51 = (_QWORD *)(v4 + 1024);
do
{
*v51 = 0i64;
v49 -= 8;
++v51;
--v50;
}
while( v50 );
for( ; v49; --v49 )
{
*(_BYTE *)v51 = 0;
v51 = (_QWORD *)((char *)v51 + 1);
}
v52 = v63;
v53 = 16;
v54 = 2i64;
do
{
v53 -= 8;
*(_QWORD *)v9 = *(_QWORD *)v52;
v52 += 8;
v9 += 4;
--v54;
}
while( v54 );
for( ; v53; --v53 )
{
v55 = *v52++;
*(_BYTE *)v9 = v55;
v9 = (_WORD *)((char *)v9 + 1);
}
v56 = 16;
v57 = v64;
v58 = 2i64;
do
{
v56 -= 8;
*(_QWORD *)v12 = *(_QWORD *)v57;
v57 += 8;
v12 += 4;
--v58;
}
while( v58 );
for( ; v56; --v56 )
{
v59 = *v57++;
*(_BYTE *)v12 = v59;
v12 = (_WORD *)((char *)v12 + 1);
}
}
RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
}
while( (v48 & 8) != 0 );
_enable();
}
else if( !*(_DWORD *)(a1 + 2296) )
{
*(_QWORD *)(a1 + 2320) = 257i64;
*(_QWORD *)(a1 + 2328) = 0i64;
*(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
*(_DWORD *)(a1 + 2296) = 1;
*(_QWORD *)(a1 + 2312) = (char *)v2 - 0x4C48B4211BBACBEBi64;
__b8(a1, 0i64);
}
return a1;
}Referenced by:
No references.