PnpChainDereferenceComplete
VOID __fastcall PnpChainDereferenceComplete(
_DEVICE_OBJECT *PhysicalDeviceObject,
UINT64 OnCleanStack,
INT64 a3,
INT64 a4){
_ETHREAD *CurrentThread;
int v5;
PVOID *i;
int *v8;
_QWORD *v9;
int v10;
int v11;
__int64 v12;
bool v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = OnCleanStack;
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(&IopSurpriseRemoveListLock, 1u);
for( i = (PVOID *)IopPendingSurpriseRemovals; ; i = (PVOID *)*i )
{
if( i == &IopPendingSurpriseRemovals )
goto LABEL_14;
if( !*((_BYTE *)i + 104) && (int)IopSetRelationsTag((int **)i[8], (__int64)PhysicalDeviceObject) >= 0 )
{
v8 = *(int **)i[8];
v9 = i[7];
v10 = v8[2];
v11 = *v8;
v12 = v9 ? *(_QWORD *)(v9[39] + 40i64) : 0i64;
if( v10 == v11 && *(_DWORD *)(v12 + 300) != 782 )
break;
}
}
v13 = PnpDelayedRemovePending == 0;
*((_BYTE *)i + 104) = 1;
if( !v13 )
{
LABEL_14:
ExReleaseResourceLite(&IopSurpriseRemoveListLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return;
}
PnpDelayedRemovePending = 1;
ExReleaseResourceLite(&IopSurpriseRemoveListLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v5 && *((PEPROCESS *)KeGetCurrentThread() + 23) == PsInitialSystemProcess )
{
PnpDelayedRemoveWorker(0i64);
}
else
{
PnpDelayedRemoveWorkItem.Parameter = 0i64;
PnpDelayedRemoveWorkItem.List.Flink = 0i64;
PnpDelayedRemoveWorkItem.WorkerRoutine = (void(__fastcall *)(void *))PnpDelayedRemoveWorker;
ExQueueWorkItem(&PnpDelayedRemoveWorkItem, DelayedWorkQueue);
}
}Referenced by:
IopCompleteUnloadOrDelete
PnpIsChainDereferenced