IopGetBootDiskInformation

NTSTATUS __stdcall IopGetBootDiskInformation(_BOOTDISK_INFORMATION *BootDiskInformation, UINT64 Size){
  unsigned int v2; 
  ULONG Signature; 
  bool v6; 
  _LOADER_PARAMETER_BLOCK *v7; 
  _BOOTDISK_INFORMATION *v8; 
  _ARC_DISK_INFORMATION *ArcDiskInformation; 
  char *ArcBootDeviceName; 
  NTSTATUS DeviceObjectPointer; 
  _DEVICE_OBJECT *v12; 
  _IRP *v13; 
  NTSTATUS Status; 
  unsigned int v15; 
  UINT64 i; 
  _IRP *v17; 
  NTSTATUS v18; 
  _DRIVE_LAYOUT_INFORMATION_EX *PoolWithTag; 
  int v20; 
  _ARC_DISK_SIGNATURE *j; 
  UINT8 v22; 
  __int64 v23; 
  __int64 v24; 
  UINT64 OutputBufferLength; 
  UINT64 DiskSignature; 
  __int64 v27; 
  PFILE_OBJECT FileObject; 
  __int128 FileObject_8; 
  __int64 v30; 
  PDEVICE_OBJECT DeviceObject; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  _ARC_DISK_INFORMATION *Flink; 
  _BOOTDISK_INFORMATION *v34; 
  _ARC_DISK_INFORMATION *v35; 
  _UNICODE_STRING ObjectName; 
  _STRING String1; 
  _STRING SourceString; 
  _STRING DestinationString; 
  _STRING String2; 
  __int128 OutputBuffer; 
  __int64 v42; 
  INT8 pszDest[128]; 
  INT8 v44[128]; 
  VOID *ReturnAddress; 

  v34 = BootDiskInformation;
  v42 = 0i64;
  DestinationString = 0i64;
  DeviceObject = 0i64;
  v2 = Size;
  SourceString = 0i64;
  FileObject = 0i64;
  ObjectName = 0i64;
  v30 = 0i64;
  String1 = 0i64;
  IoStatusBlock = 0i64;
  OutputBuffer = 0i64;
  FileObject_8 = 0i64;
  String2 = 0i64;
  Signature = 0;
  LODWORD(DiskSignature) = 0;
  HIDWORD(DiskSignature) = IoGetConfigurationInformation()->DiskCount;
  if( (unsigned int)InitializationPhase >= 2 )
    return -1073741431;
  if( v2 < 0x18 )
    return -1073741811;
  v6 = v2 < 0x40;
  v7 = KeLoaderBlock_0;
  v8 = 0i64;
  if( !v6 )
    v8 = BootDiskInformation;
  ArcDiskInformation = KeLoaderBlock_0->ArcDiskInformation;
  ArcBootDeviceName = KeLoaderBlock_0->ArcBootDeviceName;
  v35 = ArcDiskInformation;
  Flink = (_ARC_DISK_INFORMATION *)ArcDiskInformation->DiskSignatures.Flink->Flink;
  RtlInitAnsiString(&DestinationString, ArcBootDeviceName);
  RtlInitAnsiString(&String2, v7->ArcHalDeviceName);
  LODWORD(v27) = 0;
  if( HIDWORD(DiskSignature) )
  {
    do
    {
      RtlStringCchPrintfA(pszDest, 0x80ui64, (INT8 *)"\\Device\\Harddisk%d\\Partition0");
      RtlInitAnsiString(&SourceString, pszDest);
      if( RtlAnsiStringToUnicodeString(&ObjectName, &SourceString, 1u) < 0 )
        goto LABEL_26;
      DeviceObjectPointer = IoGetDeviceObjectPointer(&ObjectName, 0x80ui64, &FileObject, &DeviceObject);
      RtlFreeAnsiString(&ObjectName);
      if( DeviceObjectPointer < 0 )
        goto LABEL_26;
      v12 = DeviceObject;
      LODWORD(OutputBufferLength) = 24;
      v13 = IopBuildDeviceIoControlRequest(
              0x70000ui64,
              DeviceObject,
              0i64,
              0i64,
              &OutputBuffer,
              OutputBufferLength,
              0,
              (_KEVENT *)&FileObject_8,
              &IoStatusBlock,
              ReturnAddress);
      if( !v13 )
        goto LABEL_11;
      LOWORD(FileObject_8) = 0;
      v30 = (__int64)&FileObject_8 + 8;
      BYTE2(FileObject_8) = 6;
      *((_QWORD *)&FileObject_8 + 1) = (char *)&FileObject_8 + 8;
      DWORD1(FileObject_8) = 0;
      Status = IofCallDriver((UINT64)v12, (UINT64)v13);
      if( Status == 259 )
      {
        KeWaitForSingleObject((UINT64)&FileObject_8, 5, 0, 0, 0i64);
        Status = IoStatusBlock.Status;
      }
      if( Status >= 0 )
      {
        v15 = 4096;
        for( i = 4096i64; ; i = v15 )
        {
          PoolWithTag = (_DRIVE_LAYOUT_INFORMATION_EX *)ExAllocatePoolWithTag(0x200ui64, i, 1866624841i64);
          if( !PoolWithTag )
            break;
          LODWORD(OutputBufferLength) = v15;
          v17 = IopBuildDeviceIoControlRequest(
                  0x70050ui64,
                  v12,
                  0i64,
                  0i64,
                  PoolWithTag,
                  OutputBufferLength,
                  0,
                  (_KEVENT *)&FileObject_8,
                  &IoStatusBlock,
                  ReturnAddress);
          if( !v17 )
            break;
          KeResetEvent((_KEVENT *)&FileObject_8);
          v18 = IofCallDriver((UINT64)v12, (UINT64)v17);
          if( v18 == 259 )
          {
            KeWaitForSingleObject((UINT64)&FileObject_8, 5, 0, 0, 0i64);
            v18 = IoStatusBlock.Status;
          }
          if( v18 != -1073741789 )
            goto LABEL_23;
          ExFreePoolWithTag(PoolWithTag, 0);
          v15 *= 2;
        }
        v18 = -1073741670;
LABEL_23:
        ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
        if( v18 >= 0 )
        {
          v20 = HIDWORD(v42);
          if( HIDWORD(v42) < 0x200 )
            v20 = 512;
          HIDWORD(v42) = v20;
          for( j = (_ARC_DISK_SIGNATURE *)ArcDiskInformation->DiskSignatures.Flink;
                j != (_ARC_DISK_SIGNATURE *)ArcDiskInformation;
                j = *(_ARC_DISK_SIGNATURE **)j )
          {
            if( Flink != ArcDiskInformation || HIDWORD(DiskSignature) != 1 || PoolWithTag->PartitionStyle )
            {
              v22 = IopVerifyDiskSignature(PoolWithTag, j, &DiskSignature);
              Signature = DiskSignature;
              if( !v22 )
                continue;
            }
            v23 = 0i64;
            if( PoolWithTag->PartitionCount )
            {
              v24 = (__int64)v34;
              do
              {
                if( !Signature && !PoolWithTag->PartitionStyle )
                  Signature = PoolWithTag->Mbr.Signature;
                if( *(&PoolWithTag->PartitionEntry[0].PartitionNumber + 36 * v23) )
                {
                  RtlStringCchPrintfA(v44, 0x80ui64, (INT8 *)"%spartition(%d)");
                  RtlInitAnsiString(&String1, v44);
                  if( RtlEqualString(&String1, &DestinationString, 1u) )
                  {
                    *(_DWORD *)(v24 + 16) = Signature;
                    *(_QWORD *)v24 = *(&PoolWithTag->PartitionEntry[0].StartingOffset.QuadPart + 18 * v23);
                    if( v8 )
                    {
                      if( PoolWithTag->PartitionStyle == 1 )
                      {
                        LOBYTE(v8[2].SystemPartitionOffset) = 1;
                        *(_OWORD *)&v8[1].BootPartitionOffset = *(_OWORD *)&PoolWithTag->Mbr.Signature;
                      }
                      else
                      {
                        LOBYTE(v8[2].SystemPartitionOffset) = 0;
                      }
                    }
                  }
                  if( RtlEqualString(&String1, &String2, 1u) )
                  {
                    *(_DWORD *)(v24 + 20) = Signature;
                    *(_QWORD *)(v24 + 8) = *(&PoolWithTag->PartitionEntry[0].StartingOffset.QuadPart + 18 * v23);
                    if( PoolWithTag->PartitionStyle == 1 )
                    {
                      if( v8 )
                      {
                        BYTE1(v8[2].SystemPartitionOffset) = 1;
                        *(_OWORD *)&v8[1].BootDeviceSignature = *(_OWORD *)&PoolWithTag->Mbr.Signature;
                      }
                    }
                    else if( v8 )
                    {
                      BYTE1(v8[2].SystemPartitionOffset) = 0;
                    }
                  }
                }
                v23 = (unsigned int)(v23 + 1);
              }
              while( (unsigned int)v23 < PoolWithTag->PartitionCount );
              ArcDiskInformation = v35;
              LODWORD(DiskSignature) = Signature;
            }
          }
LABEL_25:
          ExFreePoolWithTag(PoolWithTag, 0);
          goto LABEL_26;
        }
        if( PoolWithTag )
          goto LABEL_25;
      }
      else
      {
LABEL_11:
        ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
      }
LABEL_26:
      LODWORD(v27) = v27 + 1;
    }
    while( (unsigned int)v27 < HIDWORD(DiskSignature) );
  }
  return 0;
}

Referenced by:

IoGetBootDiskInformation