PiSwDeviceFree
VOID __fastcall PiSwDeviceFree(INT64 a1){
void *v2;
void *v3;
void *v4;
DEVPROPERTY *v5;
PADAPTER_OBJECT **v6;
PADAPTER_OBJECT *v7;
PADAPTER_OBJECT v8;
_ETHREAD *CurrentThread;
PADAPTER_OBJECT v10;
PADAPTER_OBJECT **v11;
PiSwInstanceInfoFree(a1 + 8);
PiSwPnPInfoFree(a1 + 24);
v2 = *(void **)(a1 + 80);
if( v2 )
{
ExFreePoolWithTag(v2, 0x57706E50u);
*(_OWORD *)(a1 + 72) = 0i64;
}
v3 = *(void **)(a1 + 88);
if( v3 )
{
PiSwQueuedCreateInfoFree(v3);
*(_QWORD *)(a1 + 88) = 0i64;
}
v4 = *(void **)(a1 + 152);
if( v4 )
{
ExFreePoolWithTag(v4, 0x57706E50u);
*(_QWORD *)(a1 + 152) = 0i64;
}
v5 = *(DEVPROPERTY **)(a1 + 168);
if( v5 )
{
PnpFreeDevPropertyArray(*(unsigned int *)(a1 + 176), v5, 0x57706E50ui64);
*(_QWORD *)(a1 + 168) = 0i64;
*(_DWORD *)(a1 + 176) = 0;
}
PiSwFreeInterfaceList((_LIST_ENTRY *)(a1 + 184));
v6 = (PADAPTER_OBJECT **)(a1 + 128);
while( 1 )
{
v7 = *v6;
if( *v6 == (PADAPTER_OBJECT *)v6 )
break;
if( v7[1] != (PADAPTER_OBJECT)v6 )
goto LABEL_16;
v8 = *v7;
if( (PADAPTER_OBJECT *)(*v7)->DmaOperations != v7
|| (*v6 = (PADAPTER_OBJECT *)v8,
v8->DmaOperations = (_DMA_OPERATIONS *)v6,
CurrentThread = (_ETHREAD *)KeGetCurrentThread(),
--*((_WORD *)CurrentThread + 242),
ExAcquireResourceExclusiveLite((ERESOURCE *)PiSwLockObj, 1u),
v10 = v7[2],
(PADAPTER_OBJECT *)v10->DmaOperations != v7 + 2)
|| (v11 = (PADAPTER_OBJECT **)v7[3], *v11 != v7 + 2) )
{
LABEL_16:
__fastfail(3u);
}
*v11 = (PADAPTER_OBJECT *)v10;
v10->DmaOperations = (_DMA_OPERATIONS *)v11;
ExReleaseResourceLite((PERESOURCE)PiSwLockObj);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
PiSwPdoAssociationFree(v7);
}
}Referenced by:
PiSwDeviceDereference