Блоги@MAIL.RU
новых блогов и сообществ: 57884
новых записей: 2245926
  
  Почта Мой Мир Файлы Фото Видео   Блоги   Игры Деньги
   Дуэли
         Помощь
добавить запись мои записи мои метки new мои дуэли избранное обо мне настройки оформление  
читать всех друзей редактировать друзей редактировать группы дни рождения настройка подписки  
создать сообщество мои сообщества каталог сообществ  
комментируемые активные популярные читаемые звездные блогиЗвездные блоги на Mail.Ru популярные записи последние записи опросы  
мои дуэли победы поражения прямой эфир двустволка new в десятку! new  
Имя    ( регистрация )
Пароль ( забыли?)

Лидер блогов


1. Щелкни, чтобы пообщаться с этим человеком в Mail.Ru Агенте Stalko
 



2. Щелкни, чтобы пообщаться с этим человеком в Mail.Ru Агенте La Femme
3. Щелкни, чтобы пообщаться с этим человеком в Mail.Ru Агенте Зайчег

Поиск по блогу

  

Метки  

11-08-2009 01:16 (ссылка
vakulovski vakulovski
vakulovski vakulovski

C Днем рождения!

  Администрация Блогов@Mail.Ru от всей души поздравляет  vakulovski vakulovski с днем рождения.

  Вы можете присоединиться к нам, отправив открытку или оставив свои поздравления в комментариях к этой записи.


29-06-2009 17:49 (ссылка
vakulovski vakulovski
vakulovski vakulovski

Прив'язка до заліза

Інколи в програмах необхідно використовувати можливість перевірки типа носія або його серійний номер. Причини можуть бути різними від банального контролю пристроїв в системі до засобів защит що використовують прив'язку до заліза. Зараз я вам покажу як за допомогою 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 (ссылка
vakulovski vakulovski
vakulovski vakulovski

Темный вечер, посиделки

Вот, товарищи, и настало долгожданное 23 февраля!
Праздник, да и праздник это великий! Не каждый день однако "день защитника")))
Давно я не писал в своем блоге, восстанавливаю, так сказать, справедливость.
Все мы, патриоты и Россию любим, поэтому и защищаем.

Расскажу, как прошел вечер с сослуживцами.
Встретились часа в 2 дня у приморского парка победы. Сначала была культурная программа - сходили на концерт посвященный афганцам, а потом уже отправились, что называется,  "за стол". Слава Богу, никто в этот раз не напился)). Я вон даже раньше всех домой отправился, потому что с женой и детьми надо еще попраздновать... Детей патриотизму поучить!
Ну что ж, друзья, доброго вам времени!


настроение: Боевое

Метки: 23 февраля, победа, сражение, война