Каталог статей

Главная » Статьи » C/С++

Привязка к железу
Иногда в программах необходимо использовать возможность проверки типа носителя или его серийный номер. Причины могут быть разными от банального контроля устройств в системе до средств защит использующих привязку к железу. Сейчас я вам покажу как с помощью 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, //путь к сетевому или локальному
  // тому (пример: "\\MyServer\MyShare\" или "C:\".
  LPTSTR lpVolumeNameBuffer, //буфер - в котором будет храниться
  // имя тома
  DWORD nVolumeNameSize, //размер буфера
  LPDWORD lpVolumeSerialNumber, //серийный номер тома
  LPDWORD lpMaximumComponentLength, //размер тома
  LPDWORD lpFileSystemFlags, //тип файловой системы
  LPTSTR lpFileSystemNameBuffer, //название файловой системы
  DWORD nFileSystemNameSize //размер буфера под название ФС
);
Delphi
function GetVolumeInformation(
  lpRootPathName: PChar; //путь к сетевому или локальному
  //тому (пример: "\\MyServer\MyShare\" или "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('S\N: Yes')
  else
  writeln('S\N: 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;
...

Категория: C/С++ | Добавил: virusik (03.07.2009)
Просмотров: 1875 | Комментарии: 1 | Рейтинг: 1.0/1 |
Всего комментариев: 1
1 Алексей  
0
Я вообще не вкатил! Подскажите плз! Я написал WallHack для игры и теперь мне надо что бы она привязывалась к компу(железу) Напишите плз! Формат проэкта .dll! тачнее не напишите а разъясните че куда втавлять и куда че писать) Если не сложно от видео не откажусь!

Имя *:
Email *:
Код *:
вход на сайт
Категории раздела
C/С++ [24]
статьи о языке C/С++
Visual FoxPro [1]
информация о языке Visual FoxPro
.NET [24]
статьи о языке программирования .NET
ваши статьи [4]
здесь вы можете размещать сваи статьи
модинг [4]
статьи о модинге ПК
Поиск по сайту
наши опросы
Оцените мой сайт
Всего ответов: 10
Мини-чат
помощь проекту
помоги проекту
ЯндексЯндекс. ДеньгиХочу такую же кнопку
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Каталог http://www.internetmir.ru Лучшие сайты интернета в каталоге Intenetmir
  • Delphi.int.ru - Сообщество программистов: общение, помощь, обмен опытом.
    реклама 88х31
    Каталог сайтов. Раскрутка. Хостинг. Каталог ссылок. Информационный портал - Старого.NET Шпоры, курсовые, пособия, рефераты, ВУЗы.
    Статистика
    webgari.com Рейтинг сайтов
    Раскрутка сайтов
    Яндекс цитирования
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0