ObSetSecurityDescriptorInfo

NTSTATUS __stdcall ObSetSecurityDescriptorInfo(
        PVOID Object,
        UINT64 *SecurityInformation,
        PVOID SecurityDescriptor,
        PVOID *ObjectsSecurityDescriptor,
        _POOL_TYPE PoolType,
        _GENERIC_MAPPING *GenericMapping){
  _ETHREAD *CurrentThread; 
  unsigned int v7; 
  void *v11; 
  NTSTATUS v12; 
  __int64 v13; 
  char v14; 
  PSECURITY_DESCRIPTOR ObjectsSecurityDescriptora; 
  void *OutputSecurityDescriptor[4]; 
  UINT64 Size; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = 0;
  LODWORD(Size) = 0;
  OutputSecurityDescriptor[0] = 0i64;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)Object - 32, 0i64);
  v11 = (void *)(*((_QWORD *)Object - 1) & 0xFFFFFFFFFFFFFFF0ui64);
  ObjectsSecurityDescriptora = v11;
  v12 = SeSetSecurityDescriptorInfo(
          Object,
          SecurityInformation,
          SecurityDescriptor,
          &ObjectsSecurityDescriptora,
          PoolType,
          GenericMapping);
  if( v12 < 0 )
  {
    ObjectsSecurityDescriptora = 0i64;
  }
  else
  {
    v12 = ObLogSecurityDescriptor(ObjectsSecurityDescriptora, OutputSecurityDescriptor, 0x10ui64);
    if( v12 >= 0 )
    {
      v12 = SeComputeQuotaInformationSize(ObjectsSecurityDescriptora, &Size);
      if( v12 >= 0 )
      {
        v12 = ObAdjustSecurityQuota(Object, (unsigned int)Size);
        if( v12 >= 0 )
        {
          v13 = 0i64;
          if( OutputSecurityDescriptor[0] )
            v13 = (unsigned __int64)OutputSecurityDescriptor[0] | 0xF;
          v14 = _InterlockedExchange64((volatile __int64 *)Object - 1, v13);
          OutputSecurityDescriptor[0] = 0i64;
          if( v11 )
            v7 = (v14 & 0xF) + 1;
        }
      }
    }
  }
  ExReleasePushLockEx((UINT64)Object - 32, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( OutputSecurityDescriptor[0] )
    ObDereferenceSecurityDescriptor(OutputSecurityDescriptor[0], 0x10ui64);
  if( v11 && v7 )
    ObDereferenceSecurityDescriptor(v11, v7);
  if( ObjectsSecurityDescriptora )
    ExFreePoolWithTag(ObjectsSecurityDescriptora, 0);
  return v12;
}

Referenced by:

SeDefaultObjectMethod
WmipSecurityMethod