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

 
Очередной оригинальный замысел, вопрос в теме.

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

#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
 
Защиту что бы делать?
Не знаю как помочь, но тоже интересно.
 
Судя по описанию, те параметры, которые пробелами должны быть lvalue, т.е. надо явно завести массивы под них
 
TheXpert >>:
Судя по описанию, те параметры, которые пробелами должны быть lvalue, т.е. надо явно завести массивы под них

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

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

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

Так Важно узнать не серийный номер раздела, а серийник винта. Серийник винта прописывается на заводе.
 
Судя по описанию(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);
	
 
и тогда от меня тоже правки :)

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


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

 
Itso >>:

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

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

Причина обращения: