IoVerifyVolume

NTSTATUS __stdcall IoVerifyVolume(_DEVICE_OBJECT *DeviceObject, UINT8 AllowRawMount){
  _ETHREAD *CurrentThread; 
  struct _KEVENT *v5; 
  NTSTATUS v6; 
  PDEVICE_OBJECT v7; 
  __int64 i; 
  IRP *Irp; 
  IRP *v10; 
  __int64 v11; 
  _VPB *v12; 
  __int128 v14; 
  struct _KEVENT Event; 
  VOID *retaddr; 
  _VPB *Vpb; 
  PDEVICE_OBJECT DeviceObjecta; 
  VPB *v19; 
  DeviceObjecta = 0i64;
  Vpb = 0i64;
  memset(&Event, 0, sizeof(Event));
  v14 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v5 = (struct _KEVENT *)((char *)DeviceObject + 280);
  KeWaitForSingleObject((char *)DeviceObject + 280, Executive, 0, 0, 0i64);
  if( !IopReferenceVerifyVpb(DeviceObject, &Vpb, &DeviceObjecta) )
  {
    v6 = 0;
LABEL_11:
    if( (int)IopCreateVpb(DeviceObject) < 0
      || (PoVolumeDevice(DeviceObject), v19 = 0i64, IopMountVolume(DeviceObject, AllowRawMount, 1u, 0, &v19) < 0) )
    {
      *((_DWORD *)DeviceObject + 12) &= ~2u;
    }
    else if( v19 )
    {
      IopDecrementVpbRefCount(v19, 1u);
    }
    goto LABEL_16;
  }
  KeInitializeEvent(&Event, NotificationEvent, 0);
  v7 = DeviceObjecta;
  for( i = *((_QWORD *)DeviceObjecta + 3); i; i = *(_QWORD *)(i + 24) )
    v7 = (PDEVICE_OBJECT)i;
  Irp = IopAllocateIrpExReturn(v7, *((_BYTE *)v7 + 76), 0, retaddr);
  v10 = Irp;
  if( !Irp )
  {
    IopDereferenceVpbAndFree(Vpb);
    v6 = -1073741670;
    goto LABEL_16;
  }
  *((_DWORD *)Irp + 4) = 66;
  *((_BYTE *)Irp + 64) = 0;
  *((_QWORD *)Irp + 10) = &Event;
  *((_QWORD *)Irp + 9) = &v14;
  v11 = *((_QWORD *)Irp + 23);
  v12 = Vpb;
  *((_QWORD *)Irp + 19) = KeGetCurrentThread();
  *(_BYTE *)(v11 - 70) = AllowRawMount != 0;
  *(_QWORD *)(v11 - 56) = DeviceObjecta;
  *(_WORD *)(v11 - 72) = 525;
  *(_QWORD *)(v11 - 64) = v12;
  IopQueueThreadIrp(Irp);
  v6 = IofCallDriver(v7, v10);
  if( v6 == 259 )
  {
    KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
    v6 = v14;
  }
  IopDereferenceVpbAndFree(v12);
  if( v6 == -1073741806 )
    goto LABEL_11;
LABEL_16:
  KeSetEvent(v5, 0);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v6;
}

Referenced by:

No references.