DbgkpRemoveErrorPort
VOID __fastcall DbgkpRemoveErrorPort(_ETHREAD *Thread, VOID *Lock, UINT64 a3){
int v6;
PKINTERRUPT_ROUTINE **v7;
UINT32 v8;
PKINTERRUPT_ROUTINE *v9;
_EJOB *v10;
INT64 v11;
UINT64 v12;
if( !_interlockedbittestandset((volatile signed __int32 *)(a3 + 4), 0) )
{
v6 = 0;
--Thread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Lock, 0i64);
if( *((_QWORD *)Lock + 1) == a3 )
{
*((_QWORD *)Lock + 2) = 0i64;
*((_QWORD *)Lock + 1) = 0i64;
v6 = 1;
LODWORD(v10) = HalSystemVectorDispatchEntry(v8, v7, v9);
if( Lock == &PsGetServerSiloGlobals(v10)->DbgkSiloState )
_interlockedbittestandreset((volatile signed __int32 *)&KUSER_SHARED_DATA.SharedDataFlags, 0);
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Lock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)Lock);
KeAbPostRelease(Lock);
KeLeaveCriticalRegionThread(&Thread->Tcb);
if( v6 )
{
DbgkpDereferenceErrorPort(a3, v11, v12);
KeResetEvent(*((_KEVENT **)Lock + 3));
}
}
}Referenced by:
DbgkFlushErrorPort
DbgkpSendErrorMessage