1 (изменено: freeZer0K, 2017-10-24 16:39:11)

Тема: AHK: Получить порядковый номер жесткого диска или флешки

Добрый день всем!

Ничего внятного по теме найти не удалось. DriveGet не дает нужного результата.

Вопрос:
Как получить порядковый номер диска (НЕ серийный номер), если есть переменная с буквой диска?
Для понимания - в linux fstab это выглядит так: hd0,2

Нужна конструкция типа такой:

DriveL := "X:"

If DriveL = "X:"
	{
	MsgBox % DriveN ; где DriveN - номер в виде цифры, напр. 0 или 1 ... и т.д.
	}

Буду благодарен за любую помощь!

2

Re: AHK: Получить порядковый номер жесткого диска или флешки

Разве нельзя получить через DriveGet все диски, и найти порядковый номер нужного?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Получить порядковый номер жесткого диска или флешки

teadrinker, не понял .... каким образом???

4

Re: AHK: Получить порядковый номер жесткого диска или флешки

MyDisk := "D"
DriveGet, Disks, List
MsgBox, % Disks
MsgBox, % InStr(Disks, MyDisk)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Получить порядковый номер жесткого диска или флешки

teadrinker, не, это не то ...

Счаз нарыл кое-что:

for Drive in ComObjGet("winmgmts:").ExecQuery("SELECT Name, SerialNumber FROM Win32_DiskDrive")
out .=  Drive.Name . "`n"
MsgBox, % out

Надо привязать к букве диска ....

6 (изменено: teadrinker, 2017-10-24 20:16:30)

Re: AHK: Получить порядковый номер жесткого диска или флешки

Так, вроде, работает:

MsgBox, % PhysicalDriveNumberFromLogicalDisk("C").driveNumber

PhysicalDriveNumberFromLogicalDisk(diskPath)  {
   static GENERIC_READ := 0x80000000, GENERIC_WRITE := 0x40000000
        , FILE_SHARE_READ := 1, FILE_SHARE_WRITE := 2, OPEN_EXISTING := 3
        , IOCTL_STORAGE_GET_DEVICE_NUMBER := 0x2D1080
        
   diskPath := "\\.\" . RegExReplace(diskPath, "i).*([A-Z]).*", "$1") . ":"
   hFile := DllCall("CreateFile", Str, diskPath, UInt, GENERIC_READ|GENERIC_WRITE
                                               , UInt, FILE_SHARE_READ|FILE_SHARE_WRITE
                                               , Ptr, 0, UInt, OPEN_EXISTING
                                               , UInt, 0, Ptr, 0, Ptr)
                                               
   VarSetCapacity(STORAGE_DEVICE_NUMBER, 12, 0)
   res := DllCall("DeviceIoControl", Ptr, hFile, UInt, IOCTL_STORAGE_GET_DEVICE_NUMBER
                                   , Ptr, 0, UInt, 0, Ptr, &STORAGE_DEVICE_NUMBER
                                   , UInt, 12, UIntP, bites, Ptr, 0)
   if !res
      MsgBox, DeviceIoControl failed. Error: %A_LastError%
   DllCall("CloseHandle", Ptr, hFile)

   return res ? { driveNumber: NumGet(STORAGE_DEVICE_NUMBER, 4, "UInt")
                , partitionNumber: NumGet(STORAGE_DEVICE_NUMBER, 8, "UInt") } : ""
}

Номер диска от 0.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Получить порядковый номер жесткого диска или флешки

teadrinker, круто, работает!

Почти такой-же вариант, тока покороче:

USBdrvLtr := "H:"

Drv := "\\.\" USBdrvLtr

hVol := DllCall("CreateFile", Str, Drv, UInt,, UInt,, UInt,, UInt, 0x3)
VarSetCapacity(VDE, 1024)
If DllCall("DeviceIoControl", UInt, hVol, UInt, 0x560000, UInt,, UInt,, UInt, &VDE, UInt, 1024, UIntP,, UInt, 0)

MsgBox % NumGet(VDE, 8)

8

Re: AHK: Получить порядковый номер жесткого диска или флешки

Почему короче? Те же две функции, просто вместо понятных констант магические числа.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Получить порядковый номер жесткого диска или флешки

... ну да, я и говорю ... просто выглядит короче

10

Re: AHK: Получить порядковый номер жесткого диска или флешки

teadrinker, твой скрипт у меня на 2 дисках выдает ошибку - DeviceIoControl failed. Error: 1.
freeZer0K, твой работет, но не определяет сидиром.
И у обоих скриптов есть недостаток - они определяют только один диск в зеркалке.

11 (изменено: freeZer0K, 2017-10-24 23:36:07)

Re: AHK: Получить порядковый номер жесткого диска или флешки

А эти скрипты и не должны CD-rom детектить. Нафига это нужно? Они тока для hdd и флешек ...
Они даже разделы на одном диске не детектят, а только номера физических дисков показывают.

12

Re: AHK: Получить порядковый номер жесткого диска или флешки

freeZer0K пишет:

Нафига это нужно?

А нафига нужно детектить hdd и флешки?

13

Re: AHK: Получить порядковый номер жесткого диска или флешки

А это что б ниХто не догадался! Я на АНБ работаю ...