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