PiSwProcessRemove
VOID __stdcall PiSwProcessRemove(_DEVICE_OBJECT *DeviceObject, UINT8 KeepDeviceObjectActive){
_PI_SWD_OBJECT **DeviceExtension;
int v5;
_PI_SWD_OBJECT *v6;
_PI_SWD_OBJECT *v7;
__int64 v8;
__int64 v9;
_PI_SWD_OBJECT *v10;
void *v11;
_PI_SWD_OBJECT *v12;
void *v13;
NTSTATUS v14;
_DEVICE_OBJECT *v15;
_ADAPTER_OBJECT *v16;
__int64 v17;
_PI_SWD_OBJECT *SwDeviceObject;
DeviceExtension = (_PI_SWD_OBJECT **)DeviceObject->DeviceExtension;
SwDeviceObject = *DeviceExtension;
v5 = *((_DWORD *)DeviceExtension + 2);
if( (v5 & 0x20) == 0 )
{
if( (v5 & 1) != 0 )
{
*((_DWORD *)DeviceExtension + 2) = v5 & 0xFFFFFFFE;
PiSwDeviceInterfacesUpdateState(SwDeviceObject, 0);
}
if( !KeepDeviceObjectActive )
{
PiSwMakePdoInactive(DeviceObject);
if( ((_DWORD)DeviceExtension[1] & 8) == 0 )
PiSwUnassociateDeviceObject(DeviceObject);
if( (SwDeviceObject[1] & 2) != 0 )
{
PiSwBusRelationRemove(SwDeviceObject);
v6 = SwDeviceObject;
if( *((_QWORD *)SwDeviceObject + 11) )
{
SwDeviceObject[1] &= ~4u;
PiSwPnPInfoFree(SwDeviceObject + 6);
v7 = SwDeviceObject;
v8 = *((_QWORD *)SwDeviceObject + 11);
*(_OWORD *)(SwDeviceObject + 6) = *(_OWORD *)(v8 + 8);
*(_OWORD *)(v7 + 10) = *(_OWORD *)(v8 + 24);
*(_OWORD *)(v7 + 14) = *(_OWORD *)(v8 + 40);
v9 = *((_QWORD *)SwDeviceObject + 11);
*(_OWORD *)(v9 + 8) = 0i64;
*(_OWORD *)(v9 + 24) = 0i64;
*(_OWORD *)(v9 + 40) = 0i64;
v10 = SwDeviceObject;
v11 = (void *)*((_QWORD *)SwDeviceObject + 19);
if( v11 )
{
ExFreePoolWithTag(v11, 0x57706E50u);
v10 = SwDeviceObject;
}
v10[40] = *(_DWORD *)(*((_QWORD *)v10 + 11) + 64i64);
*((_QWORD *)SwDeviceObject + 19) = *(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 56i64);
*(_DWORD *)(*((_QWORD *)SwDeviceObject + 11) + 64i64) = 0;
*(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 56i64) = 0i64;
v12 = SwDeviceObject;
v13 = (void *)*((_QWORD *)SwDeviceObject + 21);
if( v13 )
{
PnpFreeDevPropertyArray(SwDeviceObject[44], v13, 0x57706E50u);
v12 = SwDeviceObject;
}
v12[44] = *(_DWORD *)(*((_QWORD *)v12 + 11) + 80i64);
*((_QWORD *)SwDeviceObject + 21) = *(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 72i64);
*(_DWORD *)(*((_QWORD *)SwDeviceObject + 11) + 80i64) = 0;
*(_QWORD *)(*((_QWORD *)SwDeviceObject + 11) + 72i64) = 0i64;
PiSwFreeInterfaceList((_LIST_ENTRY *)(SwDeviceObject + 46));
v14 = PiSwBusRelationAdd(**((WCHAR ***)SwDeviceObject + 11), SwDeviceObject);
if( v14 < 0 )
{
v17 = *((_QWORD *)SwDeviceObject + 18);
if( v17 && _InterlockedExchange64((volatile __int64 *)(v17 + 104), 0i64) )
{
*(_QWORD *)(*((_QWORD *)SwDeviceObject + 18) + 56i64) = 0i64;
*(_DWORD *)(*((_QWORD *)SwDeviceObject + 18) + 48i64) = v14;
IofCompleteRequest(*((PIRP *)SwDeviceObject + 18), 0);
*((_QWORD *)SwDeviceObject + 18) = 0i64;
}
}
else
{
SwDeviceObject[1] &= ~2u;
v15 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(
*((_QWORD *)SwDeviceObject + 14),
0x746C6644u);
v16 = (_ADAPTER_OBJECT *)v15;
if( v15 )
{
IoInvalidateDeviceRelations(v15, SingleBusRelations);
HalPutDmaAdapter(v16);
}
}
PiSwQueuedCreateInfoFree(*((_PI_SWD_QUEUED_CREATE_INFO **)SwDeviceObject + 11));
*((_QWORD *)SwDeviceObject + 11) = 0i64;
v6 = SwDeviceObject;
}
if( !*((_QWORD *)v6 + 14) )
{
RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &SwDeviceObject);
PiSwDeviceDereference(SwDeviceObject);
}
}
}
}
}Referenced by:
PiSwGetChildPdo
PiSwPdoPnPDispatch
PiSwProcessParentRemoveIrp