PoRunDownDeviceObject

VOID __stdcall PoRunDownDeviceObject(_DEVICE_OBJECT *a1){
  _DEVOBJ_EXTENSION *DeviceObjectExtension; 
  _DEVICE_OBJECT_POWER_EXTENSION *Dope; 
  unsigned __int8 v3; 
  _LIST_ENTRY *p_Volume; 
  unsigned __int64 v5; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 

  DeviceObjectExtension = a1->DeviceObjectExtension;
  PoRegisterDeviceForIdleDetection((INT64)a1, 0i64, 0i64, 0i64);
  Dope = DeviceObjectExtension->Dope;
  if( Dope )
  {
    MmLockPagableSectionByHandle(ExPageLockHandle);
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 1368));
    v3 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C23628 + 142);
    p_Volume = &Dope->Volume;
    v5 = v3;
    Flink = Dope->Volume.Flink;
    if( Flink )
    {
      Blink = Dope->Volume.Blink;
      if( Flink->Blink != p_Volume || Blink->Flink != p_Volume )
        __fastfail(3u);
      Blink->Flink = Flink;
      Flink->Blink = Blink;
      p_Volume->Flink = 0i64;
      Dope->Volume.Blink = 0i64;
    }
    DeviceObjectExtension->Dope = 0i64;
    ExFreePoolWithTag(Dope, 0);
    KxReleaseSpinLock((UINT64 *)&stru_140C23628 + 142);
    __writecr8(v5);
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 1368));
    MiLockPagableImageSection(ExPageLockHandle, 0);
  }
}

Referenced by:

IoDeleteDevice