KiDetachProcess
VOID __fastcall KiDetachProcess(KAPC_STATE *ApcState, UINT64 Force){
INT64 *v2;
INT64 v3;
__int64 v4;
_ETHREAD *CurrentThread;
unsigned __int64 v6;
char v7;
volatile signed __int32 *v9;
int v10;
struct _KPRCB *CurrentPrcb;
_QWORD *v12;
_QWORD *v13;
_QWORD *v14;
__int64 v15;
_QWORD *v16;
struct _KPRCB *v17;
unsigned __int64 v18;
INT64 v19;
unsigned __int64 v20;
__int64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
char v24;
unsigned __int8 v25;
unsigned __int32 v26;
unsigned __int32 v27;
signed __int64 *v28;
signed __int64 v29;
_QWORD *v30;
_QWORD *v31;
__int64 v32;
unsigned __int8 v33;
struct _KPRCB *v34;
__int64 v35;
int v36;
unsigned __int64 v37;
INT64 v38;
INT64 v39;
INT64 v40;
INT64 v41;
INT64 v42;
INT64 v43;
INT64 v44;
UINT64 SpinCount;
UINT64 v46;
__int64 CurrentIrql;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = 2i64;
v7 = Force;
v9 = (volatile signed __int32 *)*((_QWORD *)CurrentThread + 23);
v10 = Force & 2;
if( (Force & 2) != 0 )
{
LOBYTE(v4) = 15;
CurrentIrql = v4;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentThread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)CurrentThread + 8) );
v32 = *((_QWORD *)CurrentPrcb + 4247);
if( v32 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v32 + 24);
}
LOBYTE(v4) = CurrentIrql;
v6 = 2i64;
}
if( *((_BYTE *)CurrentThread + 193) )
{
do
{
if( *((_WORD *)CurrentThread + 243) || (_BYTE)v4 )
break;
KiReleaseThreadLockSafe((INT64)CurrentThread);
__writecr8((unsigned __int8)CurrentIrql);
v33 = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentIrql = v33;
v34 = KeGetCurrentPrcb();
LODWORD(v46) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentThread + 16, 0i64) )
{
do
KeYieldProcessorEx(&v46);
while( *((_QWORD *)CurrentThread + 8) );
v35 = *((_QWORD *)v34 + 4247);
if( v35 && *((_BYTE *)v34 + 32) <= 1u )
{
v36 = *(_DWORD *)(v35 + 24) + 1;
*(_DWORD *)(v35 + 24) = v36;
}
}
LOBYTE(v4) = CurrentIrql;
}
while( *((_BYTE *)CurrentThread + 193) );
v6 = 2i64;
}
if( !*((_BYTE *)CurrentThread + 586)
|| (*((_BYTE *)CurrentThread + 192) & 1) != 0
|| (v12 = (_QWORD *)((char *)CurrentThread + 152), (_QWORD *)*v12 != v12)
|| *((_ETHREAD **)CurrentThread + 21) != (_ETHREAD *)((char *)CurrentThread + 168) )
{
KeBugCheck(6ui64);
}
*((_DWORD *)CurrentThread + 29) |= 0x800u;
v13 = (_QWORD *)((char *)CurrentThread + 600);
if( ApcState == (KAPC_STATE *)((char *)CurrentThread + 600) )
{
*((_QWORD *)CurrentThread + 23) = *((_QWORD *)CurrentThread + 79);
*((_BYTE *)CurrentThread + 192) = *((_BYTE *)CurrentThread + 640);
*((_BYTE *)CurrentThread + 193) = *((_BYTE *)CurrentThread + 641);
*((_BYTE *)CurrentThread + 194) = *((_BYTE *)CurrentThread + 642);
v14 = (_QWORD *)*v13;
if( (_QWORD *)*v13 == v13 )
{
*((_QWORD *)CurrentThread + 20) = (char *)CurrentThread + 152;
*v12 = v12;
*((_BYTE *)CurrentThread + 193) = 0;
}
else
{
v30 = (_QWORD *)*((_QWORD *)CurrentThread + 76);
*v12 = v14;
*((_QWORD *)CurrentThread + 20) = v30;
v14[1] = v12;
*v30 = v12;
}
v15 = *((_QWORD *)CurrentThread + 77);
v16 = (_QWORD *)((char *)CurrentThread + 168);
if( (_ETHREAD *)v15 == (_ETHREAD *)((char *)CurrentThread + 616) )
{
*((_QWORD *)CurrentThread + 22) = (char *)CurrentThread + 168;
*v16 = v16;
*((_BYTE *)CurrentThread + 194) = 0;
}
else
{
v31 = (_QWORD *)*((_QWORD *)CurrentThread + 78);
*v16 = v15;
*((_QWORD *)CurrentThread + 22) = v31;
*(_QWORD *)(v15 + 8) = v16;
*v31 = v16;
}
*((_QWORD *)CurrentThread + 79) = 0i64;
*((_BYTE *)CurrentThread + 586) = 0;
}
else
{
KiMoveApcState(ApcState, (_KAPC_STATE *)((char *)CurrentThread + 152));
}
if( !v10 )
{
*((_QWORD *)CurrentThread + 8) = 0i64;
v17 = KeGetCurrentPrcb();
if( *((_QWORD *)v17 + 4247) )
{
if( *((_BYTE *)v17 + 32) <= 1u && !(_DWORD)v16 )
{
LOBYTE(v4) = CurrentIrql;
v6 = 2i64;
}
}
}
v18 = (unsigned __int64)KeGetCurrentPrcb();
v19 = *((_QWORD *)CurrentThread + 23);
v20 = *(unsigned __int8 *)(v18 + 209);
v21 = 8i64 * *(unsigned __int8 *)(v18 + 208) + 376;
_interlockedbittestandset64((volatile signed __int32 *)(v21 + v19), v20);
v22 = *(_QWORD *)(v19 + 40);
if( (_BYTE)KiKvaShadow )
{
v23 = *(_QWORD *)(v19 + 40);
if( (v22 & 2) != 0 )
v23 = v22 | 0x8000000000000000ui64;
__writegsqword(0x9000u, v23);
KiSetAddressPolicy(*(_BYTE *)(v19 + 912));
LOBYTE(v4) = CurrentIrql;
v6 = 2i64;
}
__writecr3(v22);
if( !KiFlushPcid && (_BYTE)KiKvaShadow )
{
v18 = __readcr4();
if( (v18 & 0x20080) != 0 )
{
__writecr4(v18 ^ 0x80);
__writecr4(v18);
}
else
{
v37 = __readcr3();
__writecr3(v37);
}
}
_interlockedbittestandreset64((volatile signed __int32 *)((char *)v9 + v21), v20);
*((_DWORD *)CurrentThread + 29) &= ~0x800u;
if( !v10 )
__writecr8((unsigned __int8)v4);
if( (v7 & 1) == 0 && (_InterlockedExchangeAdd(v9 + 210, 0xFFFFFFF8) & 0xFFFFFFF8) == 8 )
{
v24 = 0;
v25 = KeGetCurrentIrql();
__writecr8(v6);
KiAcquireKobjectLockSafe((PVOID)v9);
v26 = *((_DWORD *)v9 + 210);
if( (v26 & 7) == 0 )
{
v18 = (unsigned __int64)(v9 + 12);
if( *(_QWORD *)v18 != v18 && v26 < 8 )
{
while( 1 )
{
v18 = v26 & 0xFFFFFFF8 | 3;
v27 = v26;
v26 = _InterlockedCompareExchange(v9 + 210, v18, v26);
if( v27 == v26 )
break;
if( v26 >= 8 )
goto LABEL_36;
}
v24 = 1;
}
}
LABEL_36:
_InterlockedAnd(v9, 0xFFFFFF7F);
if( v24 )
{
v28 = (signed __int64 *)(v9 + 90);
_m_prefetchw(&KiProcessOutSwapListHead);
v29 = KiProcessOutSwapListHead;
do
{
*v28 = v29;
v18 = v29;
v29 = _InterlockedCompareExchange64(&KiProcessOutSwapListHead, (signed __int64)v28, v29);
}
while( v29 != v18 );
if( !v29 )
KeSetEvent(&KiSwapEvent, 10);
}
__writecr8(v25);
}
if( (_QWORD *)*v12 != v12 )
{
LOBYTE(v18) = 1;
*((_BYTE *)CurrentThread + 193) = 1;
HalRequestSoftwareInterrupt((VOID *)v18, v19, v2, v3, v38, v39, v40, v41, v42, v43, v44);
}
}Referenced by:
KeDetachProcess
KeUnstackDetachProcess
KiUnstackDetachProcess
MiTrimOrAgeWorkingSet