DbgkRegisterErrorPort

NTSTATUS __stdcall DbgkRegisterErrorPort(WCHAR *PortName, UINT64 NameLength){
  size_t v2; 
  wchar_t *PoolWithQuotaTag; 
  VOID *v6; 
  struct _DBGKP_ERROR_PORT *v7; 
  int v8; 
  _ETHREAD *CurrentThread; 
  INT64 Process; 
  _EJOB *v11; 
  _EJOB *v12; 
  _DBGK_SILOSTATE *p_DbgkSiloState; 
  struct _DBGKP_ERROR_PORT *ErrorPort; 
  UINT64 Flags; 
  UINT64 BufferLength; 
  _UNICODE_STRING PortNamea; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  _PORT_MESSAGE ConnectionMessage; 
  _ALPC_PORT_ATTRIBUTES PortAttributes; 

  v2 = NameLength;
  PortNamea = 0i64;
  memset(&ConnectionMessage, 0, sizeof(ConnectionMessage));
  BufferLength = 0i64;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  memset(&PortAttributes, 0i64, sizeof(PortAttributes));
  if( !v2 || (v2 & 1) != 0 || v2 > 0xFFFF )
    return -1073741811;
  PoolWithQuotaTag = (wchar_t *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, v2, 0x50676244ui64);
  PortNamea.Buffer = PoolWithQuotaTag;
  if( !PoolWithQuotaTag )
    return -1073741670;
  PortNamea.MaximumLength = v2;
  PortNamea.Length = v2;
  memmove(PoolWithQuotaTag, PortName, v2);
  v6 = ExAllocatePoolWithQuotaTag((POOL_TYPE)9, 0x10ui64, 0x50676244ui64);
  v7 = (struct _DBGKP_ERROR_PORT *)v6;
  if( v6 )
  {
    *(_DWORD *)&ConnectionMessage.u1.TotalLength = -2147483608;
    BufferLength = 40i64;
    PortAttributes.MaxMessageLength = 272i64;
    PortAttributes.MaxPoolUsage = 8704i64;
    PortAttributes.Flags = 0x100000;
    ObjectAttributes.Length = 48;
    ObjectAttributes.RootDirectory = 0i64;
    ObjectAttributes.Attributes = 512;
    ObjectAttributes.ObjectName = 0i64;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    LODWORD(Flags) = 0x20000;
    v8 = ZwAlpcConnectPort(
           (VOID **)v6 + 1,
           &PortNamea,
           &ObjectAttributes,
           &PortAttributes,
           Flags,
           0i64,
           &ConnectionMessage,
           &BufferLength,
           0i64,
           0i64,
           0i64);
    if( v8 >= 0 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      *(_DWORD *)v7 = 1;
      *((_DWORD *)v7 + 1) = 0;
      Process = (INT64)CurrentThread->Tcb.ApcState.Process;
      LODWORD(v11) = PsGetProcessServerSilo(Process);
      v12 = v11;
      p_DbgkSiloState = &PsGetServerSiloGlobals(v11)->DbgkSiloState;
      --CurrentThread->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx(&p_DbgkSiloState->ErrorPortLock, 0i64);
      ErrorPort = p_DbgkSiloState->ErrorPort;
      if( !ErrorPort && PsIsHostSilo(v12) )
        _interlockedbittestandset((volatile signed __int32 *)&KUSER_SHARED_DATA.SharedDataFlags, 0);
      p_DbgkSiloState->ErrorPort = v7;
      p_DbgkSiloState->ErrorProcess = (_EPROCESS *)Process;
      if( (_InterlockedExchangeAdd64(&p_DbgkSiloState->ErrorPortLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(&p_DbgkSiloState->ErrorPortLock);
      KeAbPostRelease(p_DbgkSiloState);
      KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
      v8 = 0;
      v7 = 0i64;
      if( ErrorPort )
      {
        if( !_interlockedbittestandset((volatile signed __int32 *)ErrorPort + 1, 0) )
          ZwAlpcDisconnectPort(*((VOID **)ErrorPort + 1), 0i64);
        if( _InterlockedExchangeAdd((volatile signed __int32 *)ErrorPort, 0xFFFFFFFF) == 1 )
          DbgkpDeleteErrorPort(ErrorPort);
      }
      KeSetEvent(p_DbgkSiloState->ErrorPortRegisteredEvent, 0, 0);
    }
    if( v7 )
      ExFreePoolWithTag(v7, 0);
  }
  else
  {
    v8 = -1073741670;
  }
  RtlFreeAnsiString(&PortNamea);
  return v8;
}

Referenced by:

NtSetSystemInformation