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