SepRmCapUpdateWrkr
VOID __stdcall SepRmCapUpdateWrkr(_RM_COMMAND_MESSAGE *CommandMessage, _RM_REPLY_MESSAGE *ReplyMessage){
UINT64 v2;
NTSTATUS v4;
_ETHREAD *v5;
_RTL_DYNAMIC_HASH_TABLE *v6;
char v7;
_ETHREAD *CurrentThread;
_SEP_CENTRALIZED_ACCESS_POLICIES_TABLE *v9;
v2 = (unsigned int)CommandMessage[11];
v9 = 0i64;
v4 = SepBuildCapPolicyTable(v2, &v9);
if( v4 < 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&SepRmCapTableLock, 0i64);
SepRmEnforceCap = 1;
if( (_InterlockedExchangeAdd64(&SepRmCapTableLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&SepRmCapTableLock);
KeAbPostRelease(&SepRmCapTableLock);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
else
{
if( v9 )
*((_QWORD *)v9 + 5) = 1i64;
v5 = (_ETHREAD *)KeGetCurrentThread();
--v5->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&SepRmCapTableLock, 0i64);
v6 = SepRmCapTable;
SepRmCapTable = (_RTL_DYNAMIC_HASH_TABLE *)v9;
SepRmEnforceCap = v9 != 0i64;
if( v9 && InitSafeBootMode == 1 )
{
SepRmDereferenceCapTable((_SEP_CENTRALIZED_ACCESS_POLICIES_TABLE *)SepRmCapTable);
SepRmCapTable = 0i64;
*(_QWORD *)(*(_QWORD *)(SepRmDefaultCap + 64) + 32i64) = SeDefaultRecoveryCapeSd;
}
v7 = _InterlockedExchangeAdd64(&SepRmCapTableLock._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v7 & 2) != 0 && (v7 & 4) == 0 )
ExfTryToWakePushLock(&SepRmCapTableLock);
KeAbPostRelease(&SepRmCapTableLock);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v6 )
SepRmDereferenceCapTable((_SEP_CENTRALIZED_ACCESS_POLICIES_TABLE *)v6);
}
ReplyMessage[10] = v4;
}Referenced by:
No references.