AlpcpImpersonateMessage
INT64 __fastcall AlpcpImpersonateMessage(_ALPC_PORT *PortObject, _KALPC_MESSAGE *Message, UINT64 AllowAnonymous){
int v3;
int v6;
int v7;
struct _DMA_ADAPTER *v8;
struct _SECURITY_CLIENT_CONTEXT *p_ClientContext;
_ALPC_PORT *v10;
__int64 v11;
_ALPC_PORT *v12;
_ETHREAD *v13;
_SECURITY_QUALITY_OF_SERVICE *v14;
int v15;
unsigned int v16;
UINT8 v17;
struct _DMA_ADAPTER *ClientToken;
int v20;
int v21;
__int128 ImpersonationLevel;
__int128 Token;
struct _SECURITY_CLIENT_CONTEXT ClientContext;
_SECURITY_IMPERSONATION_LEVEL v25;
v21 = AllowAnonymous;
v6 = v3;
memset((INT64)&ClientContext, 0i64);
v7 = 0;
v8 = 0i64;
p_ClientContext = 0i64;
if( (*((_BYTE *)Message + 40) & 7) != 3 )
return(unsigned int)-1073741790;
if( (*((_WORD *)Message + 122) & 0x4000) != 0 )
return(unsigned int)-1073741790;
v10 = (_ALPC_PORT *)*((_QWORD *)Message + 2);
if( v10 != PortObject && ((*((_BYTE *)PortObject + 416) & 6) != 6 || v10 != **((_ALPC_PORT ***)PortObject + 2)) )
return(unsigned int)-1073741790;
v11 = *((_QWORD *)Message + 17);
if( !v11 )
{
v12 = AlpcpReferenceConnectedPort(PortObject);
v8 = (struct _DMA_ADAPTER *)v12;
if( v12 )
{
if( (*((_DWORD *)v12 + 64) & 0x10000) != 0 )
{
if( (*((_DWORD *)v12 + 104) & 0x400) == 0 )
{
p_ClientContext = (struct _SECURITY_CLIENT_CONTEXT *)((char *)v12 + 64);
goto LABEL_16;
}
v13 = (_ETHREAD *)*((_QWORD *)Message + 4);
if( v13 )
{
if( v6 && *((_DWORD *)v12 + 66) < v25 )
{
v16 = -1073741790;
goto LABEL_20;
}
v14 = (_SECURITY_QUALITY_OF_SERVICE *)((char *)v12 + 260);
if( v21 )
v15 = SeCreateClientSecurityEx(v13, v14, 0, &ClientContext);
else
v15 = SeCreateClientSecurity((PETHREAD)v13, v14, 0, &ClientContext);
v16 = v15;
if( v15 < 0 )
goto LABEL_20;
p_ClientContext = &ClientContext;
v7 = 1;
LABEL_16:
ImpersonationLevel = *(_OWORD *)&p_ClientContext->SecurityQos.Length;
Token = *(_OWORD *)&p_ClientContext->ClientToken;
if( v6 )
{
if( v25 > p_ClientContext->SecurityQos.ImpersonationLevel )
{
v16 = -1073741790;
goto LABEL_20;
}
DWORD1(ImpersonationLevel) = v25;
}
if( BYTE8(Token) )
v17 = BYTE1(*(_QWORD *)&p_ClientContext->DirectlyAccessClientToken);
else
v17 = BYTE1(*(_QWORD *)&p_ClientContext->SecurityQos.ContextTrackingMode);
v16 = PsImpersonateClient(
(_ETHREAD *)KeGetCurrentThread(),
(PVOID)Token,
1u,
v17,
SDWORD1(ImpersonationLevel));
goto LABEL_20;
}
v16 = -1073741790;
}
else
{
v16 = -1073741790;
}
LABEL_20:
if( v8 )
HalPutDmaAdapter(v8);
if( v7 )
{
ClientToken = (struct _DMA_ADAPTER *)p_ClientContext->ClientToken;
if( *(_DWORD *)&ClientToken[12].Version == 1 || ClientToken )
HalPutDmaAdapter(ClientToken);
}
return v16;
}
return(unsigned int)-1073741790;
}
ExAcquirePushLockExclusiveEx(v11 - 16, 0i64);
v20 = *(_DWORD *)(v11 + 104);
if( (v20 & 1) == 0 )
{
*(_DWORD *)(v11 + 104) = v20 | 2;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v11 - 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v11 - 16));
KeAbPostRelease((PVOID)(v11 - 16));
p_ClientContext = (struct _SECURITY_CLIENT_CONTEXT *)(v11 + 32);
goto LABEL_16;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v11 - 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v11 - 16));
KeAbPostRelease((PVOID)(v11 - 16));
return 3221225506i64;
}Referenced by:
NtAlpcImpersonateClientOfPort