SepAdtStagingEvent

BOOL __fastcall SepAdtStagingEvent(
        INT64 FlatSubCategoryId,
        _UNICODE_STRING *CapturedSubsystemName,
        VOID **HandleId,
        _UNICODE_STRING *CapturedObjectTypeName,
        _UNICODE_STRING *CapturedObjectName,
        _TOKEN *ClientToken,
        _TOKEN *PrimaryToken,
        UINT64 DesiredAccess,
        UINT64 GrantedAccess,
        UINT8 AccessGranted,
        VOID *ProcessID,
        _ACCESS_STATE *AccessState){
  _LUID AuthenticationId; 
  _SECURITY_DESCRIPTOR *v13; 
  _SECURITY_DESCRIPTOR *v14; 
  __int64 v15; 
  _EPROCESS *CurrentThreadProcess; 
  NTSTATUS AllocatedFullProcessImageName; 
  _SID_AND_ATTRIBUTES *UserAndGroups; 
  _LUID v19; 
  int v20; 
  int v21; 
  int v22; 
  unsigned int v23; 
  int Length; 
  UINT8 IsKernelHandle; 
  unsigned __int64 v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  _SECURITY_DESCRIPTOR *v29; 
  NTSTATUS v30; 
  __int64 v31; 
  UINT64 v32; 
  VOID **PoolWithTag; 
  VOID **v34; 
  int v35; 
  __int64 ParameterCount; 
  __int64 v37; 
  __int64 v38; 
  UINT8 NeedToFree[4]; 
  UINT64 SDLength; 
  _SECURITY_DESCRIPTOR *SecurityDescriptorOut; 
  _SECURITY_DESCRIPTOR *v43; 
  _UNICODE_STRING *ImageName; 
  unsigned __int8 *Sid; 
  _UNICODE_STRING *v46; 
  VOID **v47; 
  _SE_ADT_PARAMETER_ARRAY AuditParameters; 

  v46 = CapturedObjectTypeName;
  AuthenticationId = 0i64;
  v47 = HandleId;
  v13 = 0i64;
  *(_WORD *)&NeedToFree[2] = FlatSubCategoryId;
  v14 = 0i64;
  v15 = *((_QWORD *)AccessState + 9);
  ImageName = 0i64;
  SDLength = 0i64;
  SecurityDescriptorOut = 0i64;
  v43 = 0i64;
  NeedToFree[0] = 0;
  NeedToFree[1] = 0;
  if( !v15
    || !*(_BYTE *)(v15 + 216)
    || (_WORD)FlatSubCategoryId != 116
    && (_WORD)FlatSubCategoryId != 128
    && RtlCompareUnicodeString(CapturedObjectTypeName, &SepFileTypeName, 0) )
  {
    return 1;
  }
  CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
  AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageNameEx(CurrentThreadProcess, &ImageName);
  if( AllocatedFullProcessImageName >= 0 )
  {
    if( ClientToken )
    {
      AuthenticationId = ClientToken->AuthenticationId;
      UserAndGroups = ClientToken->UserAndGroups;
    }
    else
    {
      UserAndGroups = PrimaryToken->UserAndGroups;
    }
    v19 = PrimaryToken->AuthenticationId;
    Sid = (unsigned __int8 *)UserAndGroups->Sid;
    memset(&AuditParameters, 0i64, sizeof(AuditParameters));
    AuditParameters.CategoryId = 3;
    AuditParameters.AuditId = 4818;
    AuditParameters.FlatSubCategoryId = 129;
    v20 = 16;
    v21 = 8;
    if( (DesiredAccess & 0x2000000) != 0 || (AuditParameters.Type = 8, !AccessGranted) )
      AuditParameters.Type = 16;
    AuditParameters.Parameters[0].Address = Sid;
    AuditParameters.Parameters[0].Type = SeAdtParmTypeSid;
    AuditParameters.Parameters[1].Type = SeAdtParmTypeString;
    v22 = Sid[1];
    AuditParameters.Parameters[1].Address = (void *)&SeSubsystemName;
    AuditParameters.Parameters[2].Type = SeAdtParmTypeLogonId;
    AuditParameters.Parameters[2].Length = 8;
    AuditParameters.Parameters[2].Data[0] = (unsigned __int64)AuthenticationId;
    AuditParameters.Parameters[0].Length = 4 * v22 + 8;
    AuditParameters.Parameters[1].Length = 32;
    if( !ClientToken )
      AuditParameters.Parameters[2].Data[0] = (unsigned __int64)v19;
    AuditParameters.Parameters[3].Address = (void *)&SeSubsystemName;
    AuditParameters.Parameters[3].Type = SeAdtParmTypeString;
    AuditParameters.Parameters[3].Length = 32;
    if( v46 )
    {
      v23 = v46->Length + 16;
      AuditParameters.Parameters[4].Address = v46;
      AuditParameters.Parameters[4].Type = SeAdtParmTypeString;
      AuditParameters.Parameters[4].Length = v23;
      if( CapturedObjectName )
      {
        if( *(_WORD *)&NeedToFree[2] == 116
          || (AuditParameters.Parameters[5].Type = SeAdtParmTypeString, *(_WORD *)&NeedToFree[2] == 128) )
        {
          AuditParameters.Parameters[5].Type = SeAdtParmTypeFileSpec;
        }
        Length = CapturedObjectName->Length;
        AuditParameters.Parameters[5].Address = CapturedObjectName;
        AuditParameters.Parameters[5].Length = Length + 16;
      }
      AuditParameters.Parameters[6].Type = SeAdtParmTypePtr;
      AuditParameters.Parameters[6].Length = 8;
      if( v47 )
      {
        IsKernelHandle = ObpIsKernelHandle(*v47, 0);
        v28 = v27 ^ 0xFFFFFFFF80000000ui64;
        if( !IsKernelHandle )
          v28 = v26;
        AuditParameters.Parameters[6].Data[0] = v28 & 0xFFFFFFFFFFFFFFFCui64;
      }
      else
      {
        AuditParameters.Parameters[6].Data[0] = 0i64;
      }
      AuditParameters.Parameters[7].Data[0] = (unsigned __int64)ProcessID;
      AuditParameters.Parameters[8].Address = ImageName;
      v29 = *(_SECURITY_DESCRIPTOR **)(v15 + 56);
      AuditParameters.Parameters[8].Length = v20 + ImageName->Length;
      AuditParameters.Parameters[7].Type = SeAdtParmTypePtr;
      AuditParameters.Parameters[7].Length = 8;
      AuditParameters.Parameters[8].Type = SeAdtParmTypeFileSpec;
      AllocatedFullProcessImageName = SepCheckAndCopySelfRelativeSD(
                                        v29,
                                        &SecurityDescriptorOut,
                                        (UINT64 *)((char *)&SDLength + 4),
                                        NeedToFree);
      if( AllocatedFullProcessImageName < 0 )
      {
        v13 = SecurityDescriptorOut;
      }
      else
      {
        v30 = SepCheckAndCopySelfRelativeSD(*(_SECURITY_DESCRIPTOR **)(v15 + 64), &v43, &SDLength, &NeedToFree[1]);
        v14 = v43;
        AllocatedFullProcessImageName = v30;
        v13 = SecurityDescriptorOut;
        if( v30 >= 0 )
        {
          if( !SecurityDescriptorOut && !v43 )
            v21 = 0;
          v31 = HIDWORD(SDLength);
          v32 = (unsigned int)(SDLength - v21 + HIDWORD(SDLength) + 152);
          PoolWithTag = ExAllocatePoolWithTag(1ui64, v32, 1883333971i64);
          v34 = PoolWithTag;
          if( PoolWithTag )
          {
            memset(PoolWithTag, 0i64, v32);
            v35 = GrantedAccess;
            *((_DWORD *)v34 + 34) = AccessGranted;
            if( !AccessGranted )
              v35 = DesiredAccess;
            *((_DWORD *)v34 + 33) = 4;
            *(_DWORD *)v34 = v35 & 0xFDFFFFFF;
            *(_OWORD *)((char *)v34 + 4) = *(_OWORD *)(v15 + 88);
            *(_OWORD *)((char *)v34 + 20) = *(_OWORD *)(v15 + 104);
            *(_OWORD *)((char *)v34 + 36) = *(_OWORD *)(v15 + 120);
            *(_OWORD *)((char *)v34 + 52) = *(_OWORD *)(v15 + 136);
            *(_OWORD *)((char *)v34 + 68) = *(_OWORD *)(v15 + 152);
            *(_OWORD *)((char *)v34 + 84) = *(_OWORD *)(v15 + 168);
            *(_OWORD *)((char *)v34 + 100) = *(_OWORD *)(v15 + 184);
            *(_OWORD *)((char *)v34 + 116) = *(_OWORD *)(v15 + 200);
            if( v13 )
              memmove(v34 + 18, v13, v31);
            if( v14 )
              memmove((char *)v34 + v31 + 144, v14, SDLength);
            ParameterCount = 10i64;
            AuditParameters.ParameterCount = 10;
            v37 = 0i64;
            AuditParameters.Parameters[9].Type = SeAdtParmTypeAccessReason;
            AuditParameters.Parameters[9].Length = v32;
            AuditParameters.Parameters[9].Address = v34;
            AuditParameters.Parameters[10].Type = SeAdtParmTypeStagingReason;
            AuditParameters.Parameters[10].Length = v32;
            AuditParameters.Parameters[10].Address = v34;
            while( 1 )
            {
              v38 = v37 + 4 * ParameterCount;
              ++v37;
              AuditParameters.Parameters[0].Data[v38] = 0i64;
              if( v37 >= 2 )
                break;
              ParameterCount = AuditParameters.ParameterCount;
            }
            ++AuditParameters.ParameterCount;
            SepAdtLogAuditRecord(&AuditParameters);
            ExFreePoolWithTag(v34, 0);
          }
          else
          {
            AllocatedFullProcessImageName = -1073741670;
          }
        }
      }
    }
    else
    {
      AllocatedFullProcessImageName = -1073741811;
    }
  }
  if( ImageName )
    ExFreePoolWithTag(ImageName, 0);
  if( NeedToFree[0] && v13 )
    ExFreePoolWithTag(v13, 0);
  if( NeedToFree[1] && v14 )
    ExFreePoolWithTag(v14, 0);
  if( AllocatedFullProcessImageName < 0 )
    SepAuditFailed((unsigned int)AllocatedFullProcessImageName);
  return AllocatedFullProcessImageName >= 0;
}

Referenced by:

ObpCreateHandle
SeAuditHandleCreation
SeOpenObjectAuditAlarmWithTransaction