CmpCheckKeyBodyAccess

UINT8 __stdcall CmpCheckKeyBodyAccess(
        CM_KEY_BODY *KeyBody,
        CM_TRANS *CmTrans,
        ACCESS_STATE *AccessState,
        INT8 AccessMode,
        INT64 *AccessStatus){
  INT64 v9; 
  int v10; 
  _LIST_ENTRY *v11; 
  UINT8 v12; 
  unsigned int v13; 
  _UNICODE_STRING *v14; 
  _KPROCESSOR_MODE AccessModea; 
  int started; 
  unsigned int GrantedAccess; 
  PPRIVILEGE_SET Privileges; 
  INT64 v20[2]; 
  PPRIVILEGE_SET v21[2]; 

  GrantedAccess = 0;
  Privileges = 0i64;
  *(_OWORD *)v20 = 0i64;
  WORD1(v20[0]) = -1;
  *(_OWORD *)v21 = 0i64;
  if( CmpIsKeyDeletedForKeyBody(KeyBody, CmTrans) )
  {
    v10 = -1073741444;
    started = -1073741444;
    goto LABEL_13;
  }
  started = CmpStartKcbStackForTopLayerKcb((INT64)v20, (INT64)KeyBody->KeyControlBlock);
  v10 = started;
  if( started < 0 )
  {
LABEL_13:
    v12 = 0;
    goto LABEL_10;
  }
  v11 = CmpGetSecurityCacheEntryForKcbStack((INT64)v20, (INT64)CmTrans, v9) + 2;
  SeLockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
  LOBYTE(AccessModea) = AccessMode;
  v12 = (unsigned __int8)SeAccessCheck(
                           v11,
                           (PSECURITY_SUBJECT_CONTEXT)AccessState + 1,
                           1u,
                           *((_DWORD *)AccessState + 4),
                           *((_DWORD *)AccessState + 5),
                           &Privileges,
                           (PGENERIC_MAPPING)((char *)CmKeyObjectType + 76),
                           AccessModea,
                           &GrantedAccess,
                           &started);
  if( Privileges )
  {
    SeAppendPrivileges(AccessState, Privileges);
    CmSiFreeMemory(Privileges);
  }
  if( v12 )
  {
    v13 = GrantedAccess;
    *((_DWORD *)AccessState + 5) |= GrantedAccess;
    *((_DWORD *)AccessState + 4) &= ~(v13 | 0x2000000);
  }
  *((_WORD *)KeyBody + 24) |= 2u;
  v14 = (_UNICODE_STRING *)(CmKeyObjectType + 2);
  if( CmTrans )
    SeOpenObjectAuditAlarmWithTransaction(
      v14,
      KeyBody,
      0i64,
      v11,
      AccessState,
      0,
      v12,
      AccessMode,
      &CmTrans->KtmUow,
      (UINT8 *)AccessState + 10);
  else
    SeOpenObjectAuditAlarm(v14, KeyBody, 0i64, v11, AccessState, 0, v12, AccessMode, (UINT8 *)AccessState + 10);
  *((_WORD *)KeyBody + 24) &= ~2u;
  SeUnlockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
  v10 = started;
LABEL_10:
  if( v21[1] )
  {
    CmSiFreeMemory(v21[1]);
    v10 = started;
  }
  *(_DWORD *)AccessStatus = v10;
  return v12;
}

Referenced by:

CmpDoAccessCheckOnKCB