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