IopInvalidateVolumesForDevice

INT64 __stdcall IopInvalidateVolumesForDevice(PDEVICE_OBJECT DeviceObject){
  PDEVICE_OBJECT v1; 
  INT64 result; 
  PDEVICE_OBJECT i; 
  _ETHREAD *CurrentThread; 
  BOOL v5; 
  _ETHREAD *v6; 
  int v7; 
  _LIST_ENTRY *v8; 
  UINT64 v9; 
  UINT8 v10; 
  UINT8 v11; 
  int v12; 
  _LIST_ENTRY *j; 
  _LIST_ENTRY *k; 
  PIRP v15; 
  int Status; 
  IRP *ObjectType; 
  NTSTATUS v18; 
  PADAPTER_OBJECT DmaAdapter; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  struct _KEVENT Event; 
  void *InputBuffer; 
  PDEVICE_OBJECT v24; 
  v1 = DeviceObject;
  result = 0i64;
  memset(&Event, 0, sizeof(Event));
  InputBuffer = 0i64;
  IoStatusBlock = 0i64;
  for( i = DeviceObject; ; i = (PDEVICE_OBJECT)*((_QWORD *)i + 3) )
  {
    v24 = i;
    if( !i )
      break;
    if( *((_QWORD *)i + 7) )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      KeWaitForSingleObject((char *)i + 280, Executive, 0, 0, 0i64);
      InputBuffer = 0i64;
      DmaAdapter = (PADAPTER_OBJECT)IoCreateStreamFileObjectLite(0i64, i);
      *(_QWORD *)&DmaAdapter[1].Version = *((_QWORD *)i + 7);
      v18 = ObOpenObjectByPointer(DmaAdapter, 0x200u, 0i64, 0, (POBJECT_TYPE)IoFileObjectType, 0, &InputBuffer);
      if( v18 >= 0 )
      {
        v6 = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)v6 + 242);
        LOBYTE(v5) = 1;
        ExAcquireResourceSharedLite(&IopDatabaseResource, v5);
        v7 = *((_DWORD *)v1 + 18);
        if( v7 == 7 || v7 == 36 )
        {
          v8 = &IopDiskFileSystemQueueHead;
        }
        else
        {
          v8 = (_LIST_ENTRY *)IopCdRomFileSystemQueueHead;
          if( v7 != 2 )
            v8 = &IopTapeFileSystemQueueHead;
        }
        KeInitializeEvent(&Event, NotificationEvent, 0);
        v12 = 0;
        for( j = v8->Flink; j != v8 && j->Flink != v8; j = j->Flink )
        {
          for( k = j - 5; k[1].Blink; k = k[1].Blink )
            ;
          KeResetEvent(&Event, v9, v10, v11, ObjectType);
          v15 = IoBuildDeviceIoControlRequest(
                  0x90054u,
                  (PDEVICE_OBJECT)k,
                  &InputBuffer,
                  8u,
                  0i64,
                  0,
                  0,
                  &Event,
                  &IoStatusBlock);
          if( !v15 )
          {
            v12 = -1073741670;
            break;
          }
          *(_WORD *)(*((_QWORD *)v15 + 23) - 72i64) = 13;
          Status = IofCallDriver((PDEVICE_OBJECT)k, v15);
          if( Status == 259 )
          {
            KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
            Status = IoStatusBlock.Status;
          }
          else
          {
            IoStatusBlock.Status = Status;
            IoStatusBlock.Information = 0i64;
          }
          if( Status == -1073741808 || Status == -1073741822 )
            Status = 0;
          if( v12 >= 0 && Status < 0 )
            v12 = Status;
        }
        ExReleaseResourceLite(&IopDatabaseResource);
        KeLeaveCriticalRegionThread((__int64)v6);
        if( DmaAdapter )
        {
          HalPutDmaAdapter(DmaAdapter);
          if( InputBuffer )
            ZwClose(InputBuffer);
        }
        v18 = v12;
      }
      KeSetEvent((PRKEVENT)((char *)i + 280), 0);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      result = (unsigned int)v18;
      v1 = DeviceObject;
    }
  }
  return result;
}

Referenced by:

IopRemoveDevice
PiIrpQueryRemoveDevice