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