Значит что имеем. В системе, любому съемному носителю соответствует некоторое вот такое вот имя: 1)\\.\STORAGE#RemovableMedia#7&fa4567dd&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}(Это для XP) или такое 2)\\.\STORAGE#Volume#_??USBSTOR#Disk&Ven_&Prod_&Rev_#531246010110023004173&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} это для W7 3)... 4)... Собственно. А как системы формируют вот эти вот номера fa4567dd и 531246010110023004173. Думал что fa4567dd - результат GetVolumeInformation. Ан нет. Функция возвращает совсем другое значение. Впринципе оба эти ID можно получить из реестра HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\ \DosDevices\X:. Но возникает проблема.Скажем у меня система XP а мне нужно узнать ID под W7. Из реестра соответственно я это значение уже вытащить не смогу. Как быть?
К сожалению не совпадают эти номера. Причем вообще никак. GetVolumeInformation возвращает 23327ACE для одного из моих дисков а серийник в идентификаторе устройства 3918966a
Win32_Volume class из WMI DeviceID Data type: string Access type: Read-only Unique identifier for the volume on this system. Не то?
Поидее для Vista и W7 даже и подойдет. Но Смущает Windows XP and earlier: This class is not available. Меня еще неустраивают некоторые моменты в WMI. Не хотелось бы его использовать.
А это и есть серийный номер диска(съемного!), который винда получает при монтировании спец-м запросом.... Можно, используя CM_Get_Parent + CM_Get_Device_IDA вытащить строку типа USB\VID_0457&PID_0151\A584D53031E586 под любым аккаунтом (A584D53031E586 - серийный номер)
Я понимаю что GetVolumeInformation должна возвращать то что используется здесь. \\.\STORAGE#RemovableMedia#7&fa4567dd&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} Но это не так. Значения различаются. С Setupapi щас пробую. О результатах отпишусь
GetVolumeInformation возвращает метку диска (4 байта) - хранится в инфо файловой системы... Была такая тулза у Руссиновича, которая меняла эту метку (volumeid.exe)...Мы же говорим о серийном номере...
fa4567dd не должно являться серийным номером. Слишком мало байт. Всего 4. Реальный серийник используется в Идентификаторах на Vista и W7. В приведенных мной примерах это ,вероятнее всего, 531246010110023004173. На XP в реестре я тоже обнаружил этот код. Но он не используется в конструкциях \.\STORAGE#RemovableMedia#. То есть, fa4567dd - это нечто иное чем серийный код или метка тома. Хотя именно на метку я и подумал сначала, так как по размеру совпадает.
Идентификатор 531246010110023004173 получается by SetupDiGetDeviceInstanceId XP, VISTA, W7. А вот с fa4567dd проблема. VISTA, W7 никак не хотят сдаваться (на XP получается так же, через SetupDiGetDeviceInstanceId).
Он не возвращает ошибок просто в тех строках которые он возвращает нет нужного нам идентификатора (fa4567dd). Его вообще в реестре нет. Сдается мне что под семеркой и вистой его не получить стандартными средствами. А вот этот идентификатор 531246010110023004173 в реестре есть на всех системах .. Ну соответственно и функция его успешно возвращает. SetupDiGetDeviceInstanceId возвращает что то вроде этого USB\ROOT_HUB\4&88891A4&0 USB\ROOT_HUB\4&9019713&0 USB\ROOT_HUB20\4&F1A25FC&0 USB\VID_0000&PID_0000\5&4DE2C51&0&1 USB\VID_0457&PID_0151\4311233250C07E USB\VID_045E&PID_00F6\5&29574BA5&0&1 USBSTOR\DISK&VEN_JETFLASH&PROD_TS2GJF110&REV_0.00\4311233250C07E&0 V1394\NIC1394\D15B871B80DA0 Отсюда и парсим ID ишники.. Но Наверно проще будет сделать через реестр это все. Ветки SYSTEM\MountedDevices SYSTEM\CurrentControlSet\Enum С коротким идентификатором на VISTA, W7 непонятно пока что делать.
Вообще-то GetVolumeInnformation возвращает метку тома а не ID. Реальный ID диска получить можно только через DeviceIoControl. Больше никак в юзверьмоде. ADD: GetVolumeInformation - гляньте в дизасме и убедитесь что это за функа.
мб 4 байта - уникальный идентификатор диска в MBR перед таблицей разделов - читается из юзермода как и весь MBR
Ret, Вы никогда не читаете посты кроме первого и своего? Это не так. Я гляну, но вот сейчас смотрю. На форумах пишут ParentIdPrefix (fa4567dd) разный даже для XP если она была переустановлена. Надо проверять.
Собственно вопрос решен. Спасибо братьям украинцам. Берем из HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ идентификатор устройства USBSTOR\Disk&Ven_JetFlash&Prod_TS2GJF110&Rev_0.00\4311233250c07e&0 и вычисляем по нему хэш. На выходе получаем ParentIdPrefix. Код (Text): #include "math.h" #include "string.h" template<class T> unsigned long Hash(T *p) { unsigned long _chHolder = 0; while( *p) _chHolder = 37 * _chHolder + (unsigned long) (*p++); return abs(314159269 * (long)_chHolder) % 1000000007; } int main() { char a[] = "USBSTOR\\Disk&Ven_JetFlash&Prod_TS2GJF110&Rev_0.00\\4311233250c07e&0"; unsigned long result = Hash(strupr(a)); return 0; } USBSTOR\\Disk&Ven_JetFlash&Prod_TS2GJF110&Rev_0.00\\4311233250c07e&0 во всех системах от XP до W7 одинаков.