Определить Volume Serial Number диска

Тема в разделе "WASM.WIN32", создана пользователем seda, 15 окт 2010.

  1. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Значит что имеем. В системе, любому съемному носителю соответствует некоторое вот такое вот имя:
    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. Из реестра соответственно я это значение уже вытащить не смогу. Как быть?
     
  2. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    GetVolumeInformationW( szVolumeName , NULL , 0 , &dwVolumeSerial , 0 , NULL , NULL , 0 ) -> msdn ?
     
  3. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    К сожалению не совпадают эти номера. Причем вообще никак. GetVolumeInformation возвращает 23327ACE для одного из моих дисков а серийник в идентификаторе устройства 3918966a
     
  4. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    тогда просто используй SetupDiGetDeviceRegistryProperty.
     
  5. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Буду пробовать. Спасибо за подсказку
     
  6. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Win32_Volume class из WMI

    DeviceID

    Data type: string
    Access type: Read-only

    Unique identifier for the volume on this system.

    Не то?
     
  7. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Поидее для Vista и W7 даже и подойдет.
    Но Смущает Windows XP and earlier: This class is not available.
    Меня еще неустраивают некоторые моменты в WMI. Не хотелось бы его использовать.
     
  8. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    А это и есть серийный номер диска(съемного!), который винда получает при монтировании спец-м запросом....

    Можно, используя CM_Get_Parent + CM_Get_Device_IDA вытащить строку типа
    USB\VID_0457&PID_0151\A584D53031E586

    под любым аккаунтом
    (A584D53031E586 - серийный номер)
     
  9. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Я понимаю что GetVolumeInformation должна возвращать то что используется здесь.
    \\.\STORAGE#RemovableMedia#7&fa4567dd&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
    Но это не так. Значения различаются. С Setupapi щас пробую. О результатах отпишусь
     
  10. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    GetVolumeInformation возвращает метку диска (4 байта) - хранится в инфо файловой системы... Была такая тулза у Руссиновича, которая меняла эту метку (volumeid.exe)...Мы же говорим о серийном номере...
     
  11. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    fa4567dd не должно являться серийным номером. Слишком мало байт. Всего 4. Реальный серийник используется в Идентификаторах на Vista и W7. В приведенных мной примерах это ,вероятнее всего, 531246010110023004173. На XP в реестре я тоже обнаружил этот код. Но он не используется в конструкциях \.\STORAGE#RemovableMedia#. То есть, fa4567dd - это нечто иное чем серийный код или метка тома. Хотя именно на метку я и подумал сначала, так как по размеру совпадает.
     
  12. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Идентификатор 531246010110023004173 получается by SetupDiGetDeviceInstanceId XP, VISTA, W7. А вот с fa4567dd проблема. VISTA, W7 никак не хотят сдаваться (на XP получается так же, через SetupDiGetDeviceInstanceId).
     
  13. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    какую ошибку возвращают?
     
  14. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Он не возвращает ошибок просто в тех строках которые он возвращает нет нужного нам идентификатора (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 непонятно пока что делать.
     
  15. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Вообще-то GetVolumeInnformation возвращает метку тома а не ID. Реальный ID диска получить можно только через DeviceIoControl. Больше никак в юзверьмоде.
    ADD: GetVolumeInformation - гляньте в дизасме и убедитесь что это за функа.
     
  16. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    мб 4 байта - уникальный идентификатор диска в MBR перед таблицей разделов - читается из юзермода как и весь MBR
     
  17. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Ret, Вы никогда не читаете посты кроме первого и своего?
    Это не так.
    Я гляну, но вот сейчас смотрю. На форумах пишут ParentIdPrefix (fa4567dd) разный даже для XP если она была переустановлена. Надо проверять.
     
  18. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Повторяюсь там 8 байт, MBR не причем
     
  19. seda

    seda New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2010
    Сообщения:
    47
    Адрес:
    Россия
    Собственно вопрос решен. Спасибо братьям украинцам.
    Берем из HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ идентификатор устройства
    USBSTOR\Disk&Ven_JetFlash&Prod_TS2GJF110&Rev_0.00\4311233250c07e&0 и вычисляем по нему хэш. На выходе получаем ParentIdPrefix.

    Код (Text):
    1. #include "math.h"
    2. #include "string.h"
    3.  
    4. template<class T>
    5. unsigned long Hash(T *p)
    6. {
    7. unsigned long _chHolder = 0;
    8. while( *p)
    9. _chHolder = 37 * _chHolder + (unsigned long) (*p++);
    10.  
    11. return abs(314159269 * (long)_chHolder) % 1000000007;
    12. }
    13.  
    14. int main()
    15. {
    16. char a[] = "USBSTOR\\Disk&Ven_JetFlash&Prod_TS2GJF110&Rev_0.00\\4311233250c07e&0";
    17. unsigned long result = Hash(strupr(a));
    18. return 0;
    19. }
    USBSTOR\\Disk&Ven_JetFlash&Prod_TS2GJF110&Rev_0.00\\4311233250c07e&0 во всех системах от XP до W7 одинаков.
     
  20. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    в реестр можно что угодно прописать.