PnpDelayedRemoveWorker
void __fastcall PnpDelayedRemoveWorker(PVOID P){
INT64 v2;
PENDING_RELATIONS_LIST_ENTRY **v3;
PENDING_RELATIONS_LIST_ENTRY *v4;
PENDING_RELATIONS_LIST_ENTRY ***v5;
_QWORD *v6;
PENDING_RELATIONS_LIST_ENTRY *v7;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 v11;
PENDING_RELATIONS_LIST_ENTRY *Entry;
PENDING_RELATIONS_LIST_ENTRY **p_Entry;
p_Entry = &Entry;
Entry = (PENDING_RELATIONS_LIST_ENTRY *)&Entry;
PpDevNodeLockTree(PPL_TREEOP_ALLOW_READS);
*(&PnpReplaceEvent + 1016) = KeGetCurrentThread();
ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6176, 1, v2);
v3 = (PENDING_RELATIONS_LIST_ENTRY **)*(&PnpReplaceEvent + 788);
if( (_UNKNOWN *)*(&PnpReplaceEvent + 788) != (_UNKNOWN *)((char *)&PnpReplaceEvent + 6304) )
{
do
{
v4 = *v3;
if( *((_BYTE *)v3 + 104) )
{
if( *(_DWORD *)(*(_QWORD *)v3[8] + 8i64) == **(_DWORD **)v3[8] )
{
if( *((PENDING_RELATIONS_LIST_ENTRY ***)v4 + 1) != v3
|| (v5 = (PENDING_RELATIONS_LIST_ENTRY ***)v3[1], *v5 != v3)
|| (*v5 = (PENDING_RELATIONS_LIST_ENTRY **)v4,
*((_QWORD *)v4 + 1) = v5,
v6 = p_Entry,
*p_Entry != (PENDING_RELATIONS_LIST_ENTRY *)&Entry) )
{
LABEL_19:
__fastfail(3u);
}
v3[1] = (PENDING_RELATIONS_LIST_ENTRY *)p_Entry;
*v3 = (PENDING_RELATIONS_LIST_ENTRY *)&Entry;
*v6 = v3;
p_Entry = v3;
}
else
{
*((_BYTE *)v3 + 104) = 0;
}
}
v3 = (PENDING_RELATIONS_LIST_ENTRY **)v4;
}
while( v4 != (PENDING_RELATIONS_LIST_ENTRY *)((char *)&PnpReplaceEvent + 6304) );
}
byte_140C50311 = 0;
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6176));
while( 1 )
{
v7 = Entry;
if( Entry == (PENDING_RELATIONS_LIST_ENTRY *)&Entry )
break;
if( *((PENDING_RELATIONS_LIST_ENTRY ***)Entry + 1) != &Entry )
goto LABEL_19;
v8 = *(_QWORD *)Entry;
if( *(PENDING_RELATIONS_LIST_ENTRY **)(*(_QWORD *)Entry + 8i64) != Entry )
goto LABEL_19;
Entry = *(PENDING_RELATIONS_LIST_ENTRY **)Entry;
*(_QWORD *)(v8 + 8) = &Entry;
if( P )
{
*((_QWORD *)P + 2) = v7;
*((_QWORD *)P + 1) = *((_QWORD *)v7 + 7);
v9 = *((_QWORD *)v7 + 7);
if( v9 )
v10 = *(_QWORD *)(*(_QWORD *)(v9 + 312) + 40i64);
else
v10 = 0i64;
*(_QWORD *)P = v10;
*((_QWORD *)P + 3) = PnpEnableWatchdog(3, (__int64)P);
}
PipRemoveDevicesInRelationList(v7);
if( P )
{
v11 = *((_QWORD *)P + 3);
if( v11 )
{
PnpDisableWatchdog(v11);
*((_QWORD *)P + 3) = 0i64;
}
}
}
*(&PnpReplaceEvent + 1016) = 0i64;
if( P )
ExFreePoolWithTag(P, 0x54706E50u);
PpDevNodeUnlockTree(PPL_TREEOP_ALLOW_READS);
}Referenced by:
PnpChainDereferenceComplete