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