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