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.