![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Генерация 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;