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.