Скачать MetaTrader 5

Как узнать серийный номер HDD тома или всего диска используя WinAPI из MQL4.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nefedov Kirill
2899
Nefedov Kirill  
Очередной оригинальный замысел, вопрос в теме.

Из того что накопал в сети, написал следующее:

#import "kernel32.dll"
bool GetVolumeInformationA( string pRootPathName, 
                           string pVolumeNameBuffer,
                           int nVolumeNameSize,
                           int pVolumeSerialNumber,
                           int pMaximumComponentLength,
                           int pFileSystemFlags,
                           string pFileSystemNameBuffer,
                           int nFileSystemNameSize);
#import
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
string hdd = StringConcatenate("HDD: ", GetVolumeInformationA( "C:\\", "SPACE(256)", 256, 0, 256, 0, "SPACE(256)", 256));
Print (hdd);
//----
   return(0);
  }
Результат выдаёт число НУЛЬ.

Подскажите как правильно применить данную функцию из WinAPI, желательно рабочим кодом с комментариями.

А для проверки того что выводится правильно, вот исходники на Delphi
Файлы:
ideinfo2.zip 60 kb
Andrey Dik
12486
Andrey Dik  
Защиту что бы делать?
Не знаю как помочь, но тоже интересно.
Комбинатор
16805
Комбинатор  
Судя по описанию, те параметры, которые пробелами должны быть lvalue, т.е. надо явно завести массивы под них
Nefedov Kirill
2899
Nefedov Kirill  
TheXpert >>:
Судя по описанию, те параметры, которые пробелами должны быть lvalue, т.е. надо явно завести массивы под них

Я недопонимаю пока еще WinAPI и как правильно с ним работать. Поэтому ляпаю из того что найду в сети из кодов С++, Delphi и тут помощи прошу у знающих людей.

А применение естественно для защиты, да и тему эту пока еще никто не освещал на форуме.

o_o
Модератор
24759
o_o  
я как то тоже копал про "аппаратные" защиты. Но они неоднозначные.
ID продуктов может меняться от банального подсоединения USB устройства.
Nefedov Kirill
2899
Nefedov Kirill  
sergeev >>:
я как то тоже копал про "аппаратные" защиты. Но они неоднозначные.
ID продуктов может меняться от банального подсоединения USB устройства.

Так Важно узнать не серийный номер раздела, а серийник винта. Серийник винта прописывается на заводе.
SofTAA
408
SofTAA  
Судя по описанию(http://msdn.microsoft.com/en-us/library/aa364993(VS.85).aspx) функцию объявлять нужно так:
bool GetVolumeInformationA( string pRootPathName, 
                            string pVolumeNameBuffer,
                            int nVolumeNameSize,
                            int pVolumeSerialNumber[],
                            int pMaximumComponentLength[],
                            int pFileSystemFlags[],
                            string pFileSystemNameBuffer,
                            int nFileSystemNameSize);
	
o_o
Модератор
24759
o_o  
и тогда от меня тоже правки :)

bool GetVolumeInformationA(
        string lpRootPathName,
        string &lpVolumeNameBuffer,
        int nVolumeNameSize,
        int &lpVolumeSerialNumber[],
        int &lpMaximumComponentLength[],
        int &lpFileSystemFlags[],
        string &lpFileSystemNameBuffer,
        int nFileSystemNameSize);
Комбинатор
16805
Комбинатор  
#import "kernel32.dll"
bool GetVolumeInformationA( string pRootPathName, 
                           string& pVolumeNameBuffer,
                           int nVolumeNameSize,
                           int pVolumeSerialNumber[],
                           int pMaximumComponentLength[],
                           int pFileSystemFlags[],
                           string& pFileSystemNameBuffer,
                           int nFileSystemNameSize);
#import
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   string spaces128 = "                                                                                                                                ";
   string pathName = spaces128 + spaces128;
   string nameBuffer = spaces128 + spaces128 + " "; // лучше разное кол-во пробелов -- помнится была проблема.

   int serial[1]; serial[0] = 0;
   int length[1];
   int flags[1];

   //----
   if (GetVolumeInformationA( "C:\\", pathName, 256, serial, length, flags, nameBuffer, 257))
   {
      Print (serial[0]);
   }
   else Print("failed");
   
   //----
   return(0);
}
На правильность не претендую, но вроде пашет. На скорую руку, поэтому напильником работать и работать.
Christo Tsvetanov
990
Christo Tsvetanov  
TheXpert писал(а) >>
На правильность не претендую, но вроде пашет.


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

Комбинатор
16805
Комбинатор  
Itso >>:

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

Это не серийный номер веника, но раздела. Именно он обычно и используется. С остальным согласен. Правда можно наоборот...

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий