WinAPI: Определение типа носителя и его серийного номера

Иногда в программах необходимо использовать возможность проверки типа носителя или его серийный номер. Причины могут быть разными от банального контроля устройств в системе до средств защит использующих привязку к железу. Сейчас я вам покажу как с помощью API реализовать эту простую задачу.

Нам понадобится всего 2 API — функции:

  • GetDriveType — определяет и возвращает тип носителя;
  • GetVolumeInformation — определяет информацию о носителе, среди которой содержится серийный номер.

Рассмотрим описание этих функций для С++ и Delphi. Первой будет функция GetDriveType, она очень простая и использует всего один параметр — указатель на том. Например «c:\»,»a:\» и т.д. Функция возвращает одно из следующих значений:

DRIVE_UNKNOWN — 0 : диск неопределен/не существует

DRIVE_NO_ROOT_DIR — 1 : неверный путь/ путь не указывает на том

DRIVE_REMOVABLE — 2 : тип устройства определяется как съемный (дискета, флешка и т.д.)

DRIVE_FIXED — 3 : тип устройства — фиксированный диск (жесткий диск)

DRIVE_REMOTE — 4 : тип устройства — удаленный(сетевой) диск

DRIVE_CDROM — 5 : это устройство CD-ROM

DRIVE_RAMDISK — 6 : виртуальный диск, созданный в оперативной памяти

C/C++

Замечание: Если в качестве параметра указать для С/С++ NULL, а для Delphi — nil то тип устройства будет определяться для текущего диска (с которого была запущена программа).

А теперь взглянем на функцию GetVolumeInformation. Тоже достаточно простая функция, однако использует параметров значительно больше.

C/C++

Delphi

Замечание: Если в качестве первого параметра указать для С/С++ NULL, а для Delphi — nil то функция будет выполняется для текущего диска (с которого была запущена программа).
Ну а теперь собственно для пущего интересу приведу пример, как привязать программу к устройству. В данном примере будем привязывать программу к флешке. Смотрим пример:

C/C++

Delphi

Замечание: Может возникнуть вопрос, а как узнать серийник диска, чтобы знать с чем сравнивать? Очень просто, для этого пишем тестовую прогу, в которой пишем следующий код:

C/C++

Delphi

Понравилась статья? Поделиться с друзьями:
Комментариев: 5
  1. Аноним

    Очень нужная вещь эта привязка. Спасибо коффи

  2. ex3me

    Автор, за статью респект. В частности за реализацию на Делфи ;)

  3. Alexey

    Не слишком поднодит для привязки. Поскольку этот серийник меняется при форматировании.
    Из описания GetVolumeInformation Function в MSDN :

    This function returns the volume serial number that the operating system assigns when a hard disk is formatted. To programmatically obtain the hard disk’s serial number that the manufacturer assigns, use the Windows Management Instrumentation (WMI) Win32_PhysicalMedia property SerialNumber.

    1. lizz

      Не понимаю Alexey, как вы так пришли к этому выводу… Может вы не понимаете определения привязки? … привязка представляет собой некоторую зависимость, при которой в данном случае будет запускаться/не запускаться программа. А от того что при форматировании сменился номер, фигово то тому кто отформатировал, потому что прога уже работать не будет(пока номер не сменить обратно) ;) … но соглашусь в одном что данный пример привязки очень прост, и достаточно быстро обходиться =)

      1. Аноним

        А что тут непонятного? «Поскольку этот серийник меняется при форматировании.» — по моему, всё очевидно.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: