PiSwProcessRemove
VOID __stdcall PiSwProcessRemove(DEVICE_OBJECT *DeviceObject, UINT8 KeepDeviceObjectActive){
__int64 v2;
int v5;
CHAR *v6;
CHAR *v7;
__int64 v8;
__int64 v9;
CHAR *v10;
void *v11;
CHAR *v12;
DEVPROPERTY *v13;
int v14;
DEVICE_OBJECT *v15;
struct _DMA_ADAPTER *v16;
__int64 v17;
CHAR *Buffer;
v2 = *((_QWORD *)DeviceObject + 8);
Buffer = *(CHAR **)v2;
v5 = *(_DWORD *)(v2 + 8);
if( (v5 & 0x20) == 0 )
{
if( (v5 & 1) != 0 )
{
*(_DWORD *)(v2 + 8) = v5 & 0xFFFFFFFE;
PiSwDeviceInterfacesUpdateState((INT64)Buffer, 0);
}
if( !KeepDeviceObjectActive )
{
PiSwMakePdoInactive(DeviceObject);
if( (*(_DWORD *)(v2 + 8) & 8) == 0 )
PiSwUnassociateDeviceObject(DeviceObject);
if( (*((_DWORD *)Buffer + 1) & 2) != 0 )
{
PiSwBusRelationRemove(Buffer);
v6 = Buffer;
if( *((_QWORD *)Buffer + 11) )
{
*((_DWORD *)Buffer + 1) &= ~4u;
PiSwPnPInfoFree((__int64)(Buffer + 24));
v7 = Buffer;
v8 = *((_QWORD *)Buffer + 11);
*(_OWORD *)(Buffer + 24) = *(_OWORD *)(v8 + 8);
*(_OWORD *)(v7 + 40) = *(_OWORD *)(v8 + 24);
*(_OWORD *)(v7 + 56) = *(_OWORD *)(v8 + 40);
v9 = *((_QWORD *)Buffer + 11);
*(_OWORD *)(v9 + 8) = 0i64;
*(_OWORD *)(v9 + 24) = 0i64;
*(_OWORD *)(v9 + 40) = 0i64;
v10 = Buffer;
v11 = (void *)*((_QWORD *)Buffer + 19);
if( v11 )
{
ExFreePoolWithTag(v11, 0x57706E50u);
v10 = Buffer;
}
*((_DWORD *)v10 + 40) = *(_DWORD *)(*((_QWORD *)v10 + 11) + 64i64);
*((_QWORD *)Buffer + 19) = *(_QWORD *)(*((_QWORD *)Buffer + 11) + 56i64);
*(_DWORD *)(*((_QWORD *)Buffer + 11) + 64i64) = 0;
*(_QWORD *)(*((_QWORD *)Buffer + 11) + 56i64) = 0i64;
v12 = Buffer;
v13 = (DEVPROPERTY *)*((_QWORD *)Buffer + 21);
if( v13 )
{
PnpFreeDevPropertyArray(*((unsigned int *)Buffer + 44), v13, 0x57706E50ui64);
v12 = Buffer;
}
*((_DWORD *)v12 + 44) = *(_DWORD *)(*((_QWORD *)v12 + 11) + 80i64);
*((_QWORD *)Buffer + 21) = *(_QWORD *)(*((_QWORD *)Buffer + 11) + 72i64);
*(_DWORD *)(*((_QWORD *)Buffer + 11) + 80i64) = 0;
*(_QWORD *)(*((_QWORD *)Buffer + 11) + 72i64) = 0i64;
PiSwFreeInterfaceList((_LIST_ENTRY *)(Buffer + 184));
v14 = PiSwBusRelationAdd(**((const WCHAR ***)Buffer + 11), (INT64)Buffer);
if( v14 < 0 )
{
v17 = *((_QWORD *)Buffer + 18);
if( v17 && _InterlockedExchange64((volatile __int64 *)(v17 + 104), 0i64) )
{
*(_QWORD *)(*((_QWORD *)Buffer + 18) + 56i64) = 0i64;
*(_DWORD *)(*((_QWORD *)Buffer + 18) + 48i64) = v14;
IofCompleteRequest(*((_IRP **)Buffer + 18), 0);
*((_QWORD *)Buffer + 18) = 0i64;
}
}
else
{
*((_DWORD *)Buffer + 1) &= ~2u;
v15 = (DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)Buffer + 14), 0x746C6644ui64);
v16 = (struct _DMA_ADAPTER *)v15;
if( v15 )
{
IoInvalidateDeviceRelations(v15, SingleBusRelations);
HalPutDmaAdapter(v16);
}
}
PiSwQueuedCreateInfoFree(*((PVOID *)Buffer + 11));
*((_QWORD *)Buffer + 11) = 0i64;
v6 = Buffer;
}
if( !*((_QWORD *)v6 + 14) )
{
RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &Buffer);
PiSwDeviceDereference(Buffer);
}
}
}
}
}Referenced by:
PiSwGetChildPdo
PiSwPdoPnPDispatch
PiSwProcessParentRemoveIrp