CmpPostNotify
VOID __stdcall CmpPostNotify(
CM_NOTIFY_BLOCK *NotifyBlock,
INT64 Status,
UINT8 PostListLockHeld,
LIST_ENTRY *ExternalKeyDeref,
LIST_ENTRY *ExternalDeferredPostAsync){
LIST_ENTRY *v6;
_LIST_ENTRY *v7;
_LIST_ENTRY *p_PostList;
unsigned __int64 v9;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v11;
int Blink;
INT64 v13;
_LIST_ENTRY *v14;
_LIST_ENTRY *v15;
_LIST_ENTRY *v16;
_LIST_ENTRY *v17;
_LIST_ENTRY *v18;
_LIST_ENTRY *v19;
_LIST_ENTRY *v20;
_LIST_ENTRY *v21;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *v23;
_LIST_ENTRY *v24;
_LIST_ENTRY *v25;
__int128 v26;
__int128 v27;
int v28;
_LIST_ENTRY *DelayedDeref;
_LIST_ENTRY *DeferredPostAsync;
v28 = (int)ExternalKeyDeref;
v26 = 0i64;
v27 = 0i64;
if( !DelayedDeref )
{
*((_QWORD *)&v26 + 1) = &v26;
*(_QWORD *)&v26 = &v26;
}
v6 = (LIST_ENTRY *)&v26;
if( DelayedDeref )
v6 = DelayedDeref;
if( !DeferredPostAsync )
{
*((_QWORD *)&v27 + 1) = &v27;
*(_QWORD *)&v27 = &v27;
}
v7 = (_LIST_ENTRY *)&v27;
if( DeferredPostAsync )
v7 = DeferredPostAsync;
if( !(_BYTE)ExternalDeferredPostAsync )
{
ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
LODWORD(ExternalKeyDeref) = v28;
}
p_PostList = &NotifyBlock->PostList;
if( p_PostList->Flink == p_PostList )
{
*((_DWORD *)NotifyBlock + 12) |= 0x80000000;
if( !(_BYTE)ExternalDeferredPostAsync )
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
}
else
{
*((_DWORD *)NotifyBlock + 12) &= ~0x80000000;
LABEL_16:
v9 = 1i64;
while( 1 )
{
Flink = p_PostList->Flink;
if( p_PostList->Flink == p_PostList )
break;
v11 = Flink->Flink;
if( Flink->Blink != p_PostList || v11->Blink != Flink )
goto LABEL_51;
p_PostList->Flink = v11;
v11->Blink = p_PostList;
if( (_DWORD)ExternalKeyDeref != 267 || ((__int64)Flink[3].Blink & 0x10000) != 0 )
{
Blink = (int)Flink[3].Blink;
if( (Blink & 0x10000) == 0 )
{
v18 = Flink;
do
{
v19 = v18[2].Flink;
LODWORD(v19[1].Blink) &= ~0x10000u;
v18 = v19 - 2;
}
while( v18 != Flink );
LODWORD(Flink[3].Blink) |= 0x10000u;
Blink = (int)Flink[3].Blink;
}
if( (unsigned __int16)Blink != (_DWORD)v9 )
{
CmpCancelSubordinatePost((INT64)Flink, (INT64)v6);
CmpAddToDelayedDeref((INT64)Flink, v13);
Blink = (int)Flink[3].Blink;
}
if( (unsigned __int16)Blink == (_DWORD)v9 )
{
v25 = Flink[4].Flink;
Flink->Flink = 0i64;
LODWORD(v25[1].Blink) = (_DWORD)ExternalKeyDeref;
KeSetEvent((PRKEVENT)Flink[4].Flink, 0, 0);
goto LABEL_31;
}
if( (unsigned __int16)Blink == 2 )
{
KeInsertQueueApc((INT64)&Flink[4].Flink[1], (unsigned int)ExternalKeyDeref, (INT64)Flink, 0i64);
LABEL_31:
LODWORD(ExternalKeyDeref) = v28;
goto LABEL_16;
}
if( (unsigned int)(unsigned __int16)Blink - 3 <= (unsigned int)v9 )
{
CmpFreeSubordinatePost((INT64)Flink);
v14 = Flink[1].Blink;
v15 = Flink + 1;
v16 = v15->Flink;
if( v15->Flink->Blink != v15
|| v14->Flink != v15
|| (v14->Flink = v16, v16->Blink = v14, v17 = v7->Blink, v17->Flink != v7) )
{
LABEL_51:
__fastfail(3u);
}
v15->Flink = v7;
v15->Blink = v17;
v17->Flink = v15;
v7->Blink = v15;
goto LABEL_31;
}
}
else
{
v20 = Flink[2].Flink;
v21 = Flink[2].Blink;
if( v20->Blink != &Flink[2] )
goto LABEL_51;
if( v21->Flink != &Flink[2] )
goto LABEL_51;
v21->Flink = v20;
v20->Blink = v21;
CurrentIrql = KeGetCurrentIrql();
__writecr8(v9);
v23 = Flink[1].Flink;
v24 = Flink[1].Blink;
if( v23->Blink != &Flink[1] || v24->Flink != &Flink[1] )
goto LABEL_51;
v24->Flink = v23;
v23->Blink = v24;
__writecr8(CurrentIrql);
if( LODWORD(Flink[3].Blink) != (_DWORD)v9 )
{
CmpAddToDelayedDeref((INT64)Flink, (INT64)v6);
CmpFreePostBlock(Flink);
goto LABEL_31;
}
}
}
if( !(_BYTE)ExternalDeferredPostAsync )
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
if( !DelayedDeref )
CmpDelayedDerefKeys(v6);
if( !DeferredPostAsync )
CmpSignalDeferredPosts(v7);
}
}Referenced by:
CmpCloseKeyObject
CmpFlushNotify
CmpNotifyChangeKey
CmpReportNotifyHelper