Какому из физических 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


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