WmipDeregisterRegEntry
VOID __stdcall WmipDeregisterRegEntry(_REGENTRY *RegEntry){
unsigned __int64 v2;
signed __int32 v3;
unsigned __int8 v4;
_REGENTRY **v5;
unsigned __int64 v6;
__int64 v7;
VOID *v8;
int Object[2];
_QWORD v10[4];
Object[1] = 0;
Object[0] = 393217;
v10[1] = v10;
v10[0] = v10;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
v2 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&ExBootDevicesRemovedEvent + 436);
*((_QWORD *)RegEntry + 5) = Object;
_m_prefetchw(RegEntry + 12);
v3 = _InterlockedOr(RegEntry + 12, 0xA0000000);
KxReleaseSpinLock((UINT64 *)&ExBootDevicesRemovedEvent + 436);
__writecr8(v2);
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
WmipUnreferenceRegEntry(RegEntry);
KeWaitForSingleObject((UINT64)Object, 0, 0, 0, 0i64);
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
v4 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&ExBootDevicesRemovedEvent + 436);
--dword_140C50314[0];
v5 = (_REGENTRY **)*((_QWORD *)RegEntry + 1);
v6 = v4;
v7 = *(_QWORD *)RegEntry;
if( *(_REGENTRY **)(*(_QWORD *)RegEntry + 8i64) != RegEntry || *v5 != RegEntry )
__fastfail(3u);
*v5 = (_REGENTRY *)v7;
*(_QWORD *)(v7 + 8) = v5;
KxReleaseSpinLock((UINT64 *)&ExBootDevicesRemovedEvent + 436);
__writecr8(v6);
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
if( (v3 & 0x10000000) == 0 )
ObfDereferenceObjectWithTag(*((VOID **)RegEntry + 2), 0x746C6644ui64);
v8 = (VOID *)*((_QWORD *)RegEntry + 3);
if( v8 )
ObfDereferenceObjectWithTag(v8, 0x746C6644ui64);
WmipRemoveDS(RegEntry);
ExFreeToNPagedLookasideList(&unk_140CEC980, RegEntry);
}Referenced by:
WmipDeregisterDevice
WmipRegisterDevice