ObSetSecurityDescriptorInfo

NTSTATUS __stdcall ObSetSecurityDescriptorInfo(
        VOID *Object,
        UINT64 *SecurityInformation,
        VOID *SecurityDescriptor,
        VOID **ObjectsSecurityDescriptor,
        POOL_TYPE PoolType,
        _GENERIC_MAPPING *GenericMapping){
  _ETHREAD *CurrentThread; 
  unsigned int v7; 
  VOID *v11; 
  int v12; 
  __int64 v13; 
  char v14; 
  PSECURITY_DESCRIPTOR ObjectsSecurityDescriptora; 
  PVOID OutputSecurityDescriptor; 
  UINT64 Size; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = 0;
  LODWORD(Size) = 0;
  OutputSecurityDescriptor = 0i64;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object - 4, 0i64);
  v11 = (VOID *)(*((_QWORD *)Object - 1) & 0xFFFFFFFFFFFFFFF0ui64);
  v12 = SeSetSecurityDescriptorInfo(
          Object,
          SecurityInformation,
          SecurityDescriptor,
          &ObjectsSecurityDescriptora,
          PoolType,
          GenericMapping,
          (INT64)v11,
          OutputSecurityDescriptor);
  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 )
            v13 = (unsigned __int64)OutputSecurityDescriptor | 0xF;
          v14 = _InterlockedExchange64((volatile __int64 *)Object - 1, v13);
          OutputSecurityDescriptor = 0i64;
          if( v11 )
            v7 = (v14 & 0xF) + 1;
        }
      }
    }
  }
  ExReleasePushLockEx((_DWORD)Object - 32, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( OutputSecurityDescriptor )
    ObDereferenceSecurityDescriptor(OutputSecurityDescriptor, 0x10ui64);
  if( v11 && v7 )
    ObDereferenceSecurityDescriptor(v11, v7);
  if( ObjectsSecurityDescriptora )
    ExFreePoolWithTag(ObjectsSecurityDescriptora, 0);
  return v12;
}

Referenced by:

SeDefaultObjectMethod
WmipSecurityMethod