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