Собственно, решил попрактиковаться в привязке программы к аппаратной части. Для начала решил попробовать к винчестеру. Больше вроде и не к чему привязывать. Подскажите функцию плиз... Если такая есть...
Clear_Energy, права половина голосов на твоей страничке .\ тебе лишь бы ляпнуть чёто! GetVolumeInformation("C:\\",buff,25,&VolumeSerialNo,&MaxComponentLength,&FileSystemFlags, FileSystemName,buff_len); и вот VolumeSerialNo будет твоим серийником.
Comer_ Она возвращает номер тома. После форматирования он будет другим. Так что это не привязка к аппаратной части. p.s. В МДСНе рекомендуют для получения номера диска назначенного производителем использовать WMI
Можешь попробовать привязать к hardware id usb флэшки - смотри в сторону SetupApi. Могу исходник привести (правда на дельфи ((
Код я нашёл, но он походу написан на Си... Попытался своими силами переписать его на МАСМ, вроде там видны процедуры, буферы... Но что-то не получается. Кто знает СИ, помогите плиз перевести его на МАСМ. ========================================= #include <stdlib.h> #include <stdio.h> #include <stddef.h> #include <string.h> #include <windows.h> #include <winioctl.h> char HardDriveSerialNumber [1024]; // здесь будет храниться наш SN CString GetHDDSerial() { BYTE bIDCmd = 0; // крманда IDE или ATAPI IDENTIFY SENDCMDINPARAMS scip; // см MSDN для описания USHORT *pIdSector; // указатель на адрес сектора HDD, в котором хранится разная полезная инфа =) GETVERSIONINPARAMS VP; // см MSDN для описания int i = 0; // номер диска BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS)+512-1]; DWORD br; // байт прочтено // выделяем памаять под переменную VP memset((void*)&VP,0,sizeof(VP)); // создаем хэндл диска PHYSICALDRIVEX - номер диска HANDLE hDisk = CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if ( hDisk != INVALID_HANDLE_VALUE ) { if (DeviceIoControl(hDisk,DFP_GET_VERSION,NULL,0,&VP,sizeof(VP),&br,NULL)) { if (VP.bIDEDeviceMap>0) { bIDCmd=(VP.bIDEDeviceMap>>i&0x10)?\ IDE_ATAPI_IDENTIFY:IDE_ATA_IDENTIFY; if ( bIDCmd == IDE_ATA_IDENTIFY ) { memset ( &scip, 0, sizeof(scip) ); memset ( IdOutCmd, 0, sizeof(IdOutCmd) ); scip.irDriveRegs.bFeaturesReg = 0; scip.irDriveRegs.bSectorCountReg = 1; scip.irDriveRegs.bSectorNumberReg = 1; scip.irDriveRegs.bCylLowReg = 0; scip.irDriveRegs.bCylHighReg = 0; scip.irDriveRegs.bDriveHeadReg = 0xA0 | ((i & 1) << 4); scip.irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY; scip.bDriveNumber = i; scip.cBufferSize = 512; if (DeviceIoControl(hDisk,DFP_RECEIVE_DRIVE_DATA, (LPVOID)&scip, sizeof(SENDCMDINPARAMS)-1, (LPVOID)IdOutCmd, sizeof(SENDCMDOUTPARAMS)+512-1, &br,NULL)) { DWORD diskdata [256]; // нужные нам данные int ijk = 0; pIdSector = (USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer; // получаем указатель на сектор for (ijk = 0; ijk < 256; ijk++) diskdata [ijk] = pIdSector [ijk]; // заполняем наши данные strcpy(HardDriveSerialNumber,ConvertToString(diskdata,10,19)); // конвертируем в строку SN return HardDriveSerialNumber; } } } } } return "Some Stupid Error"; } // ф-я конвертирования в строку данных char *ConvertToString(DWORD diskdata [256],int firstIndex,int lastIndex) { static char string [1024]; int index = 0; int position = 0; // each integer has two characters stored in it backwards for (index = firstIndex; index <= lastIndex; index++) { // get high byte for 1st character string [position] = (char) (diskdata [index] / 256); position++; // get low byte for 2nd character string [position] = (char) (diskdata [index] % 256); position++; } // end the string string [position] = '\0'; // cut off the trailing blanks for (index = position - 1; index > 0 && ' ' == string [index]; index--) string [index] = '\0'; return string; } ========================================================================
Комер, я конечно это могу изобразить на асме... Но вот люди говорят, что эта функция ( GetVolumeInformation) определяет не серийный номер винчестера, а номер логического диска, и после форматирования он изменится.
http://wasm.ru/baixado.php?mode=src&id=276 - загляни сюда. поиск как ни странно рулит со страшной силой!
Вот мой пример. Должен работать даже под урезанными правами. Переписывал это с примера на делфи, только не помню где его брал, да и исходник на делфи тоже не сохранился.
Вспомнил на каком сайте брал исходник: http://www.delphisources.ru/pages/faq/base/get_hdd_serial.html Вкладываю файл со структурами, правда там может быть ошибка, не помню исправлял я ее или нет.
TOLSTOPUZ Серийный номер харда прописан в его паспорте. Читаешь паспорт АТА-функцией ECh, переворачиваешь байтики - и серийник в твоих руках.
Clear_Energy возникло большое желание удалять большую часть твоих сообщений, которые не несут никакого смысла