ObpReferenceDeviceMap
_DEVICE_MAP *__stdcall ObpReferenceDeviceMap(UINT8 IgnoreImpersonation){
_ETHREAD *CurrentThread;
_DEVICE_MAP *SystemDeviceMap;
char v4;
_ADAPTER_OBJECT *v5;
INT64 Process;
_EJOB *v7;
_KSPIN_LOCK *v8;
_ESERVERSILO_GLOBALS *CurrentServerSiloGlobals;
_ETHREAD *v10;
ULONG_PTR v11;
_ADAPTER_OBJECT *v13;
_DEVICE_MAP *ppDevMap;
UINT8 EffectiveOnly;
UINT8 CopyOnOpen;
_SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
SystemDeviceMap = 0i64;
v4 = 0;
v5 = 0i64;
Process = (INT64)CurrentThread->Tcb.Process;
LODWORD(v7) = PsGetProcessServerSilo(Process);
if( v7 != PsGetCurrentServerSilo() )
v4 = 1;
if( (CurrentThread->CrossThreadFlags & 8) == 0 || IgnoreImpersonation )
{
if( !v4 )
goto LABEL_5;
}
else if( !v4 )
{
v13 = (_ADAPTER_OBJECT *)PsReferenceImpersonationTokenEx(
CurrentThread,
1ui64,
&CopyOnOpen,
&EffectiveOnly,
&ImpersonationLevel,
0i64);
v5 = v13;
if( !v13 )
goto LABEL_5;
if( v13->AdapterObject.ScatterBufferListHead != (_HALP_DMA_TRANSLATION_ENTRY *)999 )
{
ppDevMap = 0i64;
if( SeGetTokenDeviceMap(v13, &ppDevMap) >= 0 )
{
SystemDeviceMap = ppDevMap;
if( ppDevMap )
{
_InterlockedIncrement(&ppDevMap->ReferenceCount);
goto LABEL_11;
}
}
LABEL_5:
if( !*(_QWORD *)(Process + 1416) && ObSetCurrentProcessDeviceMap() < 0 )
goto LABEL_11;
goto LABEL_6;
}
v4 = 1;
}
LABEL_6:
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v8);
v10 = (_ETHREAD *)KeGetCurrentThread();
--v10->Tcb.SpecialApcDisable;
v11 = (_DWORD)CurrentServerSiloGlobals + 120;
ExAcquirePushLockSharedEx(&CurrentServerSiloGlobals->ObSiloState.DeviceMapLock, 0i64);
if( v4 )
SystemDeviceMap = CurrentServerSiloGlobals->ObSiloState.SystemDeviceMap;
else
SystemDeviceMap = *(_DEVICE_MAP **)(Process + 1416);
if( SystemDeviceMap )
_InterlockedIncrement(&SystemDeviceMap->ReferenceCount);
ExReleasePushLockEx(v11, 0);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
LABEL_11:
if( v5 )
HalPutDmaAdapter(v5);
return SystemDeviceMap;
}Referenced by:
ObQueryDeviceMapInformation
ObpLookupObjectName