DbgkpCloseObject

void __fastcall DbgkpCloseObject(__int64 a1, __int64 a2, __int64 a3, unsigned __int64 a4){
  _QWORD *v5; 
  int v6; 
  UINT64 v7; 
  __int64 NextProcess; 
  OBJECT_ATTRIBUTES *v9; 
  UINT64 v10; 
  char v11; 
  _QWORD *v12; 
  if( a4 <= 1 )
  {
    ExAcquireFastMutex((FAST_MUTEX *)(a2 + 24));
    *(_DWORD *)(a2 + 96) |= 1u;
    v5 = *(_QWORD **)(a2 + 80);
    *(_QWORD *)(a2 + 80) = a2 + 80;
    *(_QWORD *)(a2 + 88) = a2 + 80;
    KeReleaseGuardedMutex((_FAST_MUTEX *)(a2 + 24));
    KeSetEvent((PRKEVENT)a2, 0);
    v6 = *(_DWORD *)(a2 + 96) & 2;
    NextProcess = PsGetNextProcess(0i64);
    if( NextProcess )
    {
      v11 = v6 != 0 ? 2 : 0;
      do
      {
        if( *(_QWORD *)(NextProcess + 1400) == a2 )
        {
          v11 &= ~1u;
          ExAcquireFastMutex(&DbgkpProcessDebugPortMutex);
          if( *(_QWORD *)(NextProcess + 1400) == a2 )
          {
            *(_QWORD *)(NextProcess + 1400) = 0i64;
            v11 |= 1u;
          }
          KeReleaseGuardedMutex(&DbgkpProcessDebugPortMutex);
          if( (v11 & 1) != 0 )
          {
            DbgkpMarkProcessPeb((PEPROCESS)NextProcess);
            if( (v11 & 2) != 0 )
              PsTerminateProcess(NextProcess, 0xC0000354);
            HalPutDmaAdapter((PADAPTER_OBJECT)a2);
          }
        }
        NextProcess = PsGetNextProcess((PVOID)NextProcess);
      }
      while( NextProcess );
    }
    while( v5 != (_QWORD *)(a2 + 80) )
    {
      v12 = v5;
      v5 = (_QWORD *)*v5;
      *((_DWORD *)v12 + 18) = -1073740972;
      DbgkpWakeTarget((PVOID *)v12, v7, v9, v10);
    }
  }
}

Referenced by:

No references.