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