Какому из физических HDD принадлежит логический диск? - VB

Формулировка задачи:

Количество жёстких дисков от 2-х. Как без WMI(если отключён), без FSO и без Left$(App.Path, 3) определить сопоставления логических дисков физическим, пользуясь API?

Код к задаче: «Какому из физических HDD принадлежит логический диск? - VB»

textual
Public Function MappingSearch(a$)
   Dim Ret As Long                  'длина полезной информации от GetLogicalDriveStrings
   Dim DrivesString As String * 255 'здесь будут данные от GetLogicalDriveStrings
   Dim AllDrives$                 'общая строка для всех логич. дисков из функции GetLogicalDriveStrings
   Dim Tmp$                       'хранит букву диска в формате "A:" или "C:"
   Dim DeviceHandle As Long       'дескриптор объекта
   Dim i As Long                  'для счёта дисков
   Dim CountBytesReturned As Long 'сколько байт вернула функция DeviceIoControl
   Dim OutBuffer(64) As Byte      'массив для хранения выданных от DeviceIoControl данных
   Dim DriveCount As Long         'кол-во логич. дисков после разбора строки AllDrives$
   Dim start As Long
   Dim NameDiskPos As Long
   
   
   Ret = GetLogicalDriveStrings(Len(DrivesString), DrivesString)
   AllDrives$ = Left(DrivesString, Ret)
 
   'отображаем все логические диски на компьютере
   start = 1        'стартовая позиция сканирования в InStr
   For i = 1 To Len(AllDrives$)
      NameDiskPos = InStr(start, AllDrives$, ":")
      If (NameDiskPos <> 0) Then
         inc DriveCount     'плюсуем 1 к логическим дискам
       Else
         Exit For
      End If
      start = NameDiskPos + 1
   Next
   
   'в массиве столько элементов, сколько нашли логических дисков
   '-1 из-за Option Base 0
   ReDim Arr(DriveCount - 1)
   
   i = 0     'будем считать диски
   
   While (AllDrives$ <> vbNullString)
      
      Tmp$ = Mid$(AllDrives$, 1, InStr(AllDrives$, vbNullChar) - 2)  'берём одну букву диска в виде "A:"
      AllDrives$ = Mid$(AllDrives$, InStr(AllDrives$, vbNullChar) + 1)  'удаляем первые 3 символа из строки
                        
      'берём хэндл объекта, в данном случае это диск
      DeviceHandle = CreateFile("\\." & Tmp$, GENERIC_READ&, _
                     FILE_SHARE_READ, _
                     ByVal 0&, OPEN_EXISTING, 0, 0&)
    
      If (DeviceHandle = INVALID_HANDLE_VALUE) Then
         
         Arr(i).DriveName = Tmp$
         Arr(i).DriveNumber = -1  'CreateFile не смог определить ресурс. Так и запишем.
       
       Else
         
         Ret = DeviceIoControl(DeviceHandle, _
               IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, _
               ByVal 0&, _
               0&, _
               OutBuffer(0), _
               64, _
               CountBytesReturned, _
               ByVal 0&)
         
         If (Ret = 0) Then
            
            Arr(i).DriveName = Tmp$
            Debug.Print "Буква диска -> " & Tmp$
            'не может найти зависимость. Обозначим как -2
            Arr(i).DriveNumber = -2
            a$ = a$ & "Буква раздела -> " & vbTab & Arr(i).DriveName & "  на диске №" & vbTab & Arr(i).DriveNumber & vbCrLf
            
          Else
            
            Arr(i).DriveName = Tmp$
            Arr(i).DriveNumber = OutBuffer(8)
            a$ = a$ & "Буква раздела -> " & vbTab & Arr(i).DriveName & "  на диске №" & vbTab & Arr(i).DriveNumber & vbCrLf
            
         End If
         
      End If
      
      CloseHandle DeviceHandle      'выгружаем устройство
      
      inc i                         'диск = диск + 1
   
   Wend
End Function
 
Private Sub Form_Load()
   Call MappingSearch(a$)
   MsgBox a$
   Unload Me
End Sub

8   голосов, оценка 3.250 из 5


СОХРАНИТЬ ССЫЛКУ