SepRmCapUpdateWrkr

void __fastcall SepRmCapUpdateWrkr(__int64 a1, __int64 a2){
  INT64 v2; 
  int v4; 
  _ETHREAD *v5; 
  volatile INT64 *v6; 
  char v7; 
  _ETHREAD *CurrentThread; 
  __int64 v9; 
  v2 = *(unsigned int *)(a1 + 44);
  v9 = 0i64;
  v4 = SepBuildCapPolicyTable(v2, &v9);
  if( v4 < 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx((UINT64)&SepRmCapTableLock, 0i64);
    SepRmEnforceCap = 1;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&SepRmCapTableLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)&SepRmCapTableLock);
    KeAbPostRelease(&SepRmCapTableLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  else
  {
    if( v9 )
      *(_QWORD *)(v9 + 40) = 1i64;
    v5 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v5 + 242);
    ExAcquirePushLockExclusiveEx((UINT64)&SepRmCapTableLock, 0i64);
    v6 = (volatile INT64 *)SepRmCapTable;
    SepRmCapTable = (PRTL_DYNAMIC_HASH_TABLE)v9;
    SepRmEnforceCap = v9 != 0;
    if( v9 && InitSafeBootMode == 1 )
    {
      SepRmDereferenceCapTable((volatile INT64 *)SepRmCapTable);
      SepRmCapTable = 0i64;
      *(_QWORD *)(*(_QWORD *)(SepRmDefaultCap + 64) + 32i64) = SeDefaultRecoveryCapeSd;
    }
    v7 = _InterlockedExchangeAdd64((volatile signed __int64 *)&SepRmCapTableLock, 0xFFFFFFFFFFFFFFFFui64);
    if( (v7 & 2) != 0 && (v7 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)&SepRmCapTableLock);
    KeAbPostRelease(&SepRmCapTableLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    if( v6 )
      SepRmDereferenceCapTable(v6);
  }
  *(_DWORD *)(a2 + 40) = v4;
}

Referenced by:

No references.