AlpcpReferenceConnectedPort
_ALPC_PORT *__fastcall AlpcpReferenceConnectedPort(_ALPC_PORT *PortObject){
_ALPC_PORT *v2;
__int64 v3;
int v4;
v2 = 0i64;
if( (*((_DWORD *)PortObject + 104) & 6) != 2 )
{
v3 = *((_QWORD *)PortObject + 2);
if( !v3 )
return v2;
ExAcquirePushLockSharedEx(v3 - 16, 0i64);
v4 = *((_DWORD *)PortObject + 104) & 6;
if( v4 == 4 )
{
v2 = *(_ALPC_PORT **)(v3 + 8);
}
else
{
if( v4 != 6 )
{
LABEL_9:
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v3 - 16), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v3 - 16));
KeAbPostRelease((PVOID)(v3 - 16));
return v2;
}
v2 = *(_ALPC_PORT **)(v3 + 16);
}
if( v2 && !ObReferenceObjectSafe(v2) )
v2 = 0i64;
goto LABEL_9;
}
ObfReferenceObject(PortObject);
return PortObject;
}Referenced by:
AlpcpExposeHandleAttribute
AlpcpImpersonateMessage
AlpcpPortQueryConnectedSidInfo
AlpcpPortQueryServerSessionInfo
NtAlpcImpersonateClientOfPort