PnpDeleteLockedDeviceNode
__int64 __fastcall PnpDeleteLockedDeviceNode(
PVOID BugCheckParameter4,
int a2,
unsigned int a3,
NTSTATUS a4,
__int64 a5,
__int64 a6){
unsigned int v6;
int v10;
int v11;
v6 = 0;
if( a2 )
{
v10 = a2 - 1;
if( v10 )
{
v11 = v10 - 1;
if( v11 )
{
if( v11 == 1 )
{
PoFxActivateDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
*((_DWORD *)BugCheckParameter4 + 176) |= 8u;
PnpSurpriseRemoveLockedDeviceNode(BugCheckParameter4, a3, a4);
}
}
else
{
PoFxActivateDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
*((_DWORD *)BugCheckParameter4 + 176) |= 0x10u;
PnpRemoveLockedDeviceNode(BugCheckParameter4, a3, a4);
}
}
else
{
if( (*((_DWORD *)BugCheckParameter4 + 176) & 4) == 0 )
KeBugCheckEx(0xCAu, (PVOID)0xD, BugCheckParameter4, (PVOID)4, 0i64);
PoFxIdleDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
*((_DWORD *)BugCheckParameter4 + 176) &= ~4u;
if( *((_DWORD *)BugCheckParameter4 + 75) == 784 )
{
IopRemoveDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4), 3ui64);
PipRestoreDevNodeState((_DEVICE_NODE *)BugCheckParameter4);
PnpStartedDeviceNodeDependencyCheck((_DEVICE_NODE *)BugCheckParameter4);
}
}
}
else
{
PoFxActivateDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
*((_DWORD *)BugCheckParameter4 + 176) |= 4u;
return(unsigned int)PnpQueryRemoveLockedDeviceNode(
(_DEVICE_NODE *)BugCheckParameter4,
a3,
(_DWORD *)a5,
(_UNICODE_STRING *)a6);
}
return v6;
}Referenced by:
PnpCancelRemoveOnHungDevices
PnpDeleteLockedDeviceNodes