MiInitializeSessionGlobals
NTSTATUS __stdcall MiInitializeSessionGlobals(){
_ETHREAD *CurrentThread;
_EPROCESS *Process;
char v3;
_KSPIN_LOCK *v4;
_KSPIN_LOCK *v5;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Process = CurrentThread->Tcb.Process;
if( (CurrentThread->Tcb.ApcState.Process->Flags & 0x10000) != 0 )
return -1073741791;
if( MmIsSessionLeaderProcess(CurrentThread->Tcb.Process) )
return 0;
if( qword_140C4DB00 )
{
if( PsIsCurrentThreadInServerSilo() )
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&Lock, 0i64);
if( !PsGetCurrentServerSiloGlobals(v4)->MiSessionLeaderProcess )
{
PsGetCurrentServerSiloGlobals(v5)->MiSessionLeaderProcess = Process;
ObfReferenceObject(Process);
}
if( (_InterlockedExchangeAdd64(&Lock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&Lock);
KeAbPostRelease(&Lock);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
if( MmIsSessionLeaderProcess(Process) )
return 0;
}
else
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&Lock, 0i64);
if( !qword_140C4DB00 )
{
qword_140C4DB00 = (__int64)Process;
qword_140C4CAD0 = (VOID *)(qword_140C4DB20 + 20480);
BitmapStart = (VOID *)(qword_140C4DB20 + 28672);
qword_140C4DB10 = qword_140C4DB20 + 576;
PsGetServerSiloGlobals(0i64)->MiSessionLeaderProcess = Process;
v3 = _InterlockedExchangeAdd64(&Lock._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v3 & 2) != 0 && (v3 & 4) == 0 )
ExfTryToWakePushLock(&Lock);
KeAbPostRelease(&Lock);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
ObfReferenceObject(Process);
return 0;
}
if( (_InterlockedExchangeAdd64(&Lock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&Lock);
KeAbPostRelease(&Lock);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( (_EPROCESS *)qword_140C4DB00 == Process )
return 0;
}
return -1073741796;
}Referenced by:
MiSessionCreate