CmpReportNotifyHelper
VOID __fastcall CmpReportNotifyHelper(INT64 a1, INT64 a2, INT64 a3, INT64 a4, LIST_ENTRY *ExternalDeferredPostAsync){
INT16 v6;
int v8;
volatile INT64 *v10;
INT64 KcbAtLayerHeight;
unsigned __int8 CurrentIrql;
INT64 i;
__int64 v14;
_CM_TRANS_PTR v15;
__int64 v16;
INT64 v17;
unsigned int v18;
_UNICODE_STRING *v19;
UINT64 v20;
LIST_ENTRY DelayedDeref;
v6 = *(_WORD *)(a1 + 2);
v8 = a4;
DelayedDeref.Blink = &DelayedDeref;
DelayedDeref.Flink = &DelayedDeref;
v10 = (volatile INT64 *)(a2 + 1672);
KcbAtLayerHeight = CmpGetKcbAtLayerHeight(a1, v6);
ExAcquirePushLockExclusiveEx(a2 + 1672, 0i64);
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
for( i = *(_QWORD *)(a2 + 1584); i; i = *(_QWORD *)i )
{
v14 = *(_QWORD *)(i + 32);
if( (*(_DWORD *)(v14 + 8) & 0x7FE00000u) > (*(_DWORD *)(KcbAtLayerHeight + 8) & 0x7FE00000u) )
break;
if( (v8 & *(_DWORD *)(i + 48) & 0x3FFFFFFF) != 0
&& ((*(_DWORD *)(i + 48) & 0x40000000) != 0 || v14 == KcbAtLayerHeight) )
{
v15.0 = *($F21FB2B31E9B30A96ADF077329256E82 *)(*(_QWORD *)(i + 40) + 56i64);
if( (!a3 || *(_QWORD *)(a3 + 56) == *(_QWORD *)&v15.0)
&& (!*(_QWORD *)&v15.0 || (unsigned int)CmpTransIsTransActive(v15)) )
{
v16 = *(_QWORD *)(i + 32);
v17 = KcbAtLayerHeight;
v18 = (*(_DWORD *)(v16 + 8) >> 21) & 0x3FF;
if( ((*(_DWORD *)(KcbAtLayerHeight + 8) >> 21) & 0x3FFu) > v18 )
{
do
v17 = *(_QWORD *)(v17 + 72);
while( ((*(_DWORD *)(v17 + 8) >> 21) & 0x3FFu) > v18 );
}
if( v17 == v16 && CmpNotifyTriggerCheck(i, a1, a3) )
CmpPostNotify((_CM_NOTIFY_BLOCK *)i, v19, v20, 268i64, 0, &DelayedDeref, ExternalDeferredPostAsync);
}
}
}
__writecr8(CurrentIrql);
if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v10);
KeAbPostRelease((PVOID)v10);
CmpDelayedDerefKeys(&DelayedDeref);
}Referenced by:
CmpReportNotifyForKcbStack