PnpUnlinkDeviceRemovalRelations
void __fastcall PnpUnlinkDeviceRemovalRelations(__int64 a1, _RELATION_LIST *a2){
_ETHREAD *CurrentThread;
__int64 v4;
UINT8 v5;
bool v6;
INT64 v7;
char *DeviceNode;
INT64 v9;
__int64 v10;
_DEVICE_OBJECT *DeviceObject;
_RELATION_LIST_MARKER Marker;
_DEVICE_RELATION_LEVEL RelationLevel;
HPNPOPCTX *hPnpOpCtx;
DeviceObject = 0i64;
v10 = 0i64;
hPnpOpCtx = 0i64;
PpDevNodeLockTree(PPL_TREEOP_BLOCK_READS_FROM_ALLOW);
if( a2 && a2->Sorted )
{
Marker.Counter = 0;
Marker.Mode = ENUMERATE_FORWARD;
while( IopEnumerateRelations(a2, &Marker, &DeviceObject, &RelationLevel, 0i64) )
{
DeviceNode = (char *)DeviceObject->DeviceObjectExtension->DeviceNode;
IopIsDescendantNode(a2, DeviceObject);
if( (unsigned int)(*((_DWORD *)DeviceNode + 75) - 787) <= 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = *((_QWORD *)DeviceNode + 2);
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6688, 1, v9);
PnpCleanupDeviceRegistryValues((_UNICODE_STRING *)(DeviceNode + 40));
v5 = PpDevNodeRemoveFromTree((_DEVICE_NODE *)DeviceNode);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegion();
if( v5 )
{
v6 = *((_QWORD *)DeviceNode + 6) == 0i64;
*((_QWORD *)DeviceNode + 81) = v4;
if( !v6 )
{
PiPnpRtlBeginOperation(&hPnpOpCtx);
v10 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
PnpSetObjectProperty(
*(&stru_140CF2E80 + 607),
*((_QWORD *)DeviceNode + 6),
1u,
0i64,
0i64,
(__int64)&DEVPKEY_Device_LastRemovalDate,
16,
(__int64)&v10,
8,
0);
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v7, *((WCHAR **)DeviceNode + 6), 1);
PnpSetDeviceInstanceRemovalEvent((__int64)DeviceNode);
if( hPnpOpCtx )
{
PiPnpRtlEndOperation(hPnpOpCtx);
hPnpOpCtx = 0i64;
}
}
if( *((_DWORD *)DeviceNode + 75) == 788 )
IopRemoveCurrentRelationFromList(&a2->DeviceObjectList, DeviceObject, &Marker);
HalPutDmaAdapter((PADAPTER_OBJECT)DeviceObject);
}
}
}
}
PpDevNodeUnlockTree(PPL_TREEOP_BLOCK_READS_FROM_ALLOW);
}Referenced by:
PiEventRemovalPostSurpriseRemove
PipRemoveDevicesInRelationList
PnpProcessQueryRemoveAndEject