Прив’язка до заліза, Різне, Програмування, статті

Іноді в програмах необхідно використовувати можливість перевірки типу носія або його серійний номер. Причини можуть бути різними від банального контролю пристроїв в системі до засобів захистів використовують прив’язку до заліза. Зараз я вам покажу як за допомогою API реалізувати цю просту задачу.


Нам знадобиться всього 2 API – функції:



Розглянемо опис цих функцій для С + + і Delphi. Першою буде функція GetDriveType, вона дуже проста і використовує всього один параметр – покажчик на тому. Наприклад “c:”, “a:” і т.д. Функція повертає одне з наступних значень:



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: “; if (drive_sn == 1018821877) / / порівнюємо серійний номер
cout << “correct” << endl;
else
cout << “invalid” << endl;
cout << “Drive type: “;
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;

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*