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