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