PopFxDestroyDeviceDpm

void __fastcall PopFxDestroyDeviceDpm(__int64 a1, __int64 a2){
  void *v4; 
  void *v5; 
  IRP *v6; 
  void *v7; 
  void *v8; 
  __int64 v9; 
  __int64 v10; 
  void *v11; 
  v4 = *(void **)(a2 + 104);
  if( v4 )
    ObfDereferenceObjectWithTag(v4, 0x78466F50ui64);
  v5 = *(void **)(a2 + 96);
  if( v5 )
    ObfDereferenceObjectWithTag(v5, 0x78466F50ui64);
  if( a1 )
    ObfDereferenceObjectWithTag(*(PVOID *)(a1 + 32), 0x78466F50ui64);
  v6 = *(IRP **)(a2 + 16);
  if( v6 )
    IoFreeIrp(v6);
  v7 = *(void **)(a2 + 1200);
  if( v7 )
    ExFreePoolWithTag(v7, 0x4D584650u);
  v8 = *(void **)(a2 + 832);
  if( v8 )
  {
    v9 = 0i64;
    if( *(_DWORD *)(a2 + 828) )
    {
      do
      {
        v10 = *(_QWORD *)(*(_QWORD *)(a2 + 832) + 8 * v9);
        v11 = *(void **)(v10 + 424);
        if( v11 )
        {
          ExFreePoolWithTag(v11, 0x4D584650u);
          *(_QWORD *)(v10 + 424) = 0i64;
        }
        v9 = (unsigned int)(v9 + 1);
      }
      while( (unsigned int)v9 < *(_DWORD *)(a2 + 828) );
      v8 = *(void **)(a2 + 832);
    }
    ExFreePoolWithTag(v8, 0x4D584650u);
    *(_QWORD *)(a2 + 832) = 0i64;
  }
  *(_QWORD *)(a2 + 56) = 0i64;
  *(_QWORD *)(a2 + 64) = 0i64;
  *(_QWORD *)(a2 + 72) = 0i64;
  if( a1 )
    _InterlockedAnd((volatile signed __int32 *)(a1 + 296), 0xFFFFFFBF);
  PopFxDestroyDeviceCommon((PVOID)a2, 1);
}

Referenced by:

PoFxUnregisterDevice
PopFxUnregisterDevice