ObSetCurrentProcessDeviceMap

NTSTATUS __stdcall ObSetCurrentProcessDeviceMap(){
  _DEVICE_MAP *DeviceMap; 
  _ESERVERSILO_GLOBALS *CurrentServerSiloGlobals; 
  _EPROCESS *Process; 
  _ADAPTER_OBJECT *v3; 
  _KSPIN_LOCK *v4; 
  _ADAPTER_OBJECT *v5; 
  int TokenDeviceMap; 
  _KSPIN_LOCK *v7; 
  _DEVICE_MAP *SystemDeviceMap; 
  _ETHREAD *CurrentThread; 
  _DEVICE_MAP *ppDevMap; 
  _HALP_DMA_TRANSLATION_ENTRY *ScatterBufferListHead; 

  DeviceMap = 0i64;
  CurrentServerSiloGlobals = 0i64;
  Process = KeGetCurrentThread()->ApcState.Process;
  v3 = (_ADAPTER_OBJECT *)PsReferencePrimaryToken(Process);
  v5 = v3;
  if( !v3 )
    return -1073741700;
  TokenDeviceMap = 0;
  ScatterBufferListHead = v3->AdapterObject.ScatterBufferListHead;
  if( ScatterBufferListHead == (_HALP_DMA_TRANSLATION_ENTRY *)999 )
  {
    CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v4);
    SystemDeviceMap = CurrentServerSiloGlobals->ObSiloState.SystemDeviceMap;
  }
  else
  {
    ppDevMap = 0i64;
    TokenDeviceMap = SeGetTokenDeviceMap(v3, &ppDevMap);
    if( TokenDeviceMap < 0 )
      goto LABEL_14;
    SystemDeviceMap = ppDevMap;
  }
  if( SystemDeviceMap )
  {
    if( !CurrentServerSiloGlobals )
      CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v7);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.SpecialApcDisable;
    ExAcquirePushLockExclusiveEx(&CurrentServerSiloGlobals->ObSiloState.DeviceMapLock, 0i64);
    DeviceMap = (_DEVICE_MAP *)Process->DeviceMap;
    Process->DeviceMap = SystemDeviceMap;
    _InterlockedIncrement(&SystemDeviceMap->ReferenceCount);
    ExReleasePushLockEx((_DWORD)CurrentServerSiloGlobals + 120, 0);
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    goto LABEL_9;
  }
LABEL_14:
  TokenDeviceMap = -1073741767;
LABEL_9:
  HalPutDmaAdapter(v5);
  if( DeviceMap )
    ObfDereferenceDeviceMap(DeviceMap);
  return TokenDeviceMap;
}

Referenced by:

ObpLookupObjectName
ObpReferenceDeviceMap