PiSwDeviceFree
VOID __stdcall PiSwDeviceFree(_PI_SWD_OBJECT *SwDeviceObject){
void *v2;
_PI_SWD_QUEUED_CREATE_INFO *v3;
void *v4;
void *v5;
INT64 v6;
PI_SWD_PDO_ASSOCIATION **v7;
PI_SWD_PDO_ASSOCIATION *v8;
__int64 v9;
_ETHREAD *CurrentThread;
__int64 v11;
PI_SWD_PDO_ASSOCIATION **v12;
PiSwInstanceInfoFree((__int64)(SwDeviceObject + 2));
PiSwPnPInfoFree(SwDeviceObject + 6);
v2 = (void *)*((_QWORD *)SwDeviceObject + 10);
if( v2 )
{
ExFreePoolWithTag(v2, 0x57706E50u);
*(_OWORD *)(SwDeviceObject + 18) = 0i64;
}
v3 = (_PI_SWD_QUEUED_CREATE_INFO *)*((_QWORD *)SwDeviceObject + 11);
if( v3 )
{
PiSwQueuedCreateInfoFree(v3);
*((_QWORD *)SwDeviceObject + 11) = 0i64;
}
v4 = (void *)*((_QWORD *)SwDeviceObject + 19);
if( v4 )
{
ExFreePoolWithTag(v4, 0x57706E50u);
*((_QWORD *)SwDeviceObject + 19) = 0i64;
}
v5 = (void *)*((_QWORD *)SwDeviceObject + 21);
if( v5 )
{
PnpFreeDevPropertyArray(SwDeviceObject[44], v5, 0x57706E50u);
*((_QWORD *)SwDeviceObject + 21) = 0i64;
SwDeviceObject[44] = 0;
}
PiSwFreeInterfaceList((_LIST_ENTRY *)(SwDeviceObject + 46));
v7 = (PI_SWD_PDO_ASSOCIATION **)(SwDeviceObject + 32);
while( 1 )
{
v8 = *v7;
if( *v7 == (PI_SWD_PDO_ASSOCIATION *)v7 )
break;
if( *((PI_SWD_PDO_ASSOCIATION ***)v8 + 1) != v7 )
goto LABEL_16;
v9 = *(_QWORD *)v8;
if( *(PI_SWD_PDO_ASSOCIATION **)(*(_QWORD *)v8 + 8i64) != v8
|| (*v7 = (PI_SWD_PDO_ASSOCIATION *)v9,
*(_QWORD *)(v9 + 8) = v7,
CurrentThread = (_ETHREAD *)KeGetCurrentThread(),
--CurrentThread->Tcb.KernelApcDisable,
ExAcquireResourceExclusiveLite((UINT64)&PiSwLockObj, 1, v6),
v11 = *((_QWORD *)v8 + 2),
*(PI_SWD_PDO_ASSOCIATION **)(v11 + 8) != v8 + 4)
|| (v12 = (PI_SWD_PDO_ASSOCIATION **)*((_QWORD *)v8 + 3), *v12 != v8 + 4) )
{
LABEL_16:
__fastfail(3u);
}
*v12 = (PI_SWD_PDO_ASSOCIATION *)v11;
*(_QWORD *)(v11 + 8) = v12;
ExReleaseResourceLite(&PiSwLockObj);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
PiSwPdoAssociationFree(v8);
}
}Referenced by:
PiSwDeviceDereference