PopFxDestroyDripsBlockingDeviceList

VOID __fastcall PopFxDestroyDripsBlockingDeviceList(_QWORD *a1){
  __int64 *v2; 
  __int64 v3; 
  void *v4; 
  while( 1 )
  {
    v2 = (__int64 *)*a1;
    if( (_QWORD *)*a1 == a1 )
      break;
    if( (_QWORD *)v2[1] != a1 || (v3 = *v2, *(__int64 **)(*v2 + 8) != v2) )
      __fastfail(3u);
    *a1 = v3;
    *(_QWORD *)(v3 + 8) = a1;
    v4 = (void *)v2[3];
    if( v4 )
    {
      ExFreePoolWithTag(v4, 0x4D584650u);
      v2[3] = 0i64;
      *((_DWORD *)v2 + 8) = 0;
    }
    PopFxReleaseDevice((UINT64)(v2 - 109));
  }
  ExReleasePushLockEx((UINT64)&PopFxBlockingDeviceListLock, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  IoLockUnlockPnpDeviceTree(0);
}

Referenced by:

PopDripsWatchdogCallbackHandler
PopDripsWatchdogTakeAction
PopFxBuildDripsBlockingDeviceList