ObpAssignSecurity

NTSTATUS __stdcall ObpAssignSecurity(
        _ACCESS_STATE *AccessState,
        PVOID ParentDescriptor,
        PVOID Object,
        _OBJECT_TYPE *ObjectType,
        UINT64 AdditionalAutoInheritFlags,
        UINT8 UseTokenDefaultDaclForBaseDescriptor){
  void *v10; 
  NTSTATUS result; 
  int v13; 
  PVOID v14; 
  int v15; 
  BOOL IsDirectoryObject; 
  UINT64 v17; 
  int GenericMapping; 
  PVOID P; 
  _SECURITY_OBJECT_AI_PARAMS AutoInheritParams; 
  PSECURITY_DESCRIPTOR SecurityDescriptor[2]; 
  UINT64 AutoInheritFlags; 
  AutoInheritParams = 0i64;
  LODWORD(AutoInheritFlags) = 0;
  SecurityDescriptor[0] = 0i64;
  P = 0i64;
  v10 = (void *)*((_QWORD *)AccessState + 8);
  AutoInheritParams.Size = 8;
  result = SeComputeAutoInheritByObjectTypeEx(ObjectType, v10, ParentDescriptor, &AutoInheritFlags, &AutoInheritParams);
  if( result >= 0 )
  {
    v13 = AdditionalAutoInheritFlags | AutoInheritFlags;
    if( !UseTokenDefaultDaclForBaseDescriptor
      || (LODWORD(v17) = 0,
          LOBYTE(IsDirectoryObject) = ObjectType == ObpDirectoryObjectType,
          result = SeAssignSecurityEx2(
                     0i64,
                     *((PVOID *)AccessState + 8),
                     &P,
                     0i64,
                     IsDirectoryObject,
                     v17,
                     0i64,
                     (SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
                     &ObjectType->TypeInfo.GenericMapping),
          result >= 0) )
    {
      v14 = P;
      if( !P )
        v14 = (PVOID)*((_QWORD *)AccessState + 8);
      LODWORD(v17) = v13;
      LOBYTE(IsDirectoryObject) = ObjectType == ObpDirectoryObjectType;
      v15 = SeAssignSecurityEx2(
              ParentDescriptor,
              v14,
              SecurityDescriptor,
              0i64,
              IsDirectoryObject,
              v17,
              &AutoInheritParams,
              (SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
              &ObjectType->TypeInfo.GenericMapping);
      if( v15 < 0 )
      {
        if( P )
          ExFreePoolWithTag(P, 0);
      }
      else
      {
        if( P )
          ExFreePoolWithTag(P, 0);
        LOBYTE(GenericMapping) = *((_BYTE *)KeGetCurrentThread() + 562);
        v15 = ObjectType->TypeInfo.SecurityProcedure(
                Object,
                AssignSecurityDescriptor,
                0i64,
                SecurityDescriptor[0],
                0i64,
                0i64,
                PagedPool,
                &ObjectType->TypeInfo.GenericMapping,
                GenericMapping);
        if( v15 < 0 )
          SeDeassignSecurity(SecurityDescriptor);
      }
      return v15;
    }
  }
  return result;
}

Referenced by:

ObAssignSecurity
ObpInsertOrLocateNamedObject