PnpUnlinkDeviceRemovalRelations
void __fastcall PnpUnlinkDeviceRemovalRelations(__int64 a1, __int64 a2){
_ETHREAD *CurrentThread;
__int64 v4;
UINT8 v5;
bool v6;
__int64 v7;
unsigned __int8(__fastcall *FlushAdapterBuffers)(_DMA_ADAPTER *, _MDL *, void *, void *, unsigned int, unsigned __int8);
__int64 v9;
PADAPTER_OBJECT DmaAdapter;
int a2a;
int v12;
int a4;
PVOID P;
DmaAdapter = 0i64;
v9 = 0i64;
P = 0i64;
PpDevNodeLockTree(4);
if( a2 && *(_BYTE *)(a2 + 8) )
{
v12 = 0;
a2a = 1;
while( IopEnumerateRelations((unsigned int **)a2, &a2a, &DmaAdapter, &a4, 0i64) )
{
FlushAdapterBuffers = DmaAdapter[19].DmaOperations->FlushAdapterBuffers;
IopIsDescendantNode((int **)a2, (__int64)DmaAdapter);
if( (unsigned int)(*((_DWORD *)FlushAdapterBuffers + 75) - 787) <= 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = *((_QWORD *)FlushAdapterBuffers + 2);
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(&PnpRegistryDeviceResource, 1u);
PnpCleanupDeviceRegistryValues((UNICODE_STRING *)((char *)FlushAdapterBuffers + 40));
v5 = PpDevNodeRemoveFromTree((_DEVICE_NODE *)FlushAdapterBuffers);
ExReleaseResourceLite(&PnpRegistryDeviceResource);
KeLeaveCriticalRegion();
if( v5 )
{
v6 = *((_QWORD *)FlushAdapterBuffers + 6) == 0i64;
*((_QWORD *)FlushAdapterBuffers + 81) = v4;
if( !v6 )
{
PiPnpRtlBeginOperation((__int64 **)&P);
v9 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
PnpSetObjectProperty(
PiPnpRtlCtx,
*((_QWORD *)FlushAdapterBuffers + 6),
1u,
0i64,
0i64,
(__int64)&DEVPKEY_Device_LastRemovalDate,
16,
(__int64)&v9,
8u,
0);
PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v7, *((_QWORD *)FlushAdapterBuffers + 6), 1);
PnpSetDeviceInstanceRemovalEvent((__int64)FlushAdapterBuffers);
if( P )
{
PiPnpRtlEndOperation(P);
P = 0i64;
}
}
if( *((_DWORD *)FlushAdapterBuffers + 75) == 788 )
IopRemoveCurrentRelationFromList((UINT64 **)a2, (INT64)DmaAdapter, &a2a);
HalPutDmaAdapter(DmaAdapter);
}
}
}
}
PpDevNodeUnlockTree(4);
}Referenced by:
PiEventRemovalPostSurpriseRemove
PipRemoveDevicesInRelationList
PnpProcessQueryRemoveAndEject