SeRegisterObjectTypeMandatoryPolicy
NTSTATUS __stdcall SeRegisterObjectTypeMandatoryPolicy(_OBJECT_TYPE *ObjectType, UINT64 MandatoryFlags){
_ETHREAD *CurrentThread;
char v3;
int v4;
int v6;
__int64 v7;
_OBJECT_TYPE **v8;
__int64 v9;
__int64 v10;
__int64 v11;
NTSTATUS v12;
char v13;
_ETHREAD *v14;
unsigned int SessionId;
unsigned __int8 v16;
int v17;
bool v18;
__int64 v19;
_KLOCK_ENTRY *v20;
int v21;
unsigned int v22;
__int64 v23;
UINT64 a3;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
v4 = MandatoryFlags;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&SepMandatoryObjectTypePolicyLock, 0i64);
v6 = SepMandatoryObjectTypePolicyCount;
v7 = 0i64;
if( !SepMandatoryObjectTypePolicyCount )
goto LABEL_7;
v8 = (_OBJECT_TYPE **)SepMandatoryObjectTypePolicy;
while( ObjectType != *v8 )
{
v7 = (unsigned int)(v7 + 1);
v8 += 3;
if( (unsigned int)v7 >= SepMandatoryObjectTypePolicyCount )
goto LABEL_5;
}
v3 = 1;
LABEL_5:
if( (unsigned int)v7 < 0x20 )
{
if( v3 )
{
v9 = (unsigned int)v7;
goto LABEL_8;
}
LABEL_7:
v9 = (unsigned int)v7;
v10 = 3 * v7;
SepMandatoryObjectTypePolicy[2 * v10 + 4] = 0;
SepMandatoryObjectTypePolicy[2 * v10 + 2] = 0;
*(_QWORD *)&SepMandatoryObjectTypePolicy[2 * v10] = ObjectType;
SepMandatoryObjectTypePolicyCount = v6 + 1;
LABEL_8:
v11 = 3 * v9;
SepMandatoryObjectTypePolicy[2 * v11 + 2] |= 1u;
SepMandatoryObjectTypePolicy[2 * v11 + 3] = v4;
if( (v4 & 1) != 0 )
SepMandatoryObjectTypePolicy[6 * v9 + 4] |= 0x100u;
if( (v4 & 2) != 0 )
SepMandatoryObjectTypePolicy[6 * v9 + 4] |= 0x200u;
if( (v4 & 4) != 0 )
SepMandatoryObjectTypePolicy[6 * v9 + 4] |= 0x400u;
v12 = 0;
goto LABEL_15;
}
v12 = -1073741823;
LABEL_15:
v13 = _InterlockedExchangeAdd64(&SepMandatoryObjectTypePolicyLock._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v13 & 2) != 0 && (v13 & 4) == 0 )
ExfTryToWakePushLock(&SepMandatoryObjectTypePolicyLock);
LODWORD(a3) = 0;
v14 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType((UINT64)&SepMandatoryObjectTypePolicyLock) == 1 )
SessionId = MmGetSessionIdEx(v14->Tcb.ApcState.Process);
else
SessionId = -1;
--v14->Tcb.SpecialApcDisable;
v16 = ++v14->Tcb.AbAllocationRegionCount;
v17 = ((char)v14->Tcb.AbEntrySummary | (char)v14->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v18 = !_BitScanReverse((unsigned int *)&v19, v17);
if( v18 )
break;
v20 = &v14->Tcb.LockEntries[v19];
v17 &= ~(1 << v19);
if( (v20->AcquiredByte & 1) != 0
&& (v20->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v20->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)&SepMandatoryObjectTypePolicyLock & 0x7FFFFFFFFFFFFFFCi64)
&& v20->LockState.SessionId == SessionId )
{
v20->AcquiredByte &= ~1u;
if( v20->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
{
if( v20 )
{
v20->CrossThreadReleasableAndBusyByte |= 2u;
if( v20->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v20);
v21 = v20->BoostBitmap.AllFields & 0x1FFFF;
v22 = v20->BoostBitmap.AllFields & 0xFFFE0000;
v20->ThreadLocalFlags &= ~1u;
LODWORD(a3) = v21;
v20->BoostBitmap.AllFields = v22;
v20->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v23 = v20 - v14->Tcb.LockEntries;
if( v16 == 1 )
v14->Tcb.AbEntrySummary |= 1 << v23;
else
_InterlockedOr8((volatile signed __int8 *)&v14->Tcb.AbOrphanedEntrySummary, 1 << v23);
goto LABEL_30;
}
break;
}
}
}
if( (*(&v14->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v14, &SepMandatoryObjectTypePolicyLock, (PVOID)SessionId, 0i64);
LABEL_30:
--v14->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v14->Tcb, &SepMandatoryObjectTypePolicyLock, &a3);
v18 = v14->Tcb.SpecialApcDisable++ == -1;
if( v18 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v14->Tcb.ApcState.ApcListHead[0].Flink != &v14->Tcb.152 )
KiCheckForKernelApcDelivery();
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v12;
}Referenced by:
PspInitPhase0
SepTokenInitialization