AlpcpCancelMessagesByRequestor
INT64 __fastcall AlpcpCancelMessagesByRequestor(
_ALPC_PORT *RequestorPort,
_ALPC_PORT *QueuePort,
_LIST_ENTRY *SearchQueue,
UINT64 SearchQueueType,
_LIST_ENTRY *CanceledQueue){
int v5;
_ALPC_PORT *v6;
unsigned int v7;
_BOOL8 v10;
__int64 v11;
_LIST_ENTRY *Flink;
unsigned int v13;
volatile INT64 *v14;
UINT64 v16;
int v17;
int Blink;
_LIST_ENTRY *v19;
int v20;
_LIST_ENTRY *v21;
_LIST_ENTRY *v22;
volatile INT64 *v23;
__int64 v24;
_LIST_ENTRY *i;
ULONG_PTR BugCheckParameter2;
int v28;
v5 = *((_DWORD *)QueuePort + 104) & 6;
v6 = RequestorPort;
v7 = SearchQueueType;
if( (*((_DWORD *)RequestorPort + 104) & 6) == 4 )
{
v10 = v5 != 4;
goto LABEL_3;
}
if( v5 == 2 )
{
LODWORD(v10) = 0;
LABEL_3:
if( !v10 )
goto LABEL_5;
}
if( (_DWORD)SearchQueueType == 3 )
{
v28 = 1;
LABEL_16:
v11 = 176i64;
goto LABEL_7;
}
LABEL_5:
v28 = 0;
if( (unsigned int)SearchQueueType <= 2 )
{
v11 = 136i64;
goto LABEL_7;
}
if( (_DWORD)SearchQueueType == 3 )
goto LABEL_16;
v11 = 200i64;
LABEL_7:
ExAcquirePushLockExclusiveEx((UINT64)QueuePort + v11, 0i64);
Flink = SearchQueue->Flink;
v13 = 0;
while( Flink != SearchQueue )
{
BugCheckParameter2 = (ULONG_PTR)Flink;
if( (_ALPC_PORT *)Flink[1].Blink == v6 || ((__int64)Flink[2].Blink & 0x8000) != 0 )
{
AlpcpReferenceBlob(Flink);
if( !AlpcpTryLockForCachedReferenceBlob(Flink) )
{
if( v7 <= 2 )
{
v23 = (volatile INT64 *)((char *)QueuePort + 136);
}
else if( v7 == 3 )
{
v23 = (volatile INT64 *)((char *)QueuePort + 176);
}
else
{
v23 = (volatile INT64 *)((char *)QueuePort + 200);
}
if( (_InterlockedExchangeAdd64(v23, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v23);
KeAbPostRelease((PVOID)v23);
v13 = 1;
AlpcpLockForCachedReferenceBlob(Flink);
if( v7 <= 2 )
{
v24 = 136i64;
}
else
{
v24 = 176i64;
if( v7 != 3 )
v24 = 200i64;
}
ExAcquirePushLockExclusiveEx((UINT64)QueuePort + v24, 0i64);
v6 = RequestorPort;
if( (_ALPC_PORT *)Flink[1].Blink == RequestorPort )
{
for( i = SearchQueue->Flink; i != SearchQueue; i = i->Flink )
{
if( i == Flink )
{
v17 = 1;
goto LABEL_30;
}
}
}
--WORD1(Flink[-2].Flink);
AlpcpUnlockMessage((ULONG_PTR)Flink);
Flink = SearchQueue->Flink;
continue;
}
if( (_ALPC_PORT *)Flink[1].Blink == v6 )
{
v17 = 0;
LABEL_30:
if( Flink[4].Flink )
goto LABEL_35;
Blink = (int)Flink[2].Blink;
if( (Blink & 0x80u) != 0 )
goto LABEL_35;
v19 = Flink[2].Flink;
v20 = Blink | 0x80;
BYTE4(Flink[15].Flink) = 0;
WORD2(Flink[15].Flink) |= 0xCu;
LODWORD(Flink[2].Blink) = v20;
LODWORD(Flink[15].Flink) = 2621440;
if( v19 )
{
if( (_LIST_ENTRY *)_InterlockedExchange64((volatile __int64 *)&v19[82].Blink, 0i64) == Flink )
{
KeReleaseSemaphoreEx((KSEMAPHORE *)&Flink[2].Flink[72].Blink, 1i64, 1i64, v16);
Flink[2].Flink = 0i64;
WORD1(Flink[-2].Flink) -= 3;
goto LABEL_35;
}
}
else if( (v20 & 0x200) == 0 )
{
Flink[5].Blink = CanceledQueue->Blink;
Flink[5].Flink = CanceledQueue;
CanceledQueue->Blink->Flink = Flink + 5;
CanceledQueue->Blink = Flink + 5;
LABEL_35:
AlpcpReleaseMessageAttributesOnCancel((__int64)Flink, v28);
LODWORD(Flink[2].Blink) |= 0x200u;
WORD2(Flink[15].Flink) &= ~0x2000u;
AlpcpClearOwnerPortMessage((__int64)Flink);
AlpcpTransferQuotaMessage((__int64)Flink);
v21 = Flink[13].Flink;
if( v21 )
{
PsReleaseProcessWakeCounter(v21, LODWORD(Flink[16].Blink));
Flink[13].Flink = 0i64;
}
v22 = Flink[13].Blink;
if( v22 )
{
PsReleaseProcessWakeCounter(v22, LODWORD(Flink[16].Blink));
Flink[13].Blink = 0i64;
}
if( v17 )
Flink = SearchQueue->Flink;
else
Flink = Flink->Flink;
AlpcpUnlockMessage(BugCheckParameter2);
v6 = RequestorPort;
continue;
}
--WORD1(Flink[-2].Flink);
goto LABEL_35;
}
--WORD1(Flink[-2].Flink);
AlpcpUnlockMessage((ULONG_PTR)Flink);
}
Flink = Flink->Flink;
}
if( v7 > 2 )
{
if( v7 == 3 )
v14 = (volatile INT64 *)((char *)QueuePort + 176);
else
v14 = (volatile INT64 *)((char *)QueuePort + 200);
}
else
{
v14 = (volatile INT64 *)((char *)QueuePort + 136);
}
if( (_InterlockedExchangeAdd64(v14, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v14);
KeAbPostRelease((PVOID)v14);
return v13;
}Referenced by:
AlpcpDisconnectPort