ObpAssignSecurity

NTSTATUS __stdcall ObpAssignSecurity(
        _SECURITY_SUBJECT_CONTEXT *AccessState,
        VOID *ParentDescriptor,
        VOID *Object,
        POBJECT_TYPE ObjectType,
        UINT64 AdditionalAutoInheritFlags,
        UINT8 UseTokenDefaultDaclForBaseDescriptor){
  void *ClientToken; 
  NTSTATUS result; 
  int v13; 
  VOID *v14; 
  int v15; 
  UINT64 v16; 
  int GenericMapping; 
  POOL_TYPE v18; 
  PVOID P; 
  _SECURITY_OBJECT_AI_PARAMS AutoInheritParams; 
  VOID *NewDescriptor[2]; 
  UINT64 AutoInheritFlags; 

  AutoInheritParams = 0i64;
  LODWORD(AutoInheritFlags) = 0;
  NewDescriptor[0] = 0i64;
  P = 0i64;
  ClientToken = AccessState[2].ClientToken;
  AutoInheritParams.Size = 8;
  result = SeComputeAutoInheritByObjectTypeEx(
             ObjectType,
             ClientToken,
             ParentDescriptor,
             &AutoInheritFlags,
             &AutoInheritParams);
  if( result >= 0 )
  {
    v13 = AdditionalAutoInheritFlags | AutoInheritFlags;
    if( !UseTokenDefaultDaclForBaseDescriptor
      || (LODWORD(v16) = 0,
          result = SeAssignSecurityEx2(
                     0i64,
                     AccessState[2].ClientToken,
                     &P,
                     0i64,
                     ObjectType == DmaAdapter,
                     v16,
                     0i64,
                     AccessState + 1,
                     &ObjectType->TypeInfo.GenericMapping,
                     v18),
          result >= 0) )
    {
      v14 = P;
      if( !P )
        v14 = AccessState[2].ClientToken;
      LODWORD(v16) = v13;
      v15 = SeAssignSecurityEx2(
              ParentDescriptor,
              v14,
              NewDescriptor,
              0i64,
              ObjectType == DmaAdapter,
              v16,
              &AutoInheritParams,
              AccessState + 1,
              &ObjectType->TypeInfo.GenericMapping,
              v18);
      if( v15 < 0 )
      {
        if( P )
          ExFreePoolWithTag(P, 0);
      }
      else
      {
        if( P )
          ExFreePoolWithTag(P, 0);
        LOBYTE(GenericMapping) = KeGetCurrentThread()->PreviousMode;
        v15 = ObjectType->TypeInfo.SecurityProcedure(
                Object,
                AssignSecurityDescriptor,
                0i64,
                NewDescriptor[0],
                0i64,
                0i64,
                PagedPool,
                &ObjectType->TypeInfo.GenericMapping,
                GenericMapping);
        if( v15 < 0 )
          SeDeassignSecurity(NewDescriptor);
      }
      return v15;
    }
  }
  return result;
}

Referenced by:

ObAssignSecurity
ObpInsertOrLocateNamedObject