IoVolumeDeviceToDosName

NTSTATUS __stdcall IoVolumeDeviceToDosName(PVOID VolumeDeviceObject, UNICODE_STRING *DosName){
  unsigned __int64 v2; 
  __int64 v5; 
  IRP *v6; 
  NTSTATUS result; 
  WCHAR v8; 
  IRP *v9; 
  int Status; 
  ULONG OutputBufferLength; 
  UINT8 *PoolWithTag; 
  IRP *v13; 
  unsigned __int16 v14; 
  PDEVICE_OBJECT DeviceObject; 
  struct _KEVENT Event; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  PFILE_OBJECT FileObject; 
  struct _UNICODE_STRING DestinationString; 
  int OutputBuffer; 
  char InputBuffer[512]; 
  v2 = *((unsigned int *)VolumeDeviceObject + 18);
  FileObject = 0i64;
  DeviceObject = 0i64;
  memset(&Event, 0, sizeof(Event));
  IoStatusBlock = 0i64;
  DestinationString = 0i64;
  if( (unsigned int)v2 > 0x24 )
    return -1073741811;
  v5 = 0x1080000084i64;
  if( !_bittest64(&v5, v2) )
    return -1073741811;
  KeInitializeEvent(&Event, NotificationEvent, 0);
  v6 = IoBuildDeviceIoControlRequest(
         0x4D0008u,
         (PDEVICE_OBJECT)VolumeDeviceObject,
         0i64,
         0,
         InputBuffer,
         0x200u,
         0,
         &Event,
         &IoStatusBlock);
  if( !v6 )
    return -1073741670;
  result = IofCallDriver((PDEVICE_OBJECT)VolumeDeviceObject, v6);
  if( result == 259 )
  {
    KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
    result = IoStatusBlock.Status;
  }
  if( result >= 0 )
  {
    RtlInitUnicodeString(&DestinationString, L"\\Device\\MountPointManager", v8);
    result = IoGetDeviceObjectPointer(&DestinationString, 0x80ui64, &FileObject, &DeviceObject);
    if( result >= 0 )
    {
      KeInitializeEvent(&Event, NotificationEvent, 0);
      v9 = IoBuildDeviceIoControlRequest(
             0x6D0030u,
             DeviceObject,
             InputBuffer,
             0x200u,
             &OutputBuffer,
             8u,
             0,
             &Event,
             &IoStatusBlock);
      if( v9 )
      {
        Status = IofCallDriver(DeviceObject, v9);
        if( Status == 259 )
        {
          KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
          Status = IoStatusBlock.Status;
        }
        if( (int)(Status + 0x80000000) >= 0 && Status != -2147483643 )
          goto LABEL_19;
        OutputBufferLength = OutputBuffer + 8;
        if( (unsigned int)(OutputBuffer + 8) > 0xFFFF )
        {
          Status = -1073741306;
LABEL_19:
          HalPutDmaAdapter((PADAPTER_OBJECT)FileObject);
          return Status;
        }
        PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, OutputBufferLength, 0x20643244ui64);
        if( PoolWithTag )
        {
          KeInitializeEvent(&Event, NotificationEvent, 0);
          v13 = IoBuildDeviceIoControlRequest(
                  0x6D0030u,
                  DeviceObject,
                  InputBuffer,
                  0x200u,
                  PoolWithTag,
                  OutputBufferLength,
                  0,
                  &Event,
                  &IoStatusBlock);
          if( v13 )
          {
            Status = IofCallDriver(DeviceObject, v13);
            if( Status == 259 )
            {
              KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
              Status = IoStatusBlock.Status;
            }
            if( Status < 0 )
            {
              ExFreePoolWithTag(PoolWithTag, 0);
            }
            else
            {
              v14 = *(_WORD *)PoolWithTag - 4;
              DosName->Buffer = (wchar_t *)PoolWithTag;
              DosName->Length = v14;
              DosName->MaximumLength = v14 + 2;
              memmove(PoolWithTag, PoolWithTag + 4, v14);
              Status = 0;
              DosName->Buffer[(unsigned __int64)DosName->Length >> 1] = 0;
            }
            goto LABEL_19;
          }
          ExFreePoolWithTag(PoolWithTag, 0);
        }
      }
      Status = -1073741670;
      goto LABEL_19;
    }
  }
  return result;
}

Referenced by:

IopMountVolume
IopQueryNameInternal
IopValidateJunctionTarget