AlpcpCompleteDispatchMessage
VOID __fastcall AlpcpCompleteDispatchMessage(INT64 a1){
INT64 v1;
ULONG_PTR v3;
int v4;
int v5;
__int64 v6;
int v7;
int v8;
int v9;
int v10;
BOOL v11;
INT64 v12;
unsigned int v13;
_QWORD *v14;
__int64 v15;
int v16;
UNICODE_STRING *v17;
char v18;
int v19;
signed __int64 v20;
UINT64 v21;
unsigned int v22;
int v23;
int v24;
unsigned int v25;
int v26;
int v27;
__int64 v28;
unsigned int v29;
unsigned int CompletionBuffer;
__int64 v31;
void *v32;
_QWORD *v33;
unsigned int v34;
int v35;
bool v36;
__int64 v37;
_QWORD *v38;
UINT64 v39;
int v40;
int inserted;
void *v42;
__int16 v43;
unsigned int v44;
unsigned __int64 v45;
__int64 v46;
int v47;
__int16 v48;
__int16 v49;
__int16 v50;
_DWORD *BugCheckParameter4;
unsigned int v52;
unsigned int v53;
unsigned int v54;
int v55;
int v56;
__int64 v57;
__int64 v58;
char v59;
CHAR v60;
unsigned int v61;
unsigned int v62;
v1 = *(_QWORD *)(a1 + 32);
v3 = *(_QWORD *)(a1 + 8);
v4 = *(_DWORD *)(a1 + 48);
v60 = 0;
v5 = v4 & 4;
v6 = *(_QWORD *)(a1 + 16);
v7 = v4 & 0x20000;
v57 = v6;
v8 = v4 & 0x800000;
v56 = v5;
v9 = *(_DWORD *)(*(_QWORD *)a1 + 256i64);
if( (v9 & 0x400000) != 0 )
v10 = 2;
else
v10 = (v9 & 0x200000) != 0;
v11 = v7 || v8;
if( (*(_DWORD *)(v3 + 40) & 0x200) == 0 )
{
v12 = 0i64;
if( (*(_QWORD *)(v1 + 24) & 1) == 0 )
v12 = *(_QWORD *)(v1 + 24);
if( v12 )
{
if( v11 || v10 || (AlpcpWakePolicyDefault & 1) == 0 )
{
v13 = 1;
if( v10 )
{
if( v10 == 1 )
v13 = 3;
}
else if( (AlpcpWakePolicyDefault & 1) != 0 )
{
v13 = 3;
if( (AlpcpWakePolicyDefault & 2) != 0 )
v13 = -2147483645;
}
*(_QWORD *)(v3 + 208) = PsChargeProcessWakeCounter(v12, v13, 2i64, *(unsigned int *)(v3 + 264));
}
if( KeHeteroSystem
&& v11
&& (!*((_BYTE *)KeGetCurrentThread() + 512)
|| (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 68) + 632i64) & 0x380) == 384
|| (*((_DWORD *)KeGetCurrentThread() + 239) & 0x300) == 768) )
{
*(_QWORD *)(v3 + 216) = PsChargeProcessWakeCounter(v12, 0i64, 6i64, *(unsigned int *)(v3 + 264));
}
}
v6 = v57;
}
if( (*(_DWORD *)(a1 + 48) & 8) != 0 )
{
if( *(_QWORD *)(v3 + 176) )
{
AlpcpCaptureMessageDataSafe(v3);
*(_QWORD *)(v3 + 176) = 0i64;
}
if( *(_QWORD *)(v3 + 144) )
AlpcpExposeViewAttributeInSenderContext(v1, v3);
++*(_WORD *)(v3 - 30);
AlpcpInsertMessageDirectQueue(v1, v3);
*(_QWORD *)(a1 + 40) = *(_QWORD *)(v3 + 160);
*(_DWORD *)(v3 + 40) &= ~0x8000u;
*(_QWORD *)(v3 + 160) = 0i64;
AlpcpUnlockMessage(v3);
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v6 - 16), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v6 - 16));
KeAbPostRelease((PVOID)(v6 - 16));
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v1 + 352));
KeAbPostRelease((PVOID)(v1 + 352));
HalPutDmaAdapter((PADAPTER_OBJECT)v1);
*(_QWORD *)(a1 + 32) = 0i64;
if( !v7 && !v5 )
{
v45 = *(_QWORD *)(a1 + 40);
if( v45 >= 4 )
{
KeSetEvent((PRKEVENT)(v45 & 0xFFFFFFFFFFFFFFFCui64), 0);
v46 = *(_QWORD *)(a1 + 40);
if( (v46 & 2) != 0 )
HalPutDmaAdapter((PADAPTER_OBJECT)(v46 & 0xFFFFFFFFFFFFFFFCui64));
}
*(_QWORD *)(a1 + 40) = 0i64;
}
}
else
{
v14 = (_QWORD *)(v1 + 232);
if( (_QWORD *)*v14 == v14 )
goto LABEL_19;
ExAcquirePushLockExclusiveEx(v1 + 224, 0i64);
if( (_QWORD *)*v14 == v14 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 224), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v1 + 224));
KeAbPostRelease((PVOID)(v1 + 224));
LABEL_19:
if( *(_QWORD *)(v1 + 32) )
{
v59 = 1;
v55 = 0;
}
else
{
v59 = 0;
v55 = (*(_DWORD *)(v1 + 416) >> 9) & 1;
}
v15 = *(_QWORD *)(v1 + 360);
if( v15 && (*(_DWORD *)(v1 + 416) & 0x10000) != 0 )
{
v22 = (*(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0) | 0x40000000;
if( !*(_QWORD *)(v3 + 144) )
v22 = *(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0;
v23 = v22 | 0x10000000;
if( !*(_QWORD *)(v3 + 152) )
v23 = v22;
if( *(_QWORD *)(v3 + 168) )
v23 |= 0x2000000u;
v24 = *(_DWORD *)(v15 + 148);
if( (~v24 & v23) == 0 && ((*(unsigned __int16 *)(v3 + 244) & 0xFFFF00FF) != 5 || (v24 & 0x20000000) != 0) )
{
v25 = *(unsigned __int16 *)(v3 + 242);
v26 = *(_DWORD *)(v1 + 416) & 0x800;
v52 = (unsigned __int16)v25;
if( v24 )
{
v27 = 8;
if( v26 )
v27 = 4;
v28 = (unsigned int)(v27 - 1) & (v3 + 240 + *(unsigned __int16 *)(v3 + 242));
v29 = v28 ? v27 - v28 : 0;
v61 = v29;
v25 += v29 + *(_DWORD *)(v15 + 152);
v52 = v25;
}
else
{
v61 = 0;
}
v62 = 0;
if( v26 )
{
v25 -= 16;
v62 = 0x80000000;
v52 = v25;
}
CompletionBuffer = AlpcpAllocateCompletionBuffer(v1, v25);
v54 = CompletionBuffer;
if( CompletionBuffer != -1 )
{
v31 = *(_QWORD *)(v15 + 120) + CompletionBuffer;
v58 = v31;
if( v62 )
{
*(_WORD *)v31 = *(_WORD *)(v3 + 240);
v47 = *(unsigned __int16 *)(v3 + 240) + 24;
*(_WORD *)(v31 + 2) = v47;
v48 = *(_WORD *)(v3 + 246);
v53 = v47;
v49 = 0;
if( v48 )
v49 = v48 - 16;
*(_WORD *)(v31 + 6) = v49;
v50 = *(_WORD *)(v3 + 244) | 0x1000;
*(_WORD *)(v31 + 4) = v50;
*(_DWORD *)(v31 + 8) = *(_DWORD *)(v3 + 248);
*(_DWORD *)(v31 + 12) = *(_DWORD *)(v3 + 256);
*(_DWORD *)(v31 + 16) = *(_DWORD *)(v3 + 264);
*(_DWORD *)(v31 + 20) = *(_DWORD *)(v3 + 272);
*(_DWORD *)(v31 + 20) = *(_DWORD *)(v3 + 272);
if( (*(_DWORD *)(v1 + 256) & 0x1000) != 0 )
*(_WORD *)(v31 + 4) = v50 & 0xC00F;
v32 = (void *)(v31 + 24);
}
else
{
*(_OWORD *)v31 = *(_OWORD *)(v3 + 240);
*(_OWORD *)(v31 + 16) = *(_OWORD *)(v3 + 256);
*(_QWORD *)(v31 + 32) = *(_QWORD *)(v3 + 272);
if( (*(_DWORD *)(v1 + 256) & 0x1000) != 0 )
*(_WORD *)(v31 + 4) &= 0xC00Fu;
v32 = (void *)(v31 + 40);
v53 = *(unsigned __int16 *)(v3 + 242);
}
if( *(_QWORD *)(v3 + 176) )
AlpcpGetDataFromUserVaSafe(v3, v32);
else
AlpcpReadMessageData(v3, (char *)v32);
v40 = *(_DWORD *)(v15 + 148);
if( v40 )
{
BugCheckParameter4 = (_DWORD *)(v58 + v53 + v61);
*BugCheckParameter4 = v40;
BugCheckParameter4[1] = 0;
AlpcpExposeAttributes(v1, v62, v3, *(unsigned int *)(v15 + 148), (INT64)BugCheckParameter4);
}
inserted = AlpcpInsertCompletionListEntry(v1, v54);
if( inserted )
{
v60 = 1;
*(_DWORD *)(*(_QWORD *)(v15 + 80) + 72i64) = *(_DWORD *)(v3 + 264);
*(_DWORD *)(*(_QWORD *)(v15 + 80) + 76i64) = *(_DWORD *)(v3 + 272);
if( v59
&& (inserted & 2) == 0
&& HIWORD(*(_QWORD *)(*(_QWORD *)(v15 + 80) + 64i64))
+ (unsigned __int64)*(unsigned int *)(*(_QWORD *)(v1 + 48) + 12i64) >= *(unsigned int *)(v15 + 144) )
{
v59 = 0;
}
if( (*(_DWORD *)(v3 + 40) & 0x200) != 0 )
{
v43 = *(_WORD *)(v3 + 244);
v17 = *(_QWORD *)(v3 + 136) != 0i64 ? (UNICODE_STRING *)0x80000000i64 : 0i64;
LODWORD(v17) = (unsigned int)v17 | 0x40000000;
if( !*(_QWORD *)(v3 + 144) )
v17 = *(_QWORD *)(v3 + 136) != 0i64 ? (UNICODE_STRING *)0x80000000i64 : 0i64;
v44 = (unsigned int)v17 | 0x10000000;
if( !*(_QWORD *)(v3 + 152) )
v44 = (unsigned int)v17;
if( v44 )
{
*(_WORD *)(v3 + 244) = v43 | 0x2000;
++*(_WORD *)(v3 - 30);
AlpcpInsertMessagePendingQueue(v1, v3);
}
else
{
*(_WORD *)(v3 + 244) = v43 & 0xDFFF;
}
}
else
{
++*(_WORD *)(v3 - 30);
*(_WORD *)(v3 + 244) |= 0x2000u;
AlpcpInsertMessagePendingQueue(v1, v3);
}
LABEL_29:
if( AlpcpLogEnabled )
AlpcpLogSendMessage((_KALPC_MESSAGE *)v3);
if( v60 && AlpcpLogEnabled )
AlpcpLogReceiveMessage(v3);
if( v7 && AlpcpLogEnabled )
AlpcpLogWaitForReply((PVOID)v3, v17);
*(_DWORD *)(v3 + 40) &= ~0x8000u;
if( AlpcpMessageLogEnabled )
AlpcpEnterStateChangeEventMessageLog((_KALPC_MESSAGE *)v3);
v18 = *(_BYTE *)(v3 - 32);
if( (v18 & 1) != 0
&& (v19 = 0x10000 - *(__int16 *)(v3 - 30),
*(_BYTE *)(v3 - 32) = v18 & 0xFE,
*(_WORD *)(v3 - 30) = 0,
v19 > 0)
&& (v20 = -v19 + _InterlockedExchangeAdd64((volatile signed __int64 *)(v3 - 24), -v19), v20 <= 0) )
{
if( v20 )
KeBugCheckEx(0x18u, 0i64, v3, 0x28ui64, v20);
AlpcpDestroyBlob((PVOID)v3);
}
else
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v3 - 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v3 - 16));
KeAbPostRelease((PVOID)(v3 - 16));
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v57 - 16), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v57 - 16));
KeAbPostRelease((PVOID)(v57 - 16));
if( v55 )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v1 + 352));
KeAbPostRelease((PVOID)(v1 + 352));
if( v7 || v56 )
{
*(_BYTE *)(a1 + 58) = 0;
return;
}
KeReleaseSemaphoreEx(*(KSEMAPHORE **)(v1 + 248), 1i64, 1i64, v21);
}
else
{
if( v59 )
{
if( v7 || v56 )
{
*(_BYTE *)(a1 + 58) = 1;
*(_BYTE *)(a1 + 59) = v60;
}
else
{
AlpcpQueueIoCompletionPort(v1, v60, 1, 0);
HalPutDmaAdapter((PADAPTER_OBJECT)v1);
*(_QWORD *)(a1 + 32) = 0i64;
}
return;
}
v42 = *(void **)(v1 + 368);
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v1 + 352));
KeAbPostRelease((PVOID)(v1 + 352));
if( v42 )
ExNotifyCallback(v42, *(PVOID *)(v1 + 376), (PVOID)*(unsigned int *)(a1 + 48));
}
HalPutDmaAdapter((PADAPTER_OBJECT)v1);
*(_QWORD *)(a1 + 32) = 0i64;
return;
}
AlpcpFreeBitmap(*(UINT64 **)(*(_QWORD *)(v1 + 360) + 104i64), 0i64, v54 >> 6, (v52 + 63) >> 6);
}
}
}
if( *(_QWORD *)(v3 + 176) )
{
AlpcpCaptureMessageDataSafe(v3);
*(_QWORD *)(v3 + 176) = 0i64;
}
if( *(_QWORD *)(v3 + 144) )
AlpcpExposeViewAttributeInSenderContext(v1, v3);
++*(_WORD *)(v3 - 30);
ExAcquirePushLockExclusiveEx(v1 + 136, 0i64);
v16 = *(_DWORD *)(v3 + 40);
*(_QWORD *)(v3 + 16) = v1;
*(_DWORD *)(v3 + 40) = v16 & 0xFFFFFF81 | (4 * (*(_DWORD *)(v1 + 416) & 6)) | 1;
*(_QWORD *)(v3 + 8) = *(_QWORD *)(v1 + 152);
*(_QWORD *)v3 = v1 + 144;
**(_QWORD **)(v1 + 152) = v3;
++*(_DWORD *)(v1 + 448);
*(_QWORD *)(v1 + 152) = v3;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 136), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v1 + 136));
KeAbPostRelease((PVOID)(v1 + 136));
goto LABEL_29;
}
v33 = (_QWORD *)*v14;
if( *(_QWORD *)(v3 + 176) )
{
AlpcpCaptureMessageDataSafe(v3);
*(_QWORD *)(v3 + 176) = 0i64;
}
if( *(_QWORD *)(v3 + 144) )
AlpcpExposeViewAttributeInSenderContext(v1, v3);
if( (*(_DWORD *)(v3 + 40) & 0x200) == 0 )
goto LABEL_133;
v34 = (*(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0) | 0x40000000;
if( !*(_QWORD *)(v3 + 144) )
v34 = *(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0;
v35 = v34 | 0x10000000;
if( !*(_QWORD *)(v3 + 152) )
v35 = v34;
if( (v35 & *(_DWORD *)(v33 - 1)) != 0 )
{
LABEL_133:
*(_WORD *)(v3 + 244) |= 0x2000u;
++*(_WORD *)(v3 - 30);
AlpcpInsertMessagePendingQueue(v1, v3);
}
else
{
*(_WORD *)(v3 + 244) &= ~0x2000u;
}
++*(_WORD *)(v3 - 30);
*(_DWORD *)(v3 + 40) |= 0x2000u;
v36 = AlpcpLogEnabled == 0;
*(v33 - 1) = v3;
if( !v36 )
AlpcpLogSendMessage((_KALPC_MESSAGE *)v3);
v37 = *v33;
if( *(_QWORD **)(*v33 + 8i64) != v33 || (v38 = (_QWORD *)v33[1], (_QWORD *)*v38 != v33) )
__fastfail(3u);
*v38 = v37;
*(_QWORD *)(v37 + 8) = v38;
*v33 = 0i64;
*(_DWORD *)(v3 + 40) &= ~0x8000u;
AlpcpUnlockMessage(v3);
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v57 - 16), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v57 - 16));
KeAbPostRelease((PVOID)(v57 - 16));
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 224), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v1 + 224));
KeAbPostRelease((PVOID)(v1 + 224));
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v1 + 352));
KeAbPostRelease((PVOID)(v1 + 352));
HalPutDmaAdapter((PADAPTER_OBJECT)v1);
*(_QWORD *)(a1 + 32) = 0i64;
if( v7 || v5 )
*(_QWORD *)(a1 + 24) = v33 - 167;
else
KeReleaseSemaphoreEx((KSEMAPHORE *)(v33 - 22), 1i64, 1i64, v39);
}
}Referenced by:
AlpcpDispatchCloseMessage
AlpcpDispatchConnectionRequest
AlpcpDispatchNewMessage
AlpcpDispatchReplyToPort