AlpcpCreateSecurityContext

INT64 __fastcall AlpcpCreateSecurityContext(
        _ALPC_PORT *PortObject,
        INT64 AllocateHandle,
        _SECURITY_QUALITY_OF_SERVICE *SecurityQos,
        _KALPC_SECURITY_DATA **SecurityDataPoINTer){
  char v6; 
  void *v8; 
  void *v9; 
  CHAR *Blob; 
  _QWORD *v11; 
  int ClientSecurity; 
  volatile signed __int64 *v13; 
  _ALPC_HANDLE_TABLE *v14; 
  __int64 v15; 
  _ALPC_HANDLE_ENTRY HandleEntry[7]; 
  _QWORD *v18; 
  v6 = (char)SecurityQos;
  IoThreadToProcess((_ETHREAD *)AllocateHandle);
  v9 = v8;
  Blob = AlpcpAllocateBlob(&AlpcSecurityType, 0x70ui64, 0i64);
  v11 = Blob;
  if( !Blob )
    return 3221225626i64;
  memset((INT64)Blob, 0i64);
  v11[1] = -1i64;
  ClientSecurity = AlpcpChargePagedPoolQuota((__int64)v9, 0xA0ui64);
  if( ClientSecurity >= 0 )
  {
    ClientSecurity = SeCreateClientSecurity(
                       (PETHREAD)AllocateHandle,
                       (PSECURITY_QUALITY_OF_SERVICE)SecurityDataPoINTer,
                       0,
                       (PSECURITY_CLIENT_CONTEXT)(v11 + 4));
    if( ClientSecurity < 0 )
    {
      AlpcpReleasePagedPoolQuota((ULONG_PTR)v9, 0xA0ui64);
    }
    else
    {
      ObfReferenceObjectWithTag(v9, 0x63706C41u);
      v11[2] = v9;
      if( !v6 )
      {
LABEL_10:
        *v18 = v11;
        return 0i64;
      }
      v13 = (volatile signed __int64 *)((char *)PortObject + 352);
      ExAcquirePushLockSharedEx((UINT64)PortObject + 352, 0i64);
      if( (*((_DWORD *)PortObject + 104) & 0x20) == 0 )
      {
        ExAcquirePushLockExclusiveEx((UINT64)(v11 - 2), 0i64);
        *((_BYTE *)v11 - 32) |= 4u;
        AlpcpReferenceBlob(v11);
        v14 = (_ALPC_HANDLE_TABLE *)(*((_QWORD *)PortObject + 2) + 40i64);
        HandleEntry[0].Object = v11;
        *v11 = v14;
        LODWORD(v15) = AlpcAddHandleTableEntry(v14, HandleEntry);
        v11[1] = v15;
        if( v15 != -1 )
        {
          ObfReferenceObject(PortObject);
          v11[3] = PortObject;
          AlpcpInsertResourcePort(PortObject, v11);
          if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
            ExfReleasePushLockShared((INT64 *)PortObject + 44);
          KeAbPostRelease((char *)PortObject + 352);
          AlpcpEndInitialization(v11);
          goto LABEL_10;
        }
        if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
          ExfReleasePushLockShared((INT64 *)PortObject + 44);
        KeAbPostRelease((char *)PortObject + 352);
        *v11 = 0i64;
        AlpcpEndInitialization(v11);
        AlpcpDereferenceBlobEx(v11, 2i64);
        return 3221225626i64;
      }
      if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((INT64 *)PortObject + 44);
      KeAbPostRelease((char *)PortObject + 352);
      ClientSecurity = -1073741670;
    }
  }
  AlpcpDereferenceBlobEx(v11, 1i64);
  return(unsigned int)ClientSecurity;
}

Referenced by:

AlpcCreateSecurityContext
AlpcpCaptureSecurityAttributeInternal
NtAlpcCreateSecurityContext