C Днем рождения!
Вы можете присоединиться к нам, отправив открытку или оставив свои поздравления в комментариях к этой записи.
|
11-08-2009 01:16 (ссылка)
C Днем рождения!Вы можете присоединиться к нам, отправив открытку или оставив свои поздравления в комментариях к этой записи.
29-06-2009 17:49 (ссылка)
Прив'язка до залізаІнколи в програмах необхідно використовувати можливість перевірки типа носія або його серійний номер. Причини можуть бути різними від банального контролю пристроїв в системі до засобів защит що використовують прив'язку до заліза. Зараз я вам покажу як за допомогою 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; а,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, а, 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, а,b, nil, 0); writeln('S/N drive: ',SerialNum); readln; ... Переклад сайта Программіст.еу
23-02-2009 20:01 (ссылка)
Темный вечер, посиделкиВот, товарищи, и настало долгожданное 23 февраля!
Праздник, да и праздник это великий! Не каждый день однако "день защитника"))) Давно я не писал в своем блоге, восстанавливаю, так сказать, справедливость. Все мы, патриоты и Россию любим, поэтому и защищаем. Расскажу, как прошел вечер с сослуживцами. Встретились часа в 2 дня у приморского парка победы. Сначала была культурная программа - сходили на концерт посвященный афганцам, а потом уже отправились, что называется, "за стол". Слава Богу, никто в этот раз не напился)). Я вон даже раньше всех домой отправился, потому что с женой и детьми надо еще попраздновать... Детей патриотизму поучить! Ну что ж, друзья, доброго вам времени! настроение: Боевое Метки: 23 февраля, победа, сражение, война |
|
|||||||||||