EtwpDeleteRegistrationObject
VOID __stdcall EtwpDeleteRegistrationObject(VOID *Object){
__int64 v1;
__int64 v2;
_ETW_GUID_ENTRY *v4;
_ETHREAD *v5;
_QWORD *v6;
VOID **v7;
_QWORD *v8;
VOID **v9;
void *v10;
volatile __int64 *v11;
_ETW_QUEUE_ENTRY *v12;
_ETHREAD *CurrentThread;
_QWORD *v14;
VOID **v15;
_KQUEUE *v16;
_LIST_ENTRY *v17;
_LIST_ENTRY *v18;
_LIST_ENTRY *v19;
_ETW_REG_ENTRY *ReplyObject;
_KQUEUE *ReplyQueue;
_ETWP_NOTIFICATION_HEADER **v22;
_QWORD v23[10];
v1 = *((_QWORD *)Object + 4);
v2 = 4i64;
v4 = (_ETW_GUID_ENTRY *)*((_QWORD *)Object + 5);
if( (*((_BYTE *)Object + 98) & 4) == 0 )
{
if( v4 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&v4->Lock, 0i64);
v4->LockOwner = (_ETHREAD *)KeGetCurrentThread();
}
v5 = (_ETHREAD *)KeGetCurrentThread();
--v5->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(v1 + 408), 0i64);
*(_QWORD *)(v1 + 416) = KeGetCurrentThread();
v6 = *(_QWORD **)Object;
if( *(VOID **)(*(_QWORD *)Object + 8i64) == Object )
{
v7 = (VOID **)*((_QWORD *)Object + 1);
if( *v7 == Object )
{
*v7 = v6;
v6[1] = v7;
v8 = (_QWORD *)*((_QWORD *)Object + 2);
if( (VOID *)v8[1] == (char *)Object + 16 )
{
v9 = (VOID **)*((_QWORD *)Object + 3);
if( *v9 == (char *)Object + 16 )
{
*v9 = v8;
v8[1] = v9;
*(_QWORD *)(v1 + 416) = 0i64;
ExReleasePushLockEx(v1 + 408, 0);
KeLeaveCriticalRegion();
if( v4 )
{
v4->LockOwner = 0i64;
ExReleasePushLockEx((_DWORD)v4 + 408, 0);
KeLeaveCriticalRegion();
}
goto LABEL_10;
}
}
}
}
LABEL_26:
__fastfail(3u);
}
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&ExBootDevicesRemovedEvent + 170, 0i64);
v14 = *(_QWORD **)Object;
if( *(VOID **)(*(_QWORD *)Object + 8i64) != Object )
goto LABEL_26;
v15 = (VOID **)*((_QWORD *)Object + 1);
if( *v15 != Object )
goto LABEL_26;
*v15 = v14;
v14[1] = v15;
if( (_InterlockedExchangeAdd64((_QWORD *)&ExBootDevicesRemovedEvent + 170, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&ExBootDevicesRemovedEvent + 170);
KeAbPostRelease((char *)&ExBootDevicesRemovedEvent + 1360);
LABEL_10:
_InterlockedAnd16((volatile signed __int16 *)Object + 49, 0xFF7Fu);
v10 = (void *)*((unsigned __int16 *)Object + 49);
if( ((unsigned __int8)v10 & 2) != 0 )
{
v11 = (volatile __int64 *)((char *)Object + 48);
do
{
v12 = (_ETW_QUEUE_ENTRY *)_InterlockedExchange64(v11, 0i64);
if( v12 )
{
ReplyObject = v12->ReplyObject;
memset(v23, 0i64, 0x48u);
if( (ReplyObject->Flags & 0x40) == 0 )
{
ReplyQueue = (_KQUEUE *)ReplyObject->ReplyQueue;
*(_OWORD *)&v23[7] = *(_OWORD *)(v1 + 40);
v23[0] = 0x4800000001i64;
EtwpQueueReply(ReplyQueue, (_ETWP_NOTIFICATION_HEADER *)v23);
}
EtwpReleaseQueueEntry(v12, 2ui64);
}
++v11;
--v2;
}
while( v2 );
EtwpRundownNotifications(*((_EPROCESS **)Object + 10), (_ETW_REG_ENTRY *)Object);
ObfDereferenceObjectWithTag(*((VOID **)Object + 10), 0x52777445ui64);
EtwpReleaseProviderTraitsReference((_ETW_REG_ENTRY *)Object);
}
else
{
if( ((unsigned __int8)v10 & 4) == 0 )
KeBugCheckEx(0x11Du, (PVOID)3, Object, v10, 0i64);
v16 = (_KQUEUE *)*((_QWORD *)Object + 6);
v17 = KeRundownQueueEx(v16, 1u);
v18 = v17;
if( v17 )
{
v19 = v17;
do
{
v22 = (_ETWP_NOTIFICATION_HEADER **)v19;
v19 = v19->Flink;
EtwpUnreferenceDataBlock(v22[2]);
ExFreePoolWithTag(v22, 0);
}
while( v18 != v19 );
}
ExFreePoolWithTag(v16, 0);
}
EtwpUnreferenceGuidEntry((_ETW_GUID_ENTRY *)v1);
if( v4 )
EtwpUnreferenceGuidEntry(v4);
}Referenced by:
No references.