PiUEventFreeClientRegistrationContext

VOID *__fastcall PiUEventFreeClientRegistrationContext(PVOID P, CHAR a2){
  _QWORD *v3; 
  PVOID *v4; 
  int v5; 
  _QWORD *v6; 
  _QWORD *v7; 
  int v9; 
  _PI_DM_OBJECT *v10; 
  int v11; 
  void *v12; 
  void *v13; 

  if( a2 )
  {
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 7040));
    ExAcquireFastMutex(*((PFAST_MUTEX *)P + 2));
    v3 = *(_QWORD **)P;
    if( *(PVOID *)(*(_QWORD *)P + 8i64) != P || (v4 = (PVOID *)*((_QWORD *)P + 1), *v4 != P) )
      __fastfail(3u);
    *v4 = v3;
    v3[1] = v4;
    v5 = *((_DWORD *)P + 33);
    if( v5 )
    {
      v9 = v5 - 1;
      if( v9 )
      {
        v11 = v9 - 1;
        if( v11 )
        {
          if( v11 == 1 )
            --*(&stru_140CF2E80 + 1630);
        }
        else
        {
          --PiUEventDevInstanceClientCount;
        }
      }
      else
      {
        --PiUEventDevHandleClientCount;
      }
    }
    else
    {
      --PiUEventDevInterfaceClientCount;
    }
    v6 = (_QWORD *)*((_QWORD *)P + 14);
    while( v6 != (_QWORD *)((char *)P + 112) )
    {
      v12 = v6;
      v6 = (_QWORD *)*v6;
      PiUEventDequeuePendingEventWorker((__int64)P, v12, 0);
    }
    v7 = (_QWORD *)*((_QWORD *)P + 12);
    while( v7 != (_QWORD *)((char *)P + 96) )
    {
      v13 = v7;
      v7 = (_QWORD *)*v7;
      PiUEventDequeuePendingEventWorker((__int64)P, v13, 1);
    }
    KeReleaseGuardedMutex(*((PKGUARDED_MUTEX *)P + 2));
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 7040));
  }
  if( *((_DWORD *)P + 33) == 1 || *((_DWORD *)P + 33) == 2 || *((_DWORD *)P + 33) == 3 )
  {
    v10 = (_PI_DM_OBJECT *)*((_QWORD *)P + 3);
    if( v10 )
      PiDmObjectRelease(v10);
  }
  ZwDeleteWnfStateName((_WNF_STATE_NAME *)P + 11);
  SeReleaseSubjectContext((PSECURITY_SUBJECT_CONTEXT)((char *)P + 56));
  ExFreePoolWithTag(*((PVOID *)P + 2), 0x59706E50u);
  memset(P, 0i64, 0x90u);
  return ExFreePoolWithTag(P, 0x59706E50u);
}

Referenced by:

PiUEventDispatch
PiUEventHandleRegistration