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