• 8574
  • 0
  • 1
Нравится блог?
Подписывайтесь!

Привязка к железу

Иногда в программах необходимо использовать возможность проверки типа носителя или его серийный номер. Причины могут быть разными от банального контроля устройств в системе до средств защит использующих привязку к железу. Сейчас я вам покажу как с помощью 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++

UINT WINAPI GetDriveType(
LPCTSTR lpRootPathName //путь к диску
);


Delphi

function GetDriveType(
lpRootPathName: PChar //путь к диску
): UINT; stdcall;


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

BOOL WINAPI GetVolumeInformation(
LPCTSTR lpRootPathName, //путь к сетевому или локальному
// тому (пример: "MyServerMyShare" или "C:".
LPTSTR lpVolumeNameBuffer, //буфер - в котором будет храниться
// имя тома
DWORD nVolumeNameSize, //размер буфера
LPDWORD lpVolumeSerialNumber, //серийный номер тома
LPDWORD lpMaximumComponentLength, //размер тома
LPDWORD lpFileSystemFlags, //тип файловой системы
LPTSTR lpFileSystemNameBuffer, //название файловой системы
DWORD nFileSystemNameSize //размер буфера под название ФС
);


Delphi

function GetVolumeInformation(
lpRootPathName: PChar; //путь к сетевому или локальному
//тому (пример: "MyServerMyShare" или "C:".
lpVolumeNameBuffer: PChar; //буфер - в котором будет храниться
// имя тома
nVolumeNameSize: DWORD; //размер буфера
lpVolumeSerialNumber: PDWORD; //серийный номер тома
var lpMaximumComponentLength, lpFileSystemFlags: DWORD; //размер
// тома и тип файловой системы
lpFileSystemNameBuffer: PChar; //название файловой системы
nFileSystemNameSize: DWORD //размер буфера под название ФС
): BOOL; stdcall;


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

#include
#include
#include
#include
using namespace std;

int main() {
// Получаем тип носителя с которого запущена программа
unsigned int drive_type = GetDriveType( NULL );

char VolumeNameBuffer[100];
char FileSystemNameBuffer[100];
DWORD sz,fs;
unsigned long drive_sn;
GetVolumeInformationA(
NULL,
VolumeNameBuffer,
100,
&drive_sn,
sz,
fs,
FileSystemNameBuffer,
100
);
cout << "Volume serial number:t";
if(drive_sn == 1018821877) //сравниваем серийный номер
cout << "correct" << endl;
else
cout << "invalid" << endl;
cout << "Drive type:t";
if(drive_type == DRIVE_REMOVABLE)
cout << "correct" << endl;
else
cout << "invalid" << endl;
getch();
}


Delphi

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils,windows;

var
SerialNum,dtyp:DWORD;
a,b:DWORD;
Buffer,disk :Array[0..255]of char;
begin
dtyp:=GetDriveType(nil);
if dtyp = DRIVE_REMOVABLE then
writeln('Disk(type): Yes')
else
writeln('Disk(type): No');
GetVolumeInformation(
nil,
Buffer,
sizeof(Buffer),
@SerialNum,
a,
b,
nil,
0);
if SerialNum = 1018821877 then //сравниваем серийный номер
writeln('SN: Yes')
else
writeln('SN: No');
readln;
end.


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

...
GetVolumeInformationA(NULL, VolumeNameBuffer,100,
&drive_sn,sz,fs,FileSystemNameBuffer,100);
...


Delphi

...
GetVolumeInformation(nil,Buffer,sizeof(Buffer),
@SerialNum, a,b, nil, 0);
writeln('S/N drive: ',SerialNum);
readln;
...


Рекомендуемые статьи для прочтения:
WinAPI: Смена серийного номера тома.

Как стать хакером

huzrus
3 февраля 2013, 21:35
2175

Загрузка...
Loading...

Комментарии

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Нет ничего более вдохновляющего, чем видеть стада сайгаков. Не зря их называют «киелі»

Нет ничего более вдохновляющего, чем видеть стада сайгаков. Не зря их называют «киелі»

В начале 2000-х годов в уральской популяции оставалось только 2500 сайгаков. Сейчас благодаря охране от браконьеров их численность выросла до 100 тысяч.
theYakov
17 июля 2017 / 17:55
  • 8702
  • 3
Ресторанный консенсус в Казахстане: мужчина платит всегда

Ресторанный консенсус в Казахстане: мужчина платит всегда

Ресторанный консенсус в этой стране таков, что если речь идет именно о свидании, то оплачивает его на 100% из 100 именно мужчина. Пытаться его расшатать - это достаточно дорогое удовольствие.
convoluted
17 июля 2017 / 15:32
Решили рискнуть и обратиться к риэлторам. И этим людям мы доверяем свой ночлег?

Решили рискнуть и обратиться к риэлторам. И этим людям мы доверяем свой ночлег?

Звоним риэлтору, говорим, верните наши 15 000 тг, так как ваша клиентка нас кинула. По его словам, он вернуть деньги больше не может. Не имеет право.
decorus
17 июля 2017 / 14:48
  • 3085
  • 15
Польша – страна простых решений. Почему они смогли, а мы еще нет?

Польша – страна простых решений. Почему они смогли, а мы еще нет?

В Польше вообще очень много понятного и простого – инфраструктура, коммуникации и дороги прежде всего, льготы в образовании, поляки вообще получают его бесплатно. А урожай побольше нашего.
Shimanskaya
17 июля 2017 / 16:08
  • 3236
  • 37
«Алматы – город, летящий под откос», или Кто заказал утку у российского блогера

«Алматы – город, летящий под откос», или Кто заказал утку у российского блогера

Некий блогер Сергей Никитский неустанно пишет о Казахстане, Астане, Экспо и посвящает два материала Алматы, причём подчёркнуто называет город Алма-Ата.
Langdon
19 июля 2017 / 15:44
  • 2833
  • 50
Один из способов выиграть суд против коллекторов

Один из способов выиграть суд против коллекторов

Сегодня в своем посте я постараюсь рассказать, как выиграть суд против некоторых коллекторских компании в нашей стране. Чем отличается коллекторское агенство от обычного банка?
Advokot
18 июля 2017 / 15:31
  • 2744
  • 9
«Язык мой – враг мой», или 7 причин никогда не разговаривать с полицией

«Язык мой – враг мой», или 7 причин никогда не разговаривать с полицией

На этот раз пост очень важный и необходим к прочтению каждым! Не поленитесь и уделите время прочтению. Ни в коем случае, не разговаривайте с полицейскими до прихода вашего адвоката!
asselsabekova
18 июля 2017 / 14:19
  • 2789
  • 31
Госорганы, ответственные за жизни детей, хранят молчание. У них в отчетах все хорошо

Госорганы, ответственные за жизни детей, хранят молчание. У них в отчетах все хорошо

Вчера все информационные агентства страны передали сообщение, которое заставило забиться в ужасе сердца всех матерей страны. В мусорном контейнере города Сатпаев было обнаружено тело новорожденной девочки.
AliyaSadyrbaeva
19 июля 2017 / 11:06
  • 2117
  • 17
Книга, которая сэкономит вам 150 тысяч долларов и два года жизни

Книга, которая сэкономит вам 150 тысяч долларов и два года жизни

Автор утверждает, что программы МБА не дают никакого позитивного выхлопа, если ты уже не являешься владельцем или наследником прибыльного бизнеса. Знания МБА можно получить бесплатно, уверяет он.
Aks_Ras
19 июля 2017 / 16:28
  • 2245
  • 2