На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Связать разделы с физическими дисками, и другие вопросы
    Приветствую!

    Есть \\.\PhysicalDriveX, его можно открыть через CreateFile и получить GUID (IOCTL_DISK_GET_DRIVE_GEOMETRY_EX... или можно как-то ещё проще получить GUID?).

    Можно получить список (GUID) всех томов через FindFirstVolume/FindNextVolume (в формате \\?\Volume{GUID}).
    0. Можно ли получить GUID типа раздела через IOCTL_DISK_GET_PARTITION_INFO_EX, подставив этот том (\\?\Volume{GUID})?

    1. И есть ли вообще разница между томами и разделами?
    К примеру, в описании IOCTL_DISK_GET_LENGTH_INFO сказано "Retrieves the length of the specified disk, volume, or partition." (типа раздел и том – это не одно и то же).

    2. И главный вопрос: как связать физические диски с разделами?
    Т.е. определить – какие разделы на каком физическом диске находятся?

    3. А как перечислить все физические диски и все разделы на этом диске?
    Можно открывать все подряд PhysicalDrive0, 1, 2... до ошибки типа not found. Но это единственный способ?
    А не может быть такого, что PhysicalDrive1 нет, а PhysicalDrive2 есть?

    4. Ну и ещё вопрос до кучи: какие вообще устройства (диски, разделы) можно задать для CreateFile кроме \\.\PhysycalDriveX, \\.\CdRomX и \\.\X: ? Scsi ещё вроде были (только как их задать – х/з).
    В инете можно найти ещё устройства типа \Device\Harddisk0\Partition1, но у меня открыть (CreateFile) такое устройство не получается (не найден), задаю \\?\Device\Harddisk0\Partition1 – аналогично (\\.\ тоже, без Device\ та же история). Ещё фигурируют какие-то \Device\Harddisk0\DR0 и т.п. – тоже не работает (что это такое вообще?)

    Добавлено
    Ну и бомбану ещё вопросом:
    5. Откуда берутся GUID дисков на основе MBR (или вообще с boot-секторами) типа флешек и пр.? Там же нигде эти GUID не зашиты!
    vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
      Цитата Jin X @
      2. И главный вопрос: как связать физические диски с разделами?
      Т.е. определить – какие разделы на каком физическом диске находятся?

      QueryDosDevice
      char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
      for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


      user posted image Чат Исходников в СкайпеЧат Исходников в ДискордеНе проходим, а заходим!
        Цитата B.V. @
        QueryDosDevice
        Нет, мне надо НЕ из диска C: получить странное имя \Device\HarddiskVolume1 (которое даже открыть нельзя через CreateFile... не понятно вообще, нафига это имя нужно и что с ним делать).
        А надо получить из \\?\Volume{GUID} имя физического диска \\PhysicalDrive0, к примеру.
        Или имея \\PhysicalDrive0 получить все \\?\Volume{GUID}, которые находятся на этом физ. диске.
        Ну или если где-то там будет фигурировать \Device\HarddiskVolume1, то надо понять, как с них работать, как получить GUID этого раздела и пр...
        vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
          По поводу вопроса №2...

          С помощью DeviceIoControl(IOCTL_DISK_GET_DRIVE_LAYOUT_EX) можно получить инфу обо всех разделах и их GUID (как для MBR, так и для GPT разделов). И дальше через GetVolumePathNamesForVolumeName('\\?\Volume{GUID}\') получить инфу о буквах/путях. Через GetVolumeInformation('\\?\Volume{GUID}\') получаем метки, файловую систему и пр. ерунду.

          Есть только один интересный нюанс.
          На хардах всё работает.
          А вот с флешкой глюки: \\?\Volume{GUID}\ не совпадает с тем, что выдаёт утилита mountvol, и GetVolumePathNamesForVolumeName/GetVolumeInformation тоже ничего не выдают.
          Вопрос: как сопоставить GUID диска с GUID, который указан в \\?\Volume{GUID}\. По логике он должен совпадать. Код прикрепляю (тут этот GUID отображается как PartitionId).

          Прикреплённый файлПрикреплённый файлHardDriveInfo.zip (31,37 Кбайт, скачиваний: 5)
          vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
            Сопоставил буквы с номерами разделов через IOCTL_STORAGE_GET_DEVICE_NUMBER (перебирая все буквы) :)
            p.s. Он, кстати, ведёт нумерацию PartitionNumber с 1.

            Прикреплённый файлПрикреплённый файлHardDriveInfo.zip (31,73 Кбайт, скачиваний: 3)
            vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
              Навскидку, может кто знает, как по букве найти имя тома, т.е. \\?\Volume{GUID} ?
              vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0975 ]   [ 18 queries used ]   [ Generated: 14.11.18, 06:50 GMT ]