Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Генерация Hardware ID


volser ©   (2005-04-17 15:31:00) 

Как можно сгенерировать Hardware ID?


VMcL   (2005-04-21 10:46:00) [1]

>> dmitry501 ©   (21.04.05 05:26) [16]

> Специально посмотрел мануалы от Intel по cpuid

Вот это другой разговор.

> Лучше заменить команду ... тогда будет использована 1 функция, и значение будет разным для разных ядер процессора.

Более корректно было бы вызвать функцию 80000000H, чтобы выяснить максимальный номер поддерживаемой функции. А потом можно, например, пробежаться по всем функциям и вычислить контрольную сумму всех возвращаемых ими значений. Тогда получится что-то относительно уникальное для разных процессоров. Я привёл простейший пример в [4], [5].


dmitry501   (2005-04-21 05:26:00) [2]

VMcL ©   (20.04.05 13:37) [15]
Специально посмотрел мануалы от Intel по cpuid
ftp://download.intel.com/support/processors/procid/24161815.pdf
Да, я был неправ по поводу блокировки в БИОС CPUID. Блокируется serial number, т.е. 3 функция CPUID.
p.s. Ваш пример использует 0 режим функции, которая позволяет определить только производителя процессора и число других поддерживаемых режимов CPUID. Т.е. для любого процессора от Интел она будет возвращать "GenuineIntel" в EBX, EDX, ECX, а в EAX максимальный номер поддерживаемой функции CPUID. Лучше заменить команду
xor     eax, eax
cpuid

на
mov     eax, 01H
cpuid

тогда будет использована 1 функция, и значение будет разным для разных ядер процессора.


VMcL   (2005-04-20 13:37:00) [3]

>> dmitry501 ©   (20.04.05 09:49) [14]

Да что Вы говорите? А ну бегом читать мануалы от Intel'а, чтобы узнать, что же именно можно отключить в BIOS'е.


dmitry501   (2005-04-20 09:49:00) [4]

volser   (19.04.05 16:20) [12]
И CPUID отключается во многих биосах :) Так что это тоже не гарантия.


VMcL   (2005-04-19 19:33:00) [5]

>> volser   (18.04.05 22:59) [6]

> Только на счет совместимости я не совсем понял, на каких машинах будет работать, а на каких нет.

В соответствии с мануалом от Интела это можно узнать с помощью следующей функции (если я не ошибся в алгоритме):

function ExistsCpuId: Boolean;
asm
               pushfd
               push    ebx

               pushfd                  // Save EFLAGS to stack
               pop     eax             // Store EFLAGS in EAX
               mov     ebx, eax        // Save in EBX for testing later
               xor     eax, 00200000h  // Switch bit 21
               push    eax             // Copy changed value to stack
               popfd                   // Save changed EAX to EFLAGS
               pushfd                  // Push EFLAGS to top of stack
               pop     ecx             // Store EFLAGS in ECX
               xor     eax, eax        // Result := False
               cmp     ecx, ebx        // See if bit 21 has changed
               jz      @@Exit          // If no change, no CPUID
               inc     eax             // Result := True

 @@Exit:       pop     ebx
               popfd
end;


P.S.
The ID flag (bit 21) in the EFLAGS register indicates support for the CPUID instruction. If a software procedure can set and clear this flag, the processor executing the procedure supports the CPUID instruction.


volser   (2005-04-19 16:20:00) [6]

Но МАК то поменять можно


Чапаев   (2005-04-19 12:21:00) [7]

> Про нее не спрашивали ;)
Дык вот же:
>> Мне надо что бы для одной и той же кофигурации железа (мамка, >> жесткий, сетевуха т.д.)


Alex Konshin   (2005-04-19 11:13:00) [8]

Про нее не спрашивали ;)


Чапаев   (2005-04-19 10:41:00) [9]

> только HDD имеет S/N, остальное - либо не имеет, либо нет API.
У сетевухи MAC-адрес можно условно приравнять к SN...


volser   (2005-04-19 09:37:00) [10]

Спасибо, понял!


Alex Konshin   (2005-04-19 02:04:00) [11]

Поищи по форуму. Уже достало каждую неделю на один и тот же вопрос отвечать. Кратко: из того, что ты хочешь, только HDD имеет S/N, остальное - либо не имеет, либо нет API.


volser   (2005-04-18 22:59:00) [12]

>VMcL
У меня с асмом не сильно сложилось :-)
Я так понял это зависит только от CPUID
Только на счет совместимости я не совсем понял, на каких машинах будет работать, а на каких нет.

И можно ли узнать так же MotherboardID, HDD ID (всех),  Video Card ID?


VMcL   (2005-04-18 21:00:00) [13]

Sorry, EBX тоже нужно сохранять:

procedure GetHardwareID(out AHid: THID);
asm
 push    esi
 push    ebx
 mov     esi, eax
 xor     eax, eax
 cpuid
 mov     [esi], eax
 mov     [esi + 4], ebx
 mov     [esi + 8], ecx
 mov     [esi + 12], edx
 pop     ebx
 pop     esi
end;


VMcL   (2005-04-18 20:58:00) [14]

Ну, например, так:

type
 THID = packed array [0 .. 3] of LongWord;

procedure GetHardwareID(out AHid: THID);
asm
 push    esi
 mov     esi, eax
 xor     eax, eax
 cpuid
 mov     [esi], eax
 mov     [esi + 4], ebx
 mov     [esi + 8], ecx
 mov     [esi + 12], edx
 pop     esi
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 H: THID;
begin
 FillChar(H, SizeOf(H), 0);
 GetHardwareID(H);
 ShowMessageFmt('Hardware ID: %.4x%.4x%.4x%.4x', [H[0], H[1], H[2], H[3]]);
end;


P.S. Совместимость: в соответствии с описанием команды CPUID.


volser   (2005-04-18 20:21:00) [15]

Мне надо что бы для одной и той же кофигурации железа (мамка, жесткий, сетевуха т.д.) выдавало идин и тот же ID.

 Random (MaxInt)
 Ctrl+Shift+G
Это не подходит


Gero   (2005-04-17 19:45:00) [16]

Ctrl+Shift+G


Просто Джо   (2005-04-17 19:43:00) [17]

function GetHardwareID: Integer;
begin
 Result := Random (MaxInt)
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо