SepAuditAssignPrimaryToken

VOID __stdcall SepAuditAssignPrimaryToken(_EPROCESS *Process, VOID *AccessToken, VOID *ptr32){
  _EPROCESS *CurrentThreadProcess; 
  _EPROCESS *v6; 
  unsigned __int64 UniqueProcessId; 
  _UNICODE_STRING *v8; 
  unsigned __int8 *v9; 
  NTSTATUS AllocatedFullProcessImageName; 
  void *v11; 
  int v12; 
  unsigned int v13; 
  unsigned int v14; 
  _UNICODE_STRING *ImageName; 
  _UNICODE_STRING *SubjectContext[5]; 
  _SE_ADT_PARAMETER_ARRAY AuditParameters; 

  memset(SubjectContext, 0, sizeof(SubjectContext));
  ImageName = 0i64;
  memset(&AuditParameters, 0i64, sizeof(AuditParameters));
  CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
  v6 = CurrentThreadProcess;
  if( CurrentThreadProcess->SeAuditProcessCreationInfo.ImageFileName )
  {
    UniqueProcessId = (unsigned __int64)CurrentThreadProcess->UniqueProcessId;
    SeCaptureSubjectContext((INT64)&SubjectContext[1]);
    v8 = SubjectContext[3];
    if( SubjectContext[1] )
      v8 = SubjectContext[1];
    if( v8 )
    {
      v9 = *(unsigned __int8 **)v8[9].Buffer;
      AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageNameEx(v6, SubjectContext);
      if( AllocatedFullProcessImageName >= 0 )
      {
        v11 = Process->UniqueProcessId;
        AllocatedFullProcessImageName = PsGetAllocatedFullProcessImageNameEx(Process, &ImageName);
        if( AllocatedFullProcessImageName >= 0 )
        {
          v12 = v9[1];
          AuditParameters.CategoryId = 5;
          AuditParameters.Parameters[2].Type = SeAdtParmTypeLogonId;
          *(_DWORD *)&AuditParameters.FlatSubCategoryId = 524421;
          AuditParameters.AuditId = 4696;
          AuditParameters.Parameters[0].Length = 4 * v12 + 8;
          AuditParameters.Parameters[0].Type = SeAdtParmTypeSid;
          AuditParameters.Parameters[0].Address = v9;
          AuditParameters.Parameters[1].Address = (void *)&SeSubsystemName;
          AuditParameters.Parameters[2].Data[0] = (unsigned __int64)v8[1].Buffer;
          AuditParameters.Parameters[3].Data[0] = *((_QWORD *)AccessToken + 3);
          v13 = ImageName->Length + 16;
          AuditParameters.Parameters[5].Address = ImageName;
          AuditParameters.Parameters[5].Length = v13;
          AuditParameters.Parameters[7].Address = SubjectContext[0];
          AuditParameters.Parameters[1].Type = SeAdtParmTypeString;
          v14 = SubjectContext[0]->Length + 16;
          AuditParameters.Parameters[1].Length = 32;
          AuditParameters.Parameters[7].Length = v14;
          AuditParameters.Parameters[2].Length = 8;
          AuditParameters.Parameters[3].Type = SeAdtParmTypeLogonIdEx;
          AuditParameters.Parameters[3].Length = 8;
          AuditParameters.Parameters[4].Type = SeAdtParmTypePtr;
          AuditParameters.Parameters[4].Length = 8;
          AuditParameters.Parameters[4].Data[0] = (unsigned __int64)v11;
          AuditParameters.Parameters[5].Type = SeAdtParmTypeFileSpec;
          AuditParameters.Parameters[6].Type = SeAdtParmTypePtr;
          AuditParameters.Parameters[6].Length = 8;
          AuditParameters.Parameters[6].Data[0] = UniqueProcessId;
          AuditParameters.Parameters[7].Type = SeAdtParmTypeFileSpec;
          AuditParameters.ParameterCount = 8;
          SepAdtLogAuditRecord(&AuditParameters);
        }
      }
    }
    else
    {
      AllocatedFullProcessImageName = -1073741700;
    }
    if( ImageName )
      ExFreePoolWithTag(ImageName, 0);
    if( SubjectContext[0] )
      ExFreePoolWithTag(SubjectContext[0], 0);
    if( AllocatedFullProcessImageName < 0 )
      SepAuditFailed((unsigned int)AllocatedFullProcessImageName);
    SeReleaseSubjectContext((PSECURITY_SUBJECT_CONTEXT)&SubjectContext[1]);
  }
}

Referenced by:

SeAssignPrimaryToken
SeExchangePrimaryToken