IopShutdownBaseFileSystems

VOID __fastcall IopShutdownBaseFileSystems(_LIST_ENTRY *ListHead){
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v3; 
  DEVICE_OBJECT *v4; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *v6; 
  IRP *v7; 
  UINT64 v8; 
  UINT8 v9; 
  UINT8 v10; 
  _LIST_ENTRY *v11; 
  IRP *v12; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  struct _KEVENT Object; 
  memset(&Object, 0, sizeof(Object));
  IoStatusBlock = 0i64;
  KeInitializeEvent(&Object, NotificationEvent, 0);
  Flink = ListHead->Flink;
  if( ListHead->Flink->Blink != ListHead || (v3 = Flink->Flink, Flink->Flink->Blink != Flink) )
LABEL_14:
    __fastfail(3u);
  ListHead->Flink = v3;
  v3->Blink = ListHead;
  while( Flink != ListHead )
  {
    Flink->Flink = 0i64;
    Flink->Blink = 0i64;
    ObfReferenceObject(&Flink[-5]);
    IopIncrementDeviceObjectRefCount((_DEVICE_OBJECT *)&Flink[-5], 1u);
    v5 = Flink - 5;
    v4 = (DEVICE_OBJECT *)v5;
    if( v5[1].Blink )
    {
      IoGetAttachedDevice((_DEVICE_OBJECT *)v5);
      v5 = v6;
    }
    v7 = IoBuildSynchronousFsdRequest(0x10u, (PDEVICE_OBJECT)v5, 0i64, 0, 0i64, &Object, &IoStatusBlock);
    if( v7 && IofCallDriver((PDEVICE_OBJECT)v5, v7) == 259 )
      KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
    Flink = ListHead->Flink;
    if( ListHead->Flink->Blink != ListHead )
      goto LABEL_14;
    v11 = Flink->Flink;
    if( Flink->Flink->Blink != Flink )
      goto LABEL_14;
    ListHead->Flink = v11;
    v11->Blink = ListHead;
    KeResetEvent(&Object, v8, v9, v10, v12);
    IopDecrementDeviceObjectRef(v4, 0, 1u);
    HalPutDmaAdapter((PADAPTER_OBJECT)v4);
  }
}

Referenced by:

IoShutdownSystem