Zigrund 0 14 октября, 2010 Опубликовано 14 октября, 2010 · Жалоба Здравствуйте. Помогите пожалуйста с получение серийного номера жёсткого диска. Получить серийный номер тома у меня дулаось успешно, а вот с диском возникла проблема. Может подскажете ссылочку на работающии отрывки программ. Пока таких не нашёл. Заранее спасибо. Буду рад любому совету. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 14 октября, 2010 Опубликовано 14 октября, 2010 · Жалоба По первой ссылке :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 14 октября, 2010 Опубликовано 14 октября, 2010 · Жалоба По первой ссылке :) Спасибо. Я эту прогу уже смотрел. Что-то как-то она у меня не заработала. Точнее не полностью. Я получение серийника на билдере писал, там всё успешно работало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 14 октября, 2010 Опубликовано 14 октября, 2010 · Жалоба Что именно не заработало? У работает, правда не у всех HDD серийник извлекается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 15 октября, 2010 Опубликовано 15 октября, 2010 · Жалоба Что именно не заработало? У работает, правда не у всех HDD серийник извлекается. Ещё раз проверил. Как раз серийник ине извлекается, а он мне - то и нужен. Есть какой-нибудь другой способ? Я нашёл ещё один, там тоже не извлекается серийник. Спасибо. Подскажите пожалуйста ещё чего-нибудь) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 15 октября, 2010 Опубликовано 15 октября, 2010 · Жалоба Видимо не все HDD отдают свой серийник через WMI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 15 октября, 2010 Опубликовано 15 октября, 2010 · Жалоба Видимо не все HDD отдают свой серийник через WMI. Вот моя прожка на C++. Работа отлично. #include "Unit1.h" #include <stdlib.h> #include <stdio.h> #include <stddef.h> #include <string.h> #include <windows.h> #include <winioctl.h> #include <WinIoCtl.h> #define IDE_ATAPI_IDENTIFY 0xA1 #define DFP_GET_VERSION 0x00074080 #define IDE_ATA_IDENTIFY 0xEC #define DFP_RECEIVE_DRIVE_DATA 0x0007C088 AnsiString GetHDDSerial(void) { char HardDriveSerialNumber [1024]; // здесь будет храниться наш SN HardDriveSerialNumber[0] = 0; BYTE bIDCmd; // крманда IDE или ATAPI IDENTIFY SENDCMDINPARAMS scip; // см MSDN для описания USHORT *pIdSector; // указатель на адрес сектора HDD, в котором хранится разная полезная инфа =) GETVERSIONINPARAMS VP; // см MSDN для описания int i; // номер диска BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS)+512-1]; DWORD br; // байт прочтено char NamePhysicalDisk[256]; memset((void*)&VP,0,sizeof(VP)); // выделяем памаять под переменную VP //-------------------------------------------------------------------------- //определяем номер физического диска на котором лежит приложение //-------------------------------------------------------------------------- AnsiString FileName; int DevNum = -1; char F[2024]; GetModuleFileName(HInstance,F,2023); FileName.printf("\\\\.\\%c:",F[0]); HANDLE hDisk = CreateFile(FileName.c_str(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHAR E_WRITE,NULL,OPEN_EXISTING,0,NULL); if(hDisk != INVALID_HANDLE_VALUE) { STORAGE_DEVICE_NUMBER dInfo; DWORD Ret; if(DeviceIoControl (hDisk, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &dInfo, sizeof (dInfo), &Ret, NULL)) DevNum = dInfo.DeviceNumber; CloseHandle (hDisk); } //-------------------------------------------------------------------------- //Определяеем серийный номер физического диска //-------------------------------------------------------------------------- if(DevNum >= 0) { i = DevNum; sprintf(NamePhysicalDisk,"\\\\.\\PHYSICALDRIVE%d",i); HANDLE hDisk = CreateFile(NamePhysicalDisk,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHAR E_WRITE,NULL,OPEN_EXISTING,0,NULL); // создаем хэндл диска PHYSICALDRIVEX - номер диска 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]; // нужные нам данные pIdSector = (USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer; // получаем указатель на сектор for (int ijk = 0; ijk < 256; ijk++) diskdata [ijk] = pIdSector [ijk]; // заполняем наши данные strncpy(HardDriveSerialNumber,ConvertToString(diskdata,10,19),1023); // конвертируем в строку SN HardDriveSerialNumber[1023] = 0; } } } } CloseHandle(hDisk); } } AnsiString ResultTempStr = ""; if(HardDriveSerialNumber[0]) ResultTempStr.printf("%s",HardDriveSerialNumber); return ResultTempStr; } // ф-я конвертирования в строку данных char *ConvertToString(DWORD diskdata [256],int firstIndex,int lastIndex) { static char string [1024]; int index; 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; } Может поможете переделать на C# или есть что-то на нём подобно. Сегодня весь день интет листал. МАк адрес уже получил, а ID жёсткого нет. Была написана на скорую руку и работала удачно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 15 октября, 2010 Опубликовано 15 октября, 2010 · Жалоба На C# можно вызывать WinApi функци непосредственно. Описания самих функций и структур есть на http://www.pinvoke.net/. Там-же примеры их использования. Муторное это дело WinApi на шарпе пользовать, но межет получиться. А можно написать отдельную DotNet сборку на С++. Наружу будет торчать DotNet класс, который легко из шарпа использовать, а внутри делай, что хочешь на С++. Так будет даже проще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость TSerg 15 октября, 2010 Опубликовано 15 октября, 2010 · Жалоба http://home.earthlink.net/~akonshin/delphi_ru.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 20 октября, 2010 Опубликовано 20 октября, 2010 · Жалоба Спасибо. попробую воспользоваться вашими советами) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться