> Is there such thing as unique number on each Intel Pentium CPUs?
Only Intel Pentium 3 (and a few mobile Pentium 2) processors have a unique
serial number on each chip. However, it can be (and usually is) disabled by
the user in the BIOS settings. Intel dropped the feature in Pentium 4
because it was not widely accepted and caused a lot of controversy with
privacy advocates.
> If so how can we read that number within BCB?
Code:
(Untested):
#pragma pack(push, 1)
struct TCPUID
{
DWORD Version;
DWORD Other;
DWORD ExtendedFeatures;
DWORD Features;
};
#pragma pack(pop)
#pragma option push -w-
void __fastcall CPU_ID(TCPUID* CpuID)
{
__asm
{
PUSH EBX
PUSH EDI
MOV EDI, EAX
MOV EAX,1
DW 0xA20F
STOSD
MOV EAX, EBX
STOSD
MOV EAX, ECX
STOSD
MOV EAX, EDX
STOSD
POP EDI
POP EBX
}
}
void __fastcall CPU_Serial(unsigned __int64* SerialNumber)
{
__asm
{
PUSH EBX
PUSH EDI
MOV EDI, EAX
MOV EAX, 3
DW 0xA20F
MOV EAX, ECX
STOSD
MOV EAX, EDX
STOSD
POP EDI
POP EBX
}
}
bool IsCPUIDAvailable(void)
{
__asm
{
PUSHFD
POP EAX
MOV EDX, EAX
XOR EAX, 0x00200000
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX, EDX
SHR EAX, 21
}
}
bool GetCPUSerialNumber(unsigned __int64 *SerialNumber)
{
*SerialNumber = 0;
if( IsCPUIDAvailable() )
{
TCPUID CpuID;
memset(&CpuID, 0, sizeof(TCPUID));
CPU_ID(&CpuID);
if( CpuID.Features & 0x00040000 )
{
CPU_Serial(SerialNumber);
return true;
}
}
return false;
}
#pragma option pop
Then you can call it like this:
__int64 SerialNumber = 0;
if( GetCPUSerialNumber(&SerialNumber) )
// use serial number as needed...
Gambit