Какому из физических HDD принадлежит логический диск? - VB
Формулировка задачи:
Количество жёстких дисков от 2-х. Как
без WMI
(если отключён),без FSO
и без Left$(App.Path, 3) определить сопоставления логических дисков физическим, пользуясь API?Решение задачи: «Какому из физических HDD принадлежит логический диск?»
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