KeAbCrossThreadDelete
char __fastcall KeAbCrossThreadDelete(unsigned __int64 a1, ULONG_PTR a2){
__int64 v4;
int v5;
unsigned __int64 v6;
int SessionId;
unsigned int v8;
__m128i *v9;
int v10;
__int128 v11;
unsigned __int8 v12;
__int64 v13;
__int128 v14;
unsigned __int8 v15;
__int64 v17;
unsigned __int8 CurrentIrql;
__int64 v19;
char v20;
int v21;
int v23[8];
_KPRCB *ControlPrcb;
__int128 v25;
__int128 Object;
__int128 v27;
__int128 v28;
_KDPC BugCheckParameter2;
UINT64 SpinCount;
_KSHARED_READY_QUEUE *ControlReadyQueue;
Object = 0i64;
v27 = 0i64;
v28 = 0i64;
memset((INT64)&BugCheckParameter2, 0i64);
LODWORD(v4) = *(char *)(a2 + 792);
v5 = v4 | *(char *)(a2 + 870);
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
if( v5 != 63 )
{
v6 = a1 & 0x7FFFFFFFFFFFFFFCi64;
if( (unsigned int)MmIsSessionAddress((PVOID)a1) )
SessionId = MmGetSessionIdEx(*((_QWORD *)KeGetCurrentThread() + 23));
else
SessionId = -1;
LODWORD(v4) = *(char *)(a2 + 792);
v8 = (v4 | *(char *)(a2 + 870)) ^ 0x3F;
while( 1 )
{
if( !_BitScanReverse((unsigned int *)&v17, v8) )
return v4;
v9 = (__m128i *)(*(_QWORD *)(a2 + 800) + 96 * v17);
v8 &= ~(1 << v17);
v4 = v9[2].m128i_i64[0] & 0x7FFFFFFFFFFFFFFCi64;
if( v4 == v6 )
{
*(_QWORD *)&v11 = v9[2].m128i_i64[0];
*((_QWORD *)&v11 + 1) = _mm_srli_si128(v9[2], 8).m128i_u64[0];
v12 = _InterlockedCompareExchange128(
v9[2].m128i_i64,
*((signed __int64 *)&v11 + 1),
v11,
(signed __int64 *)&v11);
LOBYTE(v4) = v11;
v10 = DWORD2(v11);
v13 = v11;
v25 = v11;
if( v12
|| (*(_QWORD *)&v14 = v9[2].m128i_i64[0],
*((_QWORD *)&v14 + 1) = _mm_srli_si128(v9[2], 8).m128i_u64[0],
v15 = _InterlockedCompareExchange128(
v9[2].m128i_i64,
*((signed __int64 *)&v14 + 1),
v14,
(signed __int64 *)&v14),
LOBYTE(v4) = v14,
v10 = DWORD2(v14),
v13 = v14,
v25 = v14,
v15) )
{
if( (v9[1].m128i_i8[10] & 1) != 0 )
{
LOBYTE(v4) = v13 & 0xFC;
if( (v13 & 0x7FFFFFFFFFFFFFFCi64) == v6 && v10 == SessionId )
break;
}
}
}
}
if( v13 >= 0 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a2 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(a2 + 64) );
}
KiAcquireThreadStateLock((_ETHREAD *)a2, &ControlPrcb, &ControlReadyQueue);
if( v20 == 2 )
{
v21 = *(_DWORD *)(a2 + 536);
KiReleaseThreadStateLock(v19, (__int64)ControlPrcb, (volatile signed __int64 *)ControlReadyQueue);
KiReleaseThreadLockSafe(a2);
__writecr8(CurrentIrql);
BugCheckParameter2.DpcData = 0i64;
*(_QWORD *)&v27 = (char *)&Object + 8;
*((_QWORD *)&Object + 1) = (char *)&Object + 8;
BugCheckParameter2.DeferredRoutine = (void(__fastcall *)(_KDPC *, void *, void *, void *))KeAbCrossThreadDeleteDpcRoutine;
BugCheckParameter2.DeferredContext = &Object;
*((_QWORD *)&v27 + 1) = a1;
*(_QWORD *)&v28 = v9;
*((_QWORD *)&v28 + 1) = a2;
LOWORD(Object) = 1;
BYTE2(Object) = 6;
DWORD1(Object) = 0;
LOWORD(BugCheckParameter2.TargetInfoAsUlong) = 275;
BugCheckParameter2.ProcessorHistory = 0i64;
BugCheckParameter2.Number = v21 + 1280;
KiInsertQueueDpc(&BugCheckParameter2, 0i64, 0i64, 0i64, 0);
KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
LABEL_25:
_InterlockedOr(v23, 0);
LOBYTE(v4) = KiAbCrossThreadRelease(a1, (unsigned __int64)v9, a2);
return v4;
}
if( *(_BYTE *)(a2 + 113) )
{
KiReleaseThreadStateLock(v19, (__int64)ControlPrcb, (volatile signed __int64 *)ControlReadyQueue);
KiReleaseThreadLockSafe(a2);
__writecr8(CurrentIrql);
KeGenericCallDpc((PKDEFERRED_ROUTINE)KeAbCrossThreadDeleteNopDpcRoutine, 0i64);
}
else
{
KiReleaseThreadStateLock(v19, (__int64)ControlPrcb, (volatile signed __int64 *)ControlReadyQueue);
KiReleaseThreadLockSafe(a2);
__writecr8(CurrentIrql);
}
}
v9[2].m128i_i8[0] |= 1u;
goto LABEL_25;
}
return v4;
}Referenced by:
KeDeleteMutant