AlpcpWaitForPortReferences
INT64 __fastcall AlpcpWaitForPortReferences(
_ALPC_PORT *PortObject,
UINT64 *DesiredReferenceNo,
UINT64 Length,
UINT64 *ReturnLength,
INT64 PreviousMode){
__int64 v6;
volatile signed __int64 *v8;
unsigned int v9;
__int128 Event;
__int128 Event_16;
Event = 0i64;
Event_16 = 0i64;
if( !PortObject || (_DWORD)Length != 4 )
return 3221225485i64;
if( (_BYTE)PreviousMode )
{
v6 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)DesiredReferenceNo < 0x7FFFFFFF0000i64 )
v6 = (__int64)DesiredReferenceNo;
DWORD2(Event_16) = *(_DWORD *)v6;
if( ReturnLength )
*(_DWORD *)ReturnLength = 0;
}
else
{
DWORD2(Event_16) = *(_DWORD *)DesiredReferenceNo;
if( ReturnLength )
*(_DWORD *)ReturnLength = 0;
}
if( *((_DWORD *)PortObject + 101) == DWORD2(Event_16) )
return 0i64;
KeInitializeEvent((_KEVENT *)&Event, SynchronizationEvent, 0);
v8 = (volatile signed __int64 *)((char *)PortObject + 352);
ExAcquirePushLockExclusiveEx((UINT64)PortObject + 352, 0i64);
if( *((_QWORD *)PortObject + 51) )
{
v9 = -1073741811;
}
else if( *((_DWORD *)PortObject + 101) == DWORD2(Event_16) )
{
v9 = 0;
}
else
{
*((_QWORD *)PortObject + 51) = &Event;
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)PortObject + 44);
KeAbPostRelease((char *)PortObject + 352);
while( 1 )
{
v9 = KeWaitForSingleObject(&Event, WrUserRequest, 0, 1u, 0i64);
if( !v9 )
break;
if( (*((_DWORD *)KeGetCurrentThread() + 324) & 1) != 0 )
{
v9 = -1073741749;
break;
}
}
ExAcquirePushLockExclusiveEx((UINT64)PortObject + 352, 0i64);
*((_QWORD *)PortObject + 51) = 0i64;
}
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)PortObject + 44);
KeAbPostRelease((char *)PortObject + 352);
return v9;
}Referenced by:
NtAlpcQueryInformation