IopGetBootDiskInformation

NTSTATUS __stdcall IopGetBootDiskInformation(_BOOTDISK_INFORMATION *BootDiskInformation, UINT64 Size){
  unsigned int v2; 
  int v4; 
  INT8 v5; 
  bool v7; 
  _LOADER_PARAMETER_BLOCK *v8; 
  _BOOTDISK_INFORMATION *v9; 
  __int64 **v10; 
  const char *v11; 
  INT8 v12; 
  INT8 v13; 
  NTSTATUS DeviceObjectPointer; 
  _DEVICE_OBJECT *v15; 
  _IRP *v16; 
  NTSTATUS Status; 
  unsigned int v18; 
  UINT64 i; 
  UINT64 v20; 
  _IRP *v21; 
  UINT8 v22; 
  UINT8 v23; 
  NTSTATUS v24; 
  _DWORD *PoolWithTag; 
  int v26; 
  __int64 *j; 
  char v28; 
  __int64 v29; 
  __int64 v30; 
  INT8 v31; 
  IRP *Timeout; 
  UINT64 OutputBufferLength; 
  int v34; 
  ULONG DiskCount; 
  __int64 v36; 
  PFILE_OBJECT FileObject; 
  _KEVENT FileObject_8; 
  PDEVICE_OBJECT DeviceObject; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  __int64 **v41; 
  _BOOTDISK_INFORMATION *v42; 
  __int64 **v43; 
  struct _UNICODE_STRING ObjectName; 
  STRING String1; 
  struct _STRING SourceString; 
  struct _STRING DestinationString; 
  STRING String2; 
  __int128 OutputBuffer; 
  __int64 v50; 
  char pszDest[128]; 
  INT8 v52[128]; 
  PVOID ReturnAddress; 
  v42 = BootDiskInformation;
  v50 = 0i64;
  DestinationString = 0i64;
  DeviceObject = 0i64;
  v2 = Size;
  SourceString = 0i64;
  FileObject = 0i64;
  ObjectName = 0i64;
  String1 = 0i64;
  IoStatusBlock = 0i64;
  OutputBuffer = 0i64;
  memset(&FileObject_8, 0, sizeof(FileObject_8));
  String2 = 0i64;
  v4 = 0;
  v34 = 0;
  DiskCount = IoGetConfigurationInformation()->DiskCount;
  if( *(_DWORD *)InitializationPhase >= 2u )
    return -1073741431;
  if( v2 < 0x18 )
    return -1073741811;
  v7 = v2 < 0x40;
  v8 = KeLoaderBlock_0;
  v9 = 0i64;
  if( !v7 )
    v9 = BootDiskInformation;
  v10 = (__int64 **)*((_QWORD *)KeLoaderBlock_0 + 29);
  v11 = (const char *)*((_QWORD *)KeLoaderBlock_0 + 23);
  v43 = v10;
  v41 = (__int64 **)**v10;
  RtlInitAnsiString(&DestinationString, v11, v5);
  RtlInitAnsiString(&String2, *((PCSZ *)v8 + 24), v12);
  LODWORD(v36) = 0;
  if( DiskCount )
  {
    do
    {
      RtlStringCchPrintfA(pszDest, 0x80ui64, (INT8 *)"\\Device\\Harddisk%d\\Partition0");
      RtlInitAnsiString(&SourceString, pszDest, v13);
      if( RtlAnsiStringToUnicodeString(&ObjectName, &SourceString, 1u) < 0 )
        goto LABEL_26;
      DeviceObjectPointer = IoGetDeviceObjectPointer(&ObjectName, 0x80ui64, &FileObject, &DeviceObject);
      RtlFreeAnsiString(&ObjectName);
      if( DeviceObjectPointer < 0 )
        goto LABEL_26;
      v15 = DeviceObject;
      LODWORD(OutputBufferLength) = 24;
      v16 = IopBuildDeviceIoControlRequest(
              0x70000ui64,
              DeviceObject,
              0i64,
              0i64,
              &OutputBuffer,
              OutputBufferLength,
              0,
              &FileObject_8,
              &IoStatusBlock,
              ReturnAddress);
      if( !v16 )
        goto LABEL_11;
      LOWORD(FileObject_8.Header.Lock) = 0;
      FileObject_8.Header.WaitListHead.Blink = &FileObject_8.Header.WaitListHead;
      FileObject_8.Header.Size = 6;
      FileObject_8.Header.WaitListHead.Flink = &FileObject_8.Header.WaitListHead;
      FileObject_8.Header.SignalState = 0;
      Status = IofCallDriver(v15, v16);
      if( Status == 259 )
      {
        KeWaitForSingleObject(&FileObject_8, Suspended, 0, 0, 0i64);
        Status = IoStatusBlock.Status;
      }
      if( Status >= 0 )
      {
        v18 = 4096;
        for( i = 4096i64; ; i = v18 )
        {
          PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, i, 0x6F426F49ui64);
          if( !PoolWithTag )
            break;
          LODWORD(OutputBufferLength) = v18;
          v21 = IopBuildDeviceIoControlRequest(
                  0x70050ui64,
                  v15,
                  0i64,
                  0i64,
                  PoolWithTag,
                  OutputBufferLength,
                  0,
                  &FileObject_8,
                  &IoStatusBlock,
                  ReturnAddress);
          if( !v21 )
            break;
          KeResetEvent(&FileObject_8, v20, v22, v23, Timeout);
          v24 = IofCallDriver(v15, v21);
          if( v24 == 259 )
          {
            KeWaitForSingleObject(&FileObject_8, Suspended, 0, 0, 0i64);
            v24 = IoStatusBlock.Status;
          }
          if( v24 != -1073741789 )
            goto LABEL_23;
          ExFreePoolWithTag(PoolWithTag, 0);
          v18 *= 2;
        }
        v24 = -1073741670;
LABEL_23:
        ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
        if( v24 >= 0 )
        {
          v26 = HIDWORD(v50);
          if( HIDWORD(v50) < 0x200 )
            v26 = 512;
          HIDWORD(v50) = v26;
          for( j = *v10; j != (__int64 *)v10; j = (__int64 *)*j )
          {
            if( v41 != v10 || DiskCount != 1 || *PoolWithTag )
            {
              v28 = IopVerifyDiskSignature((__int64)PoolWithTag, (__int64)j, &v34);
              v4 = v34;
              if( !v28 )
                continue;
            }
            v29 = 0i64;
            if( PoolWithTag[1] )
            {
              v30 = (__int64)v42;
              do
              {
                if( !v4 && !*PoolWithTag )
                  v4 = PoolWithTag[2];
                if( PoolWithTag[36 * v29 + 18] )
                {
                  RtlStringCchPrintfA(v52, 0x80ui64, (INT8 *)"%spartition(%d)");
                  RtlInitAnsiString(&String1, v52, v31);
                  if( RtlEqualString(&String1, &DestinationString, 1u) )
                  {
                    *(_DWORD *)(v30 + 16) = v4;
                    *(_QWORD *)v30 = *(_QWORD *)&PoolWithTag[36 * v29 + 14];
                    if( v9 )
                    {
                      if( *PoolWithTag == 1 )
                      {
                        LOBYTE(v9[2].SystemPartitionOffset) = 1;
                        *(_OWORD *)&v9[1].BootPartitionOffset = *(_OWORD *)(PoolWithTag + 2);
                      }
                      else
                      {
                        LOBYTE(v9[2].SystemPartitionOffset) = 0;
                      }
                    }
                  }
                  if( RtlEqualString(&String1, &String2, 1u) )
                  {
                    *(_DWORD *)(v30 + 20) = v4;
                    *(_QWORD *)(v30 + 8) = *(_QWORD *)&PoolWithTag[36 * v29 + 14];
                    if( *PoolWithTag == 1 )
                    {
                      if( v9 )
                      {
                        BYTE1(v9[2].SystemPartitionOffset) = 1;
                        *(_OWORD *)&v9[1].BootDeviceSignature = *(_OWORD *)(PoolWithTag + 2);
                      }
                    }
                    else if( v9 )
                    {
                      BYTE1(v9[2].SystemPartitionOffset) = 0;
                    }
                  }
                }
                v29 = (unsigned int)(v29 + 1);
              }
              while( (unsigned int)v29 < PoolWithTag[1] );
              v10 = v43;
              v34 = v4;
            }
          }
LABEL_25:
          ExFreePoolWithTag(PoolWithTag, 0);
          goto LABEL_26;
        }
        if( PoolWithTag )
          goto LABEL_25;
      }
      else
      {
LABEL_11:
        ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
      }
LABEL_26:
      LODWORD(v36) = v36 + 1;
    }
    while( (unsigned int)v36 < DiskCount );
  }
  return 0;
}

Referenced by:

IoGetBootDiskInformation