Привязка Программы К Железу на C++

DOMINUS_EDEM

Местный житель
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
ЮБИЛЕЙНАЯ ЛЕНТА

DOMINUS_EDEM

Местный житель
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
ЮБИЛЕЙНАЯ ЛЕНТА
Регистрация
1 Июн 2018
Сообщения
1,099
Реакции
389
Репутация
1
Род занятий

Электронные кошельки, Пробив информации

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

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

Рассмотрим описание этих функций для С++. Первой будет функция 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++:
UINT WINAPI GetDriveType(

LPCTSTR lpRootPathName //путь к диску

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

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

LPCTSTR lpRootPathName, //путь к сетевому или локальному

// тому (пример: "\\MyServer\MyShare\"

или "C:\".

LPTSTR lpVolumeNameBuffer, //буфер - в котором будет храниться

// имя тома

DWORD nVolumeNameSize, //размер буфера

LPDWORD lpVolumeSerialNumber, //серийный номер тома

LPDWORD lpMaximumComponentLength, //размер тома

LPDWORD lpFileSystemFlags, //тип файловой системы

LPTSTR lpFileSystemNameBuffer, //название файловой системы

DWORD nFileSystemNameSize //размер буфера под название ФС

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

Ну а теперь собственно для пущего интересу приведу пример, как привязать программу к устройству. В данном примере будем привязывать программу к флешке.

Смотрим пример:
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();

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

GetVolumeInformationA(NULL, VolumeNameBuffer,100,

&drive_sn,sz,fs,FileSystemNameBuffer,100);

...
 

ZISOGI

Участник

ZISOGI

Участник
Регистрация
25 Сен 2023
Сообщения
9
Реакции
0
Репутация
0
Спасибо огромное, нужна была как раз такая инфа
 
Сверху