ObfDereferenceDeviceMap

VOID __stdcall ObfDereferenceDeviceMap(_DEVICE_MAP *DeviceMap){
  signed __int32 ReferenceCount; 
  bool v3; 
  signed __int32 v4; 
  _ESERVERSILO_GLOBALS *ServerSiloGlobals; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR v7; 
  _EJOB *ServerSilo; 

  ReferenceCount = DeviceMap->ReferenceCount;
  if( ReferenceCount != 1 )
  {
    do
    {
      v4 = _InterlockedCompareExchange(&DeviceMap->ReferenceCount, ReferenceCount - 1, ReferenceCount);
      v3 = ReferenceCount == v4;
      ReferenceCount = v4;
      if( v3 )
        goto LABEL_3;
    }
    while( v4 != 1 );
  }
  ServerSiloGlobals = PsGetServerSiloGlobals(DeviceMap->ServerSilo);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.SpecialApcDisable;
  v7 = (_DWORD)ServerSiloGlobals + 120;
  ExAcquirePushLockExclusiveEx(&ServerSiloGlobals->ObSiloState.DeviceMapLock, 0i64);
  ReferenceCount = _InterlockedExchangeAdd(&DeviceMap->ReferenceCount, 0xFFFFFFFF);
  if( ReferenceCount != 1 )
  {
    ExReleasePushLockEx(v7, 0);
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
LABEL_3:
    if( ReferenceCount <= 0 )
      __fastfail(0xEu);
    return;
  }
  DeviceMap->DosDevicesDirectory->DeviceMap = 0i64;
  ExReleasePushLockEx(v7, 0);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  ServerSilo = DeviceMap->ServerSilo;
  if( ServerSilo )
    ObfDereferenceObjectWithTag(ServerSilo, 0x6D44624Fui64);
  ZwClose((_HANDLE)DeviceMap->DosDevicesDirectoryHandle);
  HalPutDmaAdapter((PADAPTER_OBJECT)DeviceMap->DosDevicesDirectory);
  ExFreePoolWithTag(DeviceMap, 0x6D44624Fu);
}

Referenced by:

ObCleanupSiloState
ObDereferenceDeviceMap
ObQueryDeviceMapInformation
ObSetCurrentProcessDeviceMap
ObpLookupObjectName
ObpSetDeviceMap
SeGetTokenDeviceMap
SepDeReferenceLogonSession
SepDeleteLogonSessionTrack