Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зарегистрируйся на MQL5.community, чтобы опубликовать тему на форуме
Nefedov Kirill
2889
Nefedov Kirill 2010.04.09 12:50 
Очередной оригинальный замысел, вопрос в теме.

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

#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
11285
Andrey Dik 2010.04.09 13:00  
Защиту что бы делать?
Не знаю как помочь, но тоже интересно.
Комбинатор
15923
Комбинатор 2010.04.09 13:36  
Судя по описанию, те параметры, которые пробелами должны быть lvalue, т.е. надо явно завести массивы под них
Nefedov Kirill
2889
Nefedov Kirill 2010.04.09 13:45  
TheXpert >>:
Судя по описанию, те параметры, которые пробелами должны быть lvalue, т.е. надо явно завести массивы под них

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

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

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

Так Важно узнать не серийный номер раздела, а серийник винта. Серийник винта прописывается на заводе.
SofTAA
408
SofTAA 2010.04.09 13:53  
Судя по описанию(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
Модератор
23694
o_o 2010.04.09 14:08  
и тогда от меня тоже правки :)

bool GetVolumeInformationA(
        string lpRootPathName,
        string &lpVolumeNameBuffer,
        int nVolumeNameSize,
        int &lpVolumeSerialNumber[],
        int &lpMaximumComponentLength[],
        int &lpFileSystemFlags[],
        string &lpFileSystemNameBuffer,
        int nFileSystemNameSize);
Комбинатор
15923
Комбинатор 2010.04.09 14:09  
#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 2010.04.09 14:18  
TheXpert писал(а) >>
На правильность не претендую, но вроде пашет.


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

Комбинатор
15923
Комбинатор 2010.04.09 14:20  
Itso >>:

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

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

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