PnpSurpriseRemoveLockedDeviceNode
void __fastcall PnpSurpriseRemoveLockedDeviceNode(ULONG_PTR BugCheckParameter4, UINT64 a2, _PNP_DEVNODE_STATE *a3){
int v3;
DEVICE_OBJECT *v4;
int v5;
int v6;
int v8;
__int64 v9;
int v10;
NTSTATUS v11;
_PNP_DEVNODE_STATE *v12;
_DEVICE_NODE *v13;
_PNP_DEVNODE_STATE v14;
INT64 v15;
INT64 v16;
INT64 v17;
__int64 v18;
INT64 v19;
int v20;
__int64 v21;
_PNP_DEVNODE_STATE *v22;
struct _DMA_ADAPTER *v23;
__int128 v24;
INT64 v25;
INT64 v26;
INT64 v27;
INT64 v28;
v3 = *(_DWORD *)(BugCheckParameter4 + 300);
v4 = *(DEVICE_OBJECT **)(BugCheckParameter4 + 32);
v5 = (int)a3;
v6 = a2;
v8 = 768;
v24 = 0i64;
if( v3 == 782 || v3 == 783 )
{
v8 = v3;
PipRestoreDevNodeState(BugCheckParameter4, a2);
v3 = *(_DWORD *)(BugCheckParameter4 + 300);
}
*(_WORD *)(BugCheckParameter4 + 466) = 0;
if( v3 == 785 && v8 == 782 )
{
PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x10ui64);
PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeDeletePendingCloses, v22);
return;
}
v9 = *(_QWORD *)(BugCheckParameter4 + 8);
if( v9 )
{
do
{
v20 = *(_DWORD *)(v9 + 396);
v21 = *(_QWORD *)v9;
if( (v20 & 0x10) != 0 )
{
v20 &= ~0x10u;
*(_DWORD *)(v9 + 396) = v20;
}
if( *(_QWORD *)(v9 + 416) || *(_QWORD *)(v9 + 544) || (v20 & 0x40) != 0 )
IopReleaseDeviceResources(v9, 0);
PipSetDevNodeState((_DEVICE_NODE *)v9, DeviceNodeDeletePendingCloses, a3);
v9 = v21;
}
while( v21 );
}
if( v3 == 778 && (*(_DWORD *)(BugCheckParameter4 + 396) & 0x1000000) != 0 )
{
PnpMarkDeviceForRemove((ULONG_PTR)v4, 1, (ULONG_PTR *)&v24);
PnpUnlockMountableDevice(v4);
PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x1000000ui64);
}
v10 = *(_DWORD *)(BugCheckParameter4 + 300);
if( v10 < 769 || v10 > 770 && (v10 <= 776 || v10 == 778 || (unsigned int)(v10 - 785) > 3) )
{
v11 = IopRemoveDevice(v4, 0x17ui64);
PnpDisableDeviceInterfaces((UNICODE_STRING *)(BugCheckParameter4 + 40));
if( v11 >= 0 )
IopReleaseDeviceResources(BugCheckParameter4, 0);
v13 = (_DEVICE_NODE *)BugCheckParameter4;
if( (*(_DWORD *)(BugCheckParameter4 + 396) & 0x10) == 0 )
{
v14 = DeviceNodeDeletePendingCloses;
LABEL_13:
PipSetDevNodeState(v13, v14, v12);
goto LABEL_14;
}
PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeRemovePendingCloses, v12);
v14 = DeviceNodeAwaitingQueuedDeletion;
if( v8 == 782 )
{
v13 = (_DEVICE_NODE *)BugCheckParameter4;
goto LABEL_13;
}
}
LABEL_14:
if( v3 == 778 )
{
v23 = (struct _DMA_ADAPTER *)*((_QWORD *)&v24 + 1);
if( *((_QWORD *)&v24 + 1) )
{
IopDecrementDeviceObjectHandleCount(*((_DEVICE_OBJECT **)&v24 + 1));
HalPutDmaAdapter(v23);
}
}
if( v6 && (*(_DWORD *)(BugCheckParameter4 + 396) & 0x6000) == 0 )
PipSetDevNodeProblem(BugCheckParameter4, v6, v5);
*(_DWORD *)(BugCheckParameter4 + 704) &= ~2u;
if( (*(_DWORD *)(BugCheckParameter4 + 396) & 0x10) == 0 )
{
PnpAcquireDependencyRelationsLock(1u);
v18 = *(_QWORD *)(BugCheckParameter4 + 32);
if( v18 )
v19 = *(_QWORD *)(*(_QWORD *)(v18 + 312) + 80i64);
else
v19 = 0i64;
if( v19 )
PipConvertResolutionsToReservations(v19, v15, v16, v17, v24, *((INT64 *)&v24 + 1), v25, v26, v27, v28);
ExReleaseResourceLite(&PiDependencyRelationsLock);
PpDevNodeUnlockTree(0);
PipProcessRebuildPowerRelationsQueue();
}
PiDmaGuardProcessPostRemove(BugCheckParameter4);
}Referenced by:
PnpDeleteLockedDeviceNode