Какому из физических 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д