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