PiUEventFreeClientRegistrationContext

void __fastcall PiUEventFreeClientRegistrationContext(PVOID P, char a2){
  _QWORD *v3; 
  PVOID *v4; 
  int v5; 
  INT64 *v6; 
  INT64 *v7; 
  int v8; 
  CHAR *v9; 
  int v10; 
  INT64 *v11; 
  INT64 *v12; 
  if( a2 )
  {
    ExAcquireFastMutex(&PiUEventClientRegistrationListLock);
    ExAcquireFastMutex(*((FAST_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 )
    {
      v8 = v5 - 1;
      if( v8 )
      {
        v10 = v8 - 1;
        if( v10 )
        {
          if( v10 == 1 )
            --PiUEventDevInstancePropertyClientCount;
        }
        else
        {
          --PiUEventDevInstanceClientCount;
        }
      }
      else
      {
        --PiUEventDevHandleClientCount;
      }
    }
    else
    {
      --PiUEventDevInterfaceClientCount;
    }
    v6 = (INT64 *)*((_QWORD *)P + 14);
    while( v6 != (INT64 *)((char *)P + 112) )
    {
      v11 = v6;
      v6 = (INT64 *)*v6;
      PiUEventDequeuePendingEventWorker((INT64)P, v11, 0);
    }
    v7 = (INT64 *)*((_QWORD *)P + 12);
    while( v7 != (INT64 *)((char *)P + 96) )
    {
      v12 = v7;
      v7 = (INT64 *)*v7;
      PiUEventDequeuePendingEventWorker((INT64)P, v12, 1);
    }
    KeReleaseGuardedMutex(*((_FAST_MUTEX **)P + 2));
    KeReleaseGuardedMutex(&PiUEventClientRegistrationListLock);
  }
  if( *((_DWORD *)P + 33) == 1 || *((_DWORD *)P + 33) == 2 || *((_DWORD *)P + 33) == 3 )
  {
    v9 = (CHAR *)*((_QWORD *)P + 3);
    if( v9 )
      PiDmObjectRelease(v9);
  }
  ZwDeleteWnfStateName((WNF_STATE_NAME *)P + 11);
  SeReleaseSubjectContext((_SECURITY_SUBJECT_CONTEXT *)((char *)P + 56));
  ExFreePoolWithTag(*((PVOID *)P + 2), 0x59706E50u);
  memset((INT64)P, 0i64);
  ExFreePoolWithTag(P, 0x59706E50u);
}

Referenced by:

PiUEventHandleRegistration