SeOperationAuditAlarm

VOID __stdcall SeOperationAuditAlarm(
        _UNICODE_STRING *CapturedSubsystemName,
        VOID *Object,
        VOID *HandleId,
        _UNICODE_STRING *ObjectTypeName,
        UINT64 AuditMask,
        VOID *UserSid,
        VOID *SecurityDescriptor){
  void *v7; 
  int v11; 
  _EPROCESS *CurrentThreadProcess; 
  unsigned __int64 UniqueProcessId; 
  NTSTATUS AllocatedFullProcessImageName; 
  void *PrimaryToken; 
  int v16; 
  unsigned __int64 v17; 
  unsigned int v18; 
  int v19; 
  unsigned int v20; 
  _SE_ADT_PARAMETER_TYPE v21; 
  int v22; 
  _SE_ADT_PARAMETER_TYPE v23; 
  unsigned int v24; 
  NTSTATUS v25; 
  unsigned int v26; 
  char NeedToFree[4]; 
  char SDLength[12]; 
  _UNICODE_STRING *ImageName; 
  _OBJECT_NAME_INFORMATION *ObjectNameInfo; 
  _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  _SE_ADT_PARAMETER_ARRAY AuditParameters; 

  v7 = SecurityDescriptor;
  *(_QWORD *)&SDLength[4] = SecurityDescriptor;
  ImageName = 0i64;
  ObjectNameInfo = 0i64;
  *(_DWORD *)SDLength = 0;
  NeedToFree[0] = 0;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  v11 = SepAdtClassifyObjectIntoSubCategory(Object, ObjectTypeName, 1u, 0);
  CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
  UniqueProcessId = (unsigned __int64)CurrentThreadProcess->UniqueProcessId;
  AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageNameEx(CurrentThreadProcess, &ImageName);
  if( AllocatedFullProcessImageName < 0 )
  {
LABEL_24:
    SepAuditFailed((unsigned int)AllocatedFullProcessImageName);
    goto LABEL_25;
  }
  memset(&AuditParameters, 0i64, sizeof(AuditParameters));
  AuditParameters.CategoryId = 3;
  AuditParameters.Type = 8;
  AuditParameters.FlatSubCategoryId = v11;
  AuditParameters.AuditId = 4663;
  SeCaptureSubjectContext((INT64)&SubjectContext);
  PrimaryToken = SubjectContext.PrimaryToken;
  AuditParameters.Parameters[0].Type = SeAdtParmTypeSid;
  if( SubjectContext.ClientToken )
    PrimaryToken = SubjectContext.ClientToken;
  AuditParameters.Parameters[1].Length = 32;
  AuditParameters.Parameters[1].Address = (void *)&SeSubsystemName;
  AuditParameters.Parameters[2].Type = SeAdtParmTypeLogonId;
  AuditParameters.Parameters[2].Length = 8;
  AuditParameters.Parameters[0].Address = (void *)**((_QWORD **)PrimaryToken + 19);
  v16 = *((unsigned __int8 *)AuditParameters.Parameters[0].Address + 1);
  AuditParameters.Parameters[1].Type = SeAdtParmTypeString;
  AuditParameters.Parameters[0].Length = 4 * v16 + 8;
  if( SubjectContext.ClientToken )
    v17 = *((_QWORD *)SubjectContext.ClientToken + 3);
  else
    v17 = *((_QWORD *)SubjectContext.PrimaryToken + 3);
  AuditParameters.Parameters[2].Data[0] = v17;
  v18 = ObjectTypeName->Length + 16;
  AuditParameters.Parameters[3].Type = SeAdtParmTypeString;
  AuditParameters.Parameters[4].Type = SeAdtParmTypeString;
  AuditParameters.Parameters[4].Length = v18;
  AuditParameters.Parameters[3].Length = 32;
  AuditParameters.Parameters[3].Address = (void *)&SeSubsystemName;
  AuditParameters.Parameters[4].Address = ObjectTypeName;
  SepQueryNameString(Object, (PVOID *)&ObjectNameInfo);
  if( ObjectNameInfo )
  {
    if( (_WORD)v11 == 116 || (AuditParameters.Parameters[5].Type = SeAdtParmTypeString, (_WORD)v11 == 128) )
      AuditParameters.Parameters[5].Type = SeAdtParmTypeFileSpec;
    v19 = *(_WORD *)ObjectNameInfo;
    AuditParameters.Parameters[5].Address = ObjectNameInfo;
    AuditParameters.Parameters[5].Length = v19 + 16;
  }
  AuditParameters.Parameters[6].Type = SeAdtParmTypePtr;
  AuditParameters.Parameters[6].Length = 8;
  if( ObpIsKernelHandle(HandleId, 0) )
    HandleId = (VOID *)((unsigned __int64)HandleId ^ 0xFFFFFFFF80000000ui64);
  AuditParameters.Parameters[7].Length = 4;
  AuditParameters.Parameters[7].Data[1] = 4i64;
  AuditParameters.Parameters[8].Length = 4;
  AuditParameters.Parameters[7].Data[0] = (unsigned int)AuditMask;
  AuditParameters.Parameters[8].Data[0] = (unsigned int)AuditMask;
  AuditParameters.Parameters[10].Address = ImageName;
  v24 = ImageName->Length + 16;
  AuditParameters.Parameters[6].Data[0] = (unsigned __int64)HandleId & 0xFFFFFFFFFFFFFFFCui64;
  AuditParameters.Parameters[7].Type = SeAdtParmTypeAccessMask;
  AuditParameters.Parameters[8].Type = SeAdtParmTypeHexUlong;
  AuditParameters.Parameters[9].Type = v21;
  AuditParameters.Parameters[9].Length = v20;
  AuditParameters.Parameters[9].Data[0] = UniqueProcessId;
  AuditParameters.Parameters[10].Type = v23;
  AuditParameters.Parameters[10].Length = v24;
  if( v11 != v22 && v11 - v22 != 12 || !SecurityDescriptor )
    goto LABEL_19;
  v25 = SepCheckAndCopySelfRelativeSD(
          (_SECURITY_DESCRIPTOR *)SecurityDescriptor,
          (_SECURITY_DESCRIPTOR **)&SDLength[4],
          (UINT64 *)SDLength,
          (UINT8 *)NeedToFree);
  v7 = *(void **)&SDLength[4];
  AllocatedFullProcessImageName = v25;
  if( v25 >= 0 )
  {
    AuditParameters.Parameters[11].Type = SeAdtParmTypeResourceAttribute;
    v26 = SepSecurityDescriptorStrictLength(*(VOID **)&SDLength[4]);
    AuditParameters.Parameters[11].Data[1] = 0i64;
    AuditParameters.Parameters[11].Length = v26;
    AuditParameters.Parameters[11].Address = v7;
    AuditParameters.Parameters[11].Data[0] = 32i64;
LABEL_19:
    AuditParameters.ParameterCount = 12;
    SepAdtLogAuditRecord(&AuditParameters);
    SeReleaseSubjectContext(&SubjectContext);
  }
  if( NeedToFree[0] && v7 )
    ExFreePoolWithTag(v7, 0);
  if( AllocatedFullProcessImageName < 0 )
    goto LABEL_24;
LABEL_25:
  if( ImageName )
    ExFreePoolWithTag(ImageName, 0);
  if( ObjectNameInfo )
    ExFreePoolWithTag(ObjectNameInfo, 0);
}

Referenced by:

ObpAuditObjectAccess