SepAdtStagingEvent

BOOL __fastcall SepAdtStagingEvent(
        INT16 a1,
        INT64 a2,
        UINT64 *a3,
        const UNICODE_STRING *a4,
        UINT16 *a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9,
        UINT8 a10,
        INT64 a11,
        INT64 a12){
  char *PoolWithTag; 
  ULONG_PTR v13; 
  UINT8 *v14; 
  SECURITY_DESCRIPTOR *v15; 
  __int64 v16; 
  __int64 CurrentThreadProcess; 
  int v18; 
  unsigned __int8 **v19; 
  ULONG_PTR v20; 
  int v21; 
  int v22; 
  int v23; 
  ULONG v24; 
  int v25; 
  UINT8 IsKernelHandle; 
  unsigned __int64 v27; 
  __int64 v28; 
  unsigned __int64 v29; 
  SECURITY_DESCRIPTOR *v30; 
  UINT64 v31; 
  UINT64 v32; 
  char *v33; 
  int v34; 
  __int64 ParameterCount; 
  __int64 v36; 
  __int64 v37; 
  UINT8 NeedToFree[4]; 
  size_t Size; 
  void *Src; 
  SECURITY_DESCRIPTOR *SecurityDescriptorOut; 
  PVOID P; 
  unsigned __int8 *v44; 
  UNICODE_STRING *v45; 
  PVOID *v46; 
  _SE_ADT_PARAMETER_ARRAY result; 
  LODWORD(PoolWithTag) = a12;
  v45 = (UNICODE_STRING *)a4;
  v13 = 0i64;
  v46 = (PVOID *)a3;
  v14 = 0i64;
  *(_WORD *)&NeedToFree[2] = a1;
  v15 = 0i64;
  v16 = *(_QWORD *)(a12 + 72);
  P = 0i64;
  Size = 0i64;
  Src = 0i64;
  SecurityDescriptorOut = 0i64;
  NeedToFree[0] = 0;
  NeedToFree[1] = 0;
  if( v16
    && *(_BYTE *)(v16 + 216)
    && (a1 == 116
     || a1 == 128
     || (LODWORD(PoolWithTag) = RtlCompareUnicodeString(a4, &SepFileTypeName, 0), !(_DWORD)PoolWithTag)) )
  {
    CurrentThreadProcess = PsGetCurrentThreadProcess();
    LODWORD(PoolWithTag) = PsGetAllocatedFullProcessImageNameEx(CurrentThreadProcess, &P);
    v18 = (int)PoolWithTag;
    if( (int)PoolWithTag >= 0 )
    {
      if( a6 )
      {
        v13 = *(_QWORD *)(a6 + 24);
        v19 = *(unsigned __int8 ***)(a6 + 152);
      }
      else
      {
        v19 = *(unsigned __int8 ***)(a7 + 152);
      }
      v20 = *(_QWORD *)(a7 + 24);
      v44 = *v19;
      memset((INT64)&result, 0i64);
      *(_QWORD *)&result.CategoryId = 0x12D200000003i64;
      result.FlatSubCategoryId = 129;
      v21 = 16;
      v22 = 8;
      if( (a8 & 0x2000000) != 0 || (result.Type = 8, !a10) )
        result.Type = 16;
      result.Parameters[0].Address = v44;
      result.Parameters[0].Type = SeAdtParmTypeSid;
      result.Parameters[1].Type = SeAdtParmTypeString;
      v23 = v44[1];
      result.Parameters[1].Address = &SeSubsystemName;
      result.Parameters[2].Type = SeAdtParmTypeLogonId;
      result.Parameters[2].Length = 8;
      result.Parameters[2].Data[0] = v13;
      result.Parameters[0].Length = 4 * v23 + 8;
      LODWORD(PoolWithTag) = 32;
      result.Parameters[1].Length = 32;
      if( !a6 )
        result.Parameters[2].Data[0] = v20;
      result.Parameters[3].Address = &SeSubsystemName;
      result.Parameters[3].Type = SeAdtParmTypeString;
      result.Parameters[3].Length = 32;
      if( v45 )
      {
        v24 = v45->Length + 16;
        result.Parameters[4].Address = v45;
        result.Parameters[4].Type = SeAdtParmTypeString;
        result.Parameters[4].Length = v24;
        if( a5 )
        {
          if( *(_WORD *)&NeedToFree[2] == 116
            || (result.Parameters[5].Type = SeAdtParmTypeString, *(_WORD *)&NeedToFree[2] == 128) )
          {
            result.Parameters[5].Type = SeAdtParmTypeFileSpec;
          }
          v25 = *a5;
          result.Parameters[5].Address = a5;
          result.Parameters[5].Length = v25 + 16;
        }
        result.Parameters[6].Type = SeAdtParmTypePtr;
        result.Parameters[6].Length = 8;
        if( v46 )
        {
          IsKernelHandle = ObpIsKernelHandle(*v46, 0);
          v29 = v28 ^ 0xFFFFFFFF80000000ui64;
          if( !IsKernelHandle )
            v29 = v27;
          result.Parameters[6].Data[0] = v29 & 0xFFFFFFFFFFFFFFFCui64;
        }
        else
        {
          result.Parameters[6].Data[0] = 0i64;
        }
        result.Parameters[7].Data[0] = a11;
        result.Parameters[8].Address = P;
        v30 = *(SECURITY_DESCRIPTOR **)(v16 + 56);
        result.Parameters[8].Length = v21 + *(unsigned __int16 *)P;
        result.Parameters[7].Type = SeAdtParmTypePtr;
        result.Parameters[7].Length = 8;
        result.Parameters[8].Type = SeAdtParmTypeFileSpec;
        LODWORD(PoolWithTag) = SepCheckAndCopySelfRelativeSD(
                                 v30,
                                 (SECURITY_DESCRIPTOR **)&Src,
                                 (size_t *)((char *)&Size + 4),
                                 NeedToFree);
        v18 = (int)PoolWithTag;
        if( (int)PoolWithTag < 0 )
        {
          v14 = (UINT8 *)Src;
        }
        else
        {
          LODWORD(PoolWithTag) = SepCheckAndCopySelfRelativeSD(
                                   *(SECURITY_DESCRIPTOR **)(v16 + 64),
                                   &SecurityDescriptorOut,
                                   &Size,
                                   &NeedToFree[1]);
          v15 = SecurityDescriptorOut;
          v18 = (int)PoolWithTag;
          v14 = (UINT8 *)Src;
          if( (int)PoolWithTag >= 0 )
          {
            if( !Src && !SecurityDescriptorOut )
              v22 = 0;
            v31 = HIDWORD(Size);
            v32 = (unsigned int)(Size - v22 + HIDWORD(Size) + 152);
            PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, v32, 0x70416553ui64);
            v33 = PoolWithTag;
            if( PoolWithTag )
            {
              memset((INT64)PoolWithTag, 0i64);
              v34 = a9;
              *((_DWORD *)v33 + 34) = a10;
              if( !a10 )
                v34 = a8;
              *((_DWORD *)v33 + 33) = 4;
              *(_DWORD *)v33 = v34 & 0xFDFFFFFF;
              *(_OWORD *)(v33 + 4) = *(_OWORD *)(v16 + 88);
              *(_OWORD *)(v33 + 20) = *(_OWORD *)(v16 + 104);
              *(_OWORD *)(v33 + 36) = *(_OWORD *)(v16 + 120);
              *(_OWORD *)(v33 + 52) = *(_OWORD *)(v16 + 136);
              *(_OWORD *)(v33 + 68) = *(_OWORD *)(v16 + 152);
              *(_OWORD *)(v33 + 84) = *(_OWORD *)(v16 + 168);
              *(_OWORD *)(v33 + 100) = *(_OWORD *)(v16 + 184);
              *(_OWORD *)(v33 + 116) = *(_OWORD *)(v16 + 200);
              if( v14 )
                memmove((UINT8 *)v33 + 144, v14, v31);
              if( v15 )
                memmove((UINT8 *)&v33[v31 + 144], &v15->Revision, (unsigned int)Size);
              ParameterCount = 10i64;
              result.ParameterCount = 10;
              v36 = 0i64;
              result.Parameters[9].Type = SeAdtParmTypeAccessReason;
              result.Parameters[9].Length = v32;
              result.Parameters[9].Address = v33;
              result.Parameters[10].Type = SeAdtParmTypeStagingReason;
              result.Parameters[10].Length = v32;
              result.Parameters[10].Address = v33;
              while( 1 )
              {
                v37 = v36 + 4 * ParameterCount;
                ++v36;
                result.Parameters[0].Data[v37] = 0i64;
                if( v36 >= 2 )
                  break;
                ParameterCount = result.ParameterCount;
              }
              ++result.ParameterCount;
              SepAdtLogAuditRecord(&result);
              ExFreePoolWithTag(v33, 0);
            }
            else
            {
              v18 = -1073741670;
            }
          }
        }
      }
      else
      {
        v18 = -1073741811;
      }
    }
    if( P )
      ExFreePoolWithTag(P, 0);
    if( NeedToFree[0] && v14 )
      ExFreePoolWithTag(v14, 0);
    if( NeedToFree[1] && v15 )
      ExFreePoolWithTag(v15, 0);
    if( v18 < 0 )
      SepAuditFailed((unsigned int)v18);
    LOBYTE(PoolWithTag) = v18 >= 0;
  }
  else
  {
    LOBYTE(PoolWithTag) = 1;
  }
  return(int)PoolWithTag;
}

Referenced by:

ObpCreateHandle
SeAuditHandleCreation
SeOpenObjectAuditAlarmWithTransaction