ObpCaptureObjectCreateInformation

INT64 __fastcall ObpCaptureObjectCreateInformation(
        INT64 ProbeMode,
        INT64 CreatorMode,
        _OBJECT_ATTRIBUTES *ObjectAttributes,
        _UNICODE_STRING *CapturedObjectName,
        _OBJECT_CREATE_INFORMATION *ObjectCreateInfo,
        INT64 UseLookaside,
        INT64 a7,
        INT64 a8){
  INT8 v9; 
  int Attributes; 
  _UNICODE_STRING *ObjectName; 
  void *SecurityDescriptor; 
  _SECURITY_QUALITY_OF_SERVICE *SecurityQualityOfService; 
  NTSTATUS v14; 
  void **p_SecurityDescriptor; 
  void *v17; 
  UINT64 Size; 
  int v19; 
  _SECURITY_QUALITY_OF_SERVICE *v20; 
  _UNICODE_STRING *v21; 
  void *v22; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v24; 
  v9 = ProbeMode;
  LODWORD(Size) = 0;
  *CapturedObjectName = 0i64;
  *(_OWORD *)&ObjectCreateInfo->Attributes = 0i64;
  *(_OWORD *)&ObjectCreateInfo->ProbeMode = 0i64;
  *(_OWORD *)&ObjectCreateInfo->SecurityDescriptor = 0i64;
  *(_OWORD *)&ObjectCreateInfo->SecurityQualityOfService.Length = 0i64;
  if( !ObjectAttributes )
    return 0i64;
  ObjectCreateInfo->ProbeMode = ProbeMode;
  if( (_BYTE)ProbeMode )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( *((_BYTE *)CurrentThread + 562) )
    {
      if( ((unsigned __int8)ObjectAttributes & 7) != 0 )
        goto LABEL_18;
    }
  }
  if( ObjectAttributes->Length != 48 )
  {
    v14 = -1073741811;
    HIDWORD(Size) = -1073741811;
    goto LABEL_33;
  }
  ObjectCreateInfo->RootDirectory = ObjectAttributes->RootDirectory;
  Attributes = ObjectAttributes->Attributes;
  v19 = Attributes;
  if( (_BYTE)CreatorMode )
  {
    Attributes &= ~0x200u;
    v19 = Attributes;
  }
  if( (Attributes & 0xFFFEE00D) != 0 )
  {
    v14 = -1073741811;
    HIDWORD(Size) = -1073741811;
    goto LABEL_33;
  }
  ObjectCreateInfo->Attributes = Attributes;
  ObjectName = ObjectAttributes->ObjectName;
  v21 = ObjectName;
  SecurityDescriptor = ObjectAttributes->SecurityDescriptor;
  v22 = SecurityDescriptor;
  SecurityQualityOfService = (_SECURITY_QUALITY_OF_SERVICE *)ObjectAttributes->SecurityQualityOfService;
  v20 = SecurityQualityOfService;
  if( SecurityQualityOfService )
  {
    if( !(_BYTE)ProbeMode )
    {
LABEL_14:
      ObjectCreateInfo->SecurityQualityOfService = *SecurityQualityOfService;
      goto LABEL_19;
    }
    v24 = (_ETHREAD *)KeGetCurrentThread();
    if( !*((_BYTE *)v24 + 562) || ((unsigned __int8)v20 & 3) == 0 )
    {
      SecurityQualityOfService = v20;
      SecurityDescriptor = v22;
      ObjectName = v21;
      goto LABEL_14;
    }
LABEL_18:
    ExRaiseDatatypeMisalignment();
  }
LABEL_19:
  if( SecurityDescriptor )
  {
    p_SecurityDescriptor = &ObjectCreateInfo->SecurityDescriptor;
    v14 = SeCaptureSecurityDescriptor(
            SecurityDescriptor,
            ProbeMode,
            PagedPool,
            1u,
            &ObjectCreateInfo->SecurityDescriptor);
    if( v14 < 0 )
    {
      *p_SecurityDescriptor = 0i64;
      goto LABEL_33;
    }
    SeComputeQuotaInformationSize(*p_SecurityDescriptor, &Size);
    ObjectCreateInfo->SecurityDescriptorCharge = Size;
  }
  if( !SecurityQualityOfService )
    goto LABEL_21;
  ObjectCreateInfo->SecurityQualityOfService.Length = 12;
  ObjectCreateInfo->SecurityQos = &ObjectCreateInfo->SecurityQualityOfService;
  if( ObjectCreateInfo->SecurityQualityOfService.ContextTrackingMode >= 2u )
  {
    v14 = -1073741811;
    goto LABEL_33;
  }
  if( ObjectCreateInfo->SecurityQualityOfService.ImpersonationLevel > (unsigned int)SecurityDelegation )
  {
    v14 = -1073741659;
  }
  else
  {
LABEL_21:
    if( ObjectName )
    {
      v14 = ObpCaptureObjectName(v9, ObjectName, CapturedObjectName, (unsigned int)UseLookaside);
      if( v14 >= 0 )
        return 0i64;
    }
    else
    {
      if( !ObjectCreateInfo->RootDirectory )
        return 0i64;
      v14 = -1073741773;
    }
  }
LABEL_33:
  v17 = ObjectCreateInfo->SecurityDescriptor;
  if( v17 )
  {
    SeReleaseSecurityDescriptor(v17, ObjectCreateInfo->ProbeMode, 1u);
    ObjectCreateInfo->SecurityDescriptor = 0i64;
  }
  return(unsigned int)v14;
}

Referenced by:

CmpCreateKeyBody
IopAllocRealFileObject
ObCreateObjectEx
ObOpenObjectByNameEx
ObReferenceObjectByNameEx