CmNotifyRunDown
void __fastcall CmNotifyRunDown(__int64 a1){
_QWORD *v2;
_QWORD *v3;
unsigned __int8 CurrentIrql;
_QWORD *v5;
__int64 *v6;
__int64 v7;
char *v8;
int v9;
_QWORD *v10;
_EWOW64PROCESS *WoW64Process;
_QWORD *v12;
unsigned __int16 Machine;
__int64 v14;
_QWORD *v15;
VOID **v16;
_QWORD *v17;
_QWORD *v18;
v2 = (_QWORD *)(a1 + 1096);
v3 = *(_QWORD **)(a1 + 1096);
if( v3 && v3 != v2 )
{
CmpLockRegistry();
ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
if( *v2 )
{
while( 1 )
{
v5 = (_QWORD *)(a1 + 1096);
v6 = *(__int64 **)(a1 + 1096);
if( v6 == (__int64 *)(a1 + 1096) )
break;
v7 = *v6;
if( (_QWORD *)v6[1] != v5 || *(__int64 **)(v7 + 8) != v6 )
LABEL_32:
__fastfail(3u);
*v5 = v7;
*(_QWORD *)(v7 + 8) = v5;
v8 = (char *)(v6 - 2);
v9 = *((_DWORD *)v8 + 14);
if( (v9 & 0x10000) != 0 )
{
if( (_WORD)v9 != 2 )
goto LABEL_27;
v10 = (_QWORD *)*((_QWORD *)v8 + 8);
if( (_QWORD *)v10[13] == v10 + 13 )
{
DbgPrint("IoStatusBlock pointing onto itself AsyncUser = %p\n", v10);
if( (_BYTE)KdDebuggerEnabled )
{
if( !(_BYTE)KdDebuggerNotPresent )
__debugbreak();
}
}
WoW64Process = KeGetCurrentThread()->ApcState.Process->WoW64Process;
if( WoW64Process && ((Machine = WoW64Process->Machine, Machine == 332) || Machine == 452) )
{
**(_DWORD **)(*((_QWORD *)v8 + 8) + 104i64) = 267;
*(_DWORD *)(*(_QWORD *)(*((_QWORD *)v8 + 8) + 104i64) + 4i64) = 0;
}
else
{
**(_DWORD **)(*((_QWORD *)v8 + 8) + 104i64) = 267;
*(_QWORD *)(*(_QWORD *)(*((_QWORD *)v8 + 8) + 104i64) + 8i64) = 0i64;
}
v12 = (_QWORD *)*((_QWORD *)v8 + 8);
if( (_QWORD *)v12[13] == v12 + 13 )
{
DbgPrint("IoStatusBlock pointing onto itself AsyncUser = %p\n", v12);
if( (_BYTE)KdDebuggerEnabled )
{
if( !(_BYTE)KdDebuggerNotPresent )
__debugbreak();
}
}
v14 = *((_QWORD *)v8 + 8);
if( *(_QWORD *)(v14 + 8) )
{
KeSetEvent(*(PRKEVENT *)(v14 + 8), 0, 0);
HalPutDmaAdapter(*(PADAPTER_OBJECT *)(*((_QWORD *)v8 + 8) + 8i64));
v14 = *((_QWORD *)v8 + 8);
}
if( !KeRemoveQueueApc(v14 + 16) )
{
LABEL_27:
v15 = *(_QWORD **)v8;
v16 = (VOID **)*((_QWORD *)v8 + 1);
if( *(char **)(*(_QWORD *)v8 + 8i64) != v8 || *v16 != v8 )
goto LABEL_32;
*v16 = v15;
v15[1] = v16;
CmpCancelSubordinatePost((INT64)v8, 0i64);
}
CmpFreeSubordinatePost((INT64)v8);
CmpFreePostBlock(v8);
}
else
{
v17 = v8 + 16;
v18 = *(_QWORD **)(a1 + 1104);
if( (_QWORD *)*v18 != v5 )
goto LABEL_32;
*v17 = v5;
v17[1] = v18;
*v18 = v17;
*(_QWORD *)(a1 + 1104) = v17;
}
}
}
__writecr8(CurrentIrql);
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
CmpUnlockRegistry();
}
}Referenced by:
PspExitThread