SeReportSecurityEventWithSubCategory

NTSTATUS __stdcall SeReportSecurityEventWithSubCategory(
        UINT64 Flags,
        _UNICODE_STRING *SourceName,
        VOID *UserSid,
        _SE_ADT_PARAMETER_ARRAY *AuditParameters,
        UINT64 AuditFlatSubCategoryId){
  unsigned __int8 *v8; 
  unsigned __int16 Type; 
  __int64 v11; 
  _SECURITY_SUBJECT_CONTEXT *v12; 
  unsigned int AuditId; 
  int v14; 
  __int64 v15; 
  unsigned int v16; 
  unsigned int ParameterCount; 
  int Length; 
  _QWORD SubjectContext[6]; 
  _SE_ADT_PARAMETER_ARRAY AuditParametersa; 

  v8 = 0i64;
  memset(&SubjectContext[1], 0, 32);
  if( (_DWORD)Flags )
    return -1073741811;
  if( !SourceName )
    return -1073741811;
  if( !SourceName->Buffer )
    return -1073741811;
  if( !SourceName->Length )
    return -1073741811;
  if( !AuditParameters )
    return -1073741811;
  if( (unsigned int)(AuditFlatSubCategoryId - 100) > 0x3A )
    return -1073741811;
  if( AuditParameters->ParameterCount > 0x1C )
    return -1073741811;
  Type = AuditParameters->Type;
  if( (Type & 0x18) == 0 )
    return -1073741811;
  LOBYTE(SubjectContext[0]) = KeGetCurrentIrql();
  if( LOBYTE(SubjectContext[0]) < 2u )
  {
    if( UserSid )
    {
      v8 = (unsigned __int8 *)UserSid;
    }
    else
    {
      SeCaptureSubjectContext((INT64)&SubjectContext[1]);
      v11 = SubjectContext[3];
      Type = AuditParameters->Type;
      if( SubjectContext[1] )
        v11 = SubjectContext[1];
      v8 = **(unsigned __int8 ***)(v11 + 152);
    }
    v12 = (_SECURITY_SUBJECT_CONTEXT *)&SubjectContext[1];
    if( v8 == UserSid )
      v12 = 0i64;
    if( !SepAdtAuditThisEventWithContext((unsigned int)AuditFlatSubCategoryId, Type == 8, Type == 16, v12) )
      goto LABEL_11;
    Type = AuditParameters->Type;
    goto LABEL_21;
  }
  if( SepAuditingForSubCategory((unsigned int)AuditFlatSubCategoryId, Type == 8) )
  {
    v8 = (unsigned __int8 *)UserSid;
    if( !UserSid )
      v8 = (unsigned __int8 *)SeLocalSystemSid;
LABEL_21:
    memset(&AuditParametersa, 0i64, sizeof(AuditParametersa));
    AuditId = AuditParameters->AuditId;
    AuditParametersa.CategoryId = AuditParameters->CategoryId;
    v14 = v8[1];
    AuditParametersa.AuditId = AuditId;
    AuditParametersa.FlatSubCategoryId = AuditFlatSubCategoryId;
    AuditParametersa.Type = Type;
    AuditParametersa.Parameters[0].Type = SeAdtParmTypeSid;
    AuditParametersa.Parameters[0].Length = 4 * v14 + 8;
    AuditParametersa.Parameters[1].Address = (void *)&SeSubsystemName;
    AuditParametersa.Parameters[0].Address = v8;
    AuditParametersa.Parameters[1].Type = SeAdtParmTypeString;
    AuditParametersa.Parameters[1].Length = 32;
    AuditParametersa.ParameterCount = 2;
    if( (_DWORD)AuditFlatSubCategoryId == 122 )
    {
      AuditParametersa.Flags |= 6u;
      Length = SourceName->Length;
      AuditParametersa.Parameters[2].Type = SeAdtParmTypeString;
      v15 = 3i64;
      AuditParametersa.Parameters[2].Length = Length + 16;
      AuditParametersa.Parameters[2].Address = SourceName;
      AuditParametersa.ParameterCount = 3;
    }
    else
    {
      v15 = 2i64;
      v16 = AuditParametersa.Flags | 8;
      AuditParametersa.Flags |= 8u;
      if( AuditId < 0x5FF )
        AuditParametersa.Flags = v16 | 2;
    }
    ParameterCount = AuditParameters->ParameterCount;
    memmove(&AuditParametersa.Parameters[v15], AuditParameters->Parameters, 32 * ParameterCount);
    AuditParametersa.ParameterCount += ParameterCount;
    SepAdtLogAuditRecord(&AuditParametersa);
  }
LABEL_11:
  if( LOBYTE(SubjectContext[0]) < 2u && v8 && v8 != UserSid )
    SeReleaseSubjectContext((PSECURITY_SUBJECT_CONTEXT)&SubjectContext[1]);
  return 0;
}

Referenced by:

CmpReportAuditVirtualizationEvent
SeReportSecurityEvent