PnpSurpriseRemoveLockedDeviceNode
void __fastcall PnpSurpriseRemoveLockedDeviceNode(PVOID BugCheckParameter4, UINT64 Problem, NTSTATUS ProblemStatus){
int v3;
_DEVICE_OBJECT *v4;
unsigned int v6;
int v8;
_DEVICE_NODE *v9;
int v10;
NTSTATUS v11;
__int64 v12;
INT64 v13;
_DEVICE_NODE *v14;
_PNP_DEVNODE_STATE v15;
__int64 v16;
PNP_DEPENDENCY_NODE *v17;
unsigned int Flags;
_DEVICE_NODE *Sibling;
INT64 v20;
INT64 v21;
_ADAPTER_OBJECT *v22;
__int128 v23;
v3 = *((_DWORD *)BugCheckParameter4 + 75);
v4 = (_DEVICE_OBJECT *)*((_QWORD *)BugCheckParameter4 + 4);
v6 = Problem;
v8 = 768;
v23 = 0i64;
if( v3 == 782 || v3 == 783 )
{
v8 = v3;
PipRestoreDevNodeState((_DEVICE_NODE *)BugCheckParameter4);
v3 = *((_DWORD *)BugCheckParameter4 + 75);
}
*((_WORD *)BugCheckParameter4 + 233) = 0;
if( v3 == 785 && v8 == 782 )
{
PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x10ui64);
PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeDeletePendingCloses);
return;
}
v9 = (_DEVICE_NODE *)*((_QWORD *)BugCheckParameter4 + 1);
if( v9 )
{
do
{
Flags = v9->Flags;
Sibling = v9->Sibling;
if( (Flags & 0x10) != 0 )
{
Flags &= ~0x10u;
v9->Flags = Flags;
}
if( v9->ResourceList || v9->BootResources || (Flags & 0x40) != 0 )
IopReleaseDeviceResources((PDEVICE_NODE)v9, 0);
PipSetDevNodeState(v9, DeviceNodeDeletePendingCloses);
v9 = Sibling;
}
while( Sibling );
}
if( v3 == 778 && (*((_DWORD *)BugCheckParameter4 + 99) & 0x1000000) != 0 )
{
PnpMarkDeviceForRemove(v4, 1i64, (_DEVICE_OBJECT **)&v23);
PnpUnlockMountableDevice((__int64)v4, v20, v21);
PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x1000000ui64);
}
v10 = *((_DWORD *)BugCheckParameter4 + 75);
if( v10 < 769 || v10 > 770 && (v10 <= 776 || v10 == 778 || (unsigned int)(v10 - 785) > 3) )
{
v11 = IopRemoveDevice(v4, 0x17ui64);
PnpDisableDeviceInterfaces((unsigned __int16 *)BugCheckParameter4 + 20, v12, v13);
if( v11 >= 0 )
IopReleaseDeviceResources((PDEVICE_NODE)BugCheckParameter4, 0);
v14 = (_DEVICE_NODE *)BugCheckParameter4;
if( (*((_DWORD *)BugCheckParameter4 + 99) & 0x10) == 0 )
{
v15 = DeviceNodeDeletePendingCloses;
LABEL_13:
PipSetDevNodeState(v14, v15);
goto LABEL_14;
}
PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeRemovePendingCloses);
v15 = DeviceNodeAwaitingQueuedDeletion;
if( v8 == 782 )
{
v14 = (_DEVICE_NODE *)BugCheckParameter4;
goto LABEL_13;
}
}
LABEL_14:
if( v3 == 778 )
{
v22 = (_ADAPTER_OBJECT *)*((_QWORD *)&v23 + 1);
if( *((_QWORD *)&v23 + 1) )
{
IopDecrementDeviceObjectHandleCount(*((_DEVICE_OBJECT **)&v23 + 1));
HalPutDmaAdapter(v22);
}
}
if( v6 && (*((_DWORD *)BugCheckParameter4 + 99) & 0x6000) == 0 )
PipSetDevNodeProblem((_DEVICE_NODE *)BugCheckParameter4, v6, ProblemStatus);
*((_DWORD *)BugCheckParameter4 + 176) &= ~2u;
if( (*((_DWORD *)BugCheckParameter4 + 99) & 0x10) == 0 )
{
PnpAcquireDependencyRelationsLock(1);
v16 = *((_QWORD *)BugCheckParameter4 + 4);
if( v16 )
v17 = *(PNP_DEPENDENCY_NODE **)(*(_QWORD *)(v16 + 312) + 80i64);
else
v17 = 0i64;
if( v17 )
PipConvertResolutionsToReservations(v17);
ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
PpDevNodeUnlockTree(PPL_SIMPLE_READ);
PipProcessRebuildPowerRelationsQueue();
}
PiDmaGuardProcessPostRemove(BugCheckParameter4, v6, 0i64);
}Referenced by:
PnpDeleteLockedDeviceNode