# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال >  درباره CPUID

## Bahmany

سلام می خواستم بدونم که چگونه میتوان CPUID را بدست آورد  
- آیا CPUID برای تمامی کامپیوتر ها متفاوت است :لبخندساده 

با تشکر 
----------------------------------------------------------------------------------

----------


## mzjahromi

اگه یه جستجو کنی تو این زمینه بحث شده
ولی اگه تونستی یه CPUID پیدا کنی که برای سیستمهای 64 بیتی هم جواب بده و همیشه یک ID رو برگردونه به من هم بده

----------


## پدرخوانده

من از dll مربوطه به نرم افزار پرولاک (البته نسخه دمو) دارم استفاده می کنم (که قابلیت برگرداندن cpu id) را دارد
و با توجه به سطح تبلیغات و ... قفل بعید می دونم که دارای چنین اشکالی (درست برنگردان cpu id رو سری 64 بیتی) باشد 
(البته من روی یک سیستم  2.8 اتلون 64 بیتی چک کردم و نرمال بود) (البته باید روی سیستم های 64 بیتی دیگر چک کنم ببینم آیا خروجی مشابه دارد یا خیر) ولی در کل بعید می دونم چنین مشکلی داشته باشد

----------


## Bahmany

من خیلی Search کرده ام الان لینکش رو بهتون معرفی می کنم  تستش کنید

----------


## Bahmany

بدبختی این همه پول ندارم ؟؟؟!!!!!!!!!

----------


## Bahmany

http://www.experts-exchange.com/Prog..._20803727.html
این هم یک کامپوننت
http://www.lohninger.com/cpuid.html
اینها رو حتما تست کنید

----------


## پدرخوانده

برای استفاده از نسخه دمو نیاز به هزینه ای که نیست  :لبخند گشاده!:  
 ولی برای راحتی بیشتر با اجازه آقای کرامتی من dll مربوطه به همراه مثال دلفی آن را اینجا آپلود کردم خواستید دانلود کنید

----------


## Bahmany

مرصی این رو حتما تست میکنم

----------


## babak869

اینو ببین به کارت میاد؟
موفق باشید

----------


## پدرخوانده

آقا بابک من نمونه برنامه شما را روی چند سیستم مختلف چک کردم
بر روی سری سیستم های intel تقریبا اکثر پارامترها یکی است (حتی شماره سریال) و بعضا شماره Brand Id و Brand String( تعیین کننده سرعت سی پی یو) متفاوت بود (3 سیستم)
و بر روی سری سیستم های AMD (sempron,atholn) نیز اکثر پارامترها که برابر صفر بود و شماره سریال نیز که از شش قسمت تشکیل شده به استثنای ستون دوم تمامی صفر بود و بر روی دو سیستم به غیر از دو پارامتر فوق ID,String, برابر بود (2 سیستم)

----------


## arash_a

چرا این شماره سریال CPU پیدا نمی شه .
من خودم خیلی دنبالش گشتم و یا درست کار نمی کردن و یا Trial بودن !!
یعنی از بچه های سایت هیشکی اینو نداره !!!؟؟؟؟
 :ناراحت:

----------


## دنیای دلفی

بهترین روش برای ساختن و ایجاد یک شماره سریال منحصر بفرد شماره سریال سخت افزاری HardDisk است اگر کسی کامپوننت با سورسش رو میخواد به من Pm بده

----------


## Bahmany

لینک هایی که گذاشتم چطور بود    رو همه دستگاهها

----------


## پدرخوانده

برنامه ایی که گذاشتم (همون نسخه دموی برنامه پرولاک) مشکلی ندارد (یعنی دی ال ال مربوطه به بازگرداندن آی دی شماره پردازشگر ربطی به اصل داستان (دموی بودن برنامه) ندارد و از این قسمت شما به راحتی می تونید استفاده کنید و از همین پارامتر جهت تست قفل (البته با الگوریتم خودتان) استفاده کنید (مثلا برنامه پرولاک با توجه به شماره کد اصل محصول (برنامه) و شماره سریال نصب برنامه و شماره سی پی یو مربوطه یک شماره به عنوان اکتیو کد به کاربر (مصرف کننده برنامه) می دهد و از ترکیب سه عدد اول (طبق یک الگوریتم ریاضی خاص) خروجی (عدد اکتیو کد) را مشخص می کند)

لینک های شما (آقای بهرامی) را هم دیدم ولی سیستم های مختلف نداشتم که چک کنیم باید دید روی سیستمهای 64 بیتی (xeon - athon, sempron (soket 754( ) ببینم درست جواب می دهد یا خیر؟

ولی برنامه آقا بابک که مشکل داشت!!!!
در رابطه با  شماره سریال هارد نیز تا اونجایی که برنامه های متفاوت رو دیدم معمولا روی هاردهای ساتا یا اسکازی مشکل دارند و ... به تازگی نیز خود آقای کرامتی برنامه جدیدی را برای این منظور داشتند تست می کردند (در سایت قرار دادند تا بچه ها آزمایش کنند) آیا شما برنامه خودتان را روی هاردهای مختلف تست کرده اید.

----------


## SalarSoft

من از این کد استفاده کردم و جواب داده:


const
 ID_BIT=$200000; (** EFLAGS ID bit **)
type
 TCPUIDARRAY=array[1..4] of Longint;
 TVendor=array [0..11] of char;


function IsCPUID_Available : Boolean;register;
function GetCPUID : TCPUIDARRAY;register;
function GetCPUVendor : TVendor;register;
Function GetCpuSerial:int64;

implementation

(****************************)
Function GetCpuSerial:int64;
var
  _eax, _ebx, _ecx, _edx: Longword; 
  i: Integer; 
  b: Byte; 
  s, s1, s2: string;
begin 

  asm                //asm call to the CPUID inst. 
    mov eax,0         //sub. func call 
    db $0F,$A2         //db $0F,$A2 = CPUID instruction 
    mov _ebx,ebx 
    mov _ecx,ecx 
    mov _edx,edx 
  end; 

  for i := 0 to 3 do   //extract vendor id 
  begin 
    b := lo(_ebx); 
    s := s + chr(b); 
    b := lo(_ecx); 
    s1:= s1 + chr(b); 
    b := lo(_edx); 
    s2:= s2 + chr(b); 
    _ebx := _ebx shr 8; 
    _ecx := _ecx shr 8; 
    _edx := _edx shr 8; 
  end; 

  asm 
    mov eax,1 
    db $0F,$A2 
    mov _eax,eax 
    mov _ebx,ebx 
    mov _ecx,ecx 
    mov _edx,edx 
  end; 
  //s := IntToHex(_eax, 8);
  asm                  //determine the serial number 
    mov eax,3 
    db $0F,$A2 
    mov _ecx,ecx 
    mov _edx,edx 
  end; 
  //s1 := IntToHex(_edx, 8);
  //s2 := IntToHex(_ecx, 8);
  //label1.Caption:=s + s1 + s2;
  Result:=_eax+_edx+_ecx;
end;

function IsCPUID_Available : Boolean;assembler;register;
asm
  PUSHFD							{direct access to flags no possible, only via stack}
  POP     EAX					{flags to EAX}
  MOV     EDX,EAX			{save current flags}
  XOR     EAX,ID_BIT	{not ID bit}
  PUSH    EAX					{onto stack}
  POPFD								{from stack to flags, with not ID bit}
  PUSHFD							{back to stack}
  POP     EAX					{get back to EAX}
  XOR     EAX,EDX			{check if ID bit affected}
  JZ      @exit				{no, CPUID not availavle}
  MOV     AL,True			{Result=True}
@exit:
end;

(*************************************************  *****************************)

function GetCPUID : TCPUIDARRAY; assembler;register;
asm
  PUSH    EBX         {Save affected register}
  PUSH    EDI
  MOV     EDI,EAX     {@Resukt}
  MOV     EAX,1
  DW      $A20F       {CPUID Command}
  STOSD			          {CPUID[1]}
  MOV     EAX,EBX
  STOSD               {CPUID[2]}
  MOV     EAX,ECX
  STOSD               {CPUID[3]}
  MOV     EAX,EDX
  STOSD               {CPUID[4]}
  POP     EDI					{Restore registers}
  POP     EBX
end;

(*************************************************  *****************************)

function GetCPUVendor : TVendor; assembler;register;
asm
  PUSH    EBX					{Save affected register}
  PUSH    EDI
  MOV     EDI,EAX			{@Result (TVendor)}
  MOV     EAX,0
  DW      $A20F				{CPUID Command}
  MOV     EAX,EBX
  XCHG		EBX,ECX     {save ECX result}
  MOV			ECX,4
@1:
  STOSB
  SHR     EAX,8
  LOOP    @1
  MOV     EAX,EDX
  MOV			ECX,4
@2:
  STOSB
  SHR     EAX,8
  LOOP    @2
  MOV     EAX,EBX
  MOV			ECX,4
@3:
  STOSB
  SHR     EAX,8
  LOOP    @3
  POP     EDI					{Restore registers}
  POP     EBX
end;

----------


## mzjahromi

با CPU های 64 بیتس تست کردید؟
کسی امکان تست با CPU های 64 بیتی رو داره؟

----------


## دنیای دلفی

کامپوننت من روی تمامی هارد دیسکها ساتا - اسکازی - IDE- رید , ور غیره و روی تمامی ویندوزها جواب می دهد منحصر بفرد و به همراه سورس وقت کردم یک نمونه برنامه Upload می کنم

----------


## mzjahromi

امکانش هست برای من Email بزنید؟
mzjahromi@hotmail.com

----------


## Bahmany

برنامه بالا روی بعضی کامپیوتر ها کد یکسان میده

----------


## arash_a

پس چی شد یه Components و یا سورس برای یه کد منحصربفرد پیدا نشد ؟؟؟

----------


## ramin_mash

سلام
از فایلی  که پدر خوانده تحت عنوان ProlockWithDelphiExample.zipگذاشته چه جوری باید استفاده کنم؟
یه پیغام error میده
ممنون

----------


## Dolphin

> کامپوننت من روی تمامی هارد دیسکها ساتا - اسکازی - IDE- رید , ور غیره و روی تمامی ویندوزها جواب می دهد منحصر بفرد و به همراه سورس وقت کردم یک نمونه برنامه Upload می کنم


دوست من مورد نیاز است Email: mousasol@gmail.com لطف می فرمائید چطوری دریافت کنم

----------


## پدرخوانده

مشکلی در مثال ارائه شده نیست ولی تا اونجایی که می دونم (قبلا تو یکی از تایپیکی چنین بحثی راجع به قفل پرولاک شده بود) جهت جلوگیری از هر گونه دیباگ کردن و ... در محیط داخلی برنامه نویسی نمی توان آن را اجرا کرد ولی بعد از کامپایل فایل اجرایی آن را اجرا کنید 
(خط مربوط به کنترل قفل را غیرفعال کرده و بعد از نوشتن کل برنامه و رفع اشکال و... جهت قفل گذاری خط موردنظر را فعال کنید و از فایل اجرایی آن را استفاده کنید)
البته همانطور که قبلا گفتم شما می تونید فقط از dll مربوط به بازیابی عدد cpu این برنامه (نسخه نمایشی) استفاده کنید و اگر بخواهید از الگورتیم و کل قفل موردنظر استفاده کنید که باید نسخه موردنیاز آن را تهیه کنید (سایت نوین رسانه)
http://www.barnamenevis.org/sh...ad.php?t=34221

----------


## پدرخوانده

چندی قبل با مشکلی نسبت به بازیابی شماره سریال انحصاری برای هر سیستم مواجه شدم که معمولا همکاران از این قابلیت برای گذاشتن قفل و ... استفاده می کنند
که با توجه به تجربه قبلی (گذشته) از برنامه بازیابی شماره سریال برنامه پرولاک استفاده می کردم
ولی متاسفانه در مواردی دریافتم که این فایل نیز در برخی از سیستم ها دارای عدد بازیابی ثابت (تکراری) است لذا بر آن شدم که تحقیقی نسبت به برنامه های مختلف که در این مقوله هستند بکنم و برنامه های موجود در همین سایت و سایت های دیگر (چه اصلی چه دمو و... که حداقل قابلیت تست را داشتند که می توانستند نسبت به کلیات عملکردشان مطلع شوید) 
خوشبختانه در همین سایت موارد بسیاری یافتم 
سورس و dll مربوط به بازیابی شماره سریال از آقای پالیز (بخش وی بی)
سورس مربوط به بازیابی شماره سریال سی پی یو مربوط به آقای سالارسافت 
سورس شماره سریال سی پی یو کاربر babak869
فایل اجرایی برنامه آقای دنیای دلفی (که سورس بدون کامپونت آن را در سایت قرار داده اند)
dll مربوط به برنامه پرولاک
برنامه اجرایی ارائه شده توسط آقای کرامتی در سایت جهت تست توسط بچه های سایت برای بدست آوردن شماره سریال هارد 
و ..... موارد بسیاری دیگری که از سایتهای مختلف جمع آوری کرده بودم.
و بعد از تبدیل موارد سورس و ... به حالت اجرایی 
آن را در یک سایت (که دارای مجموعه حدود 20 سیستم مشابه و متفاوت با هاردهای مختلف (ساتا و ...) و همچنین دو مورد نوت بوک) تست کردم
متاسفانه تمامی برنامه ها دارای اشکالات و ایراداتی بودند که در کل باعث عدم اعتماد به آنها شد 
بطور نمونه تمامی برنامه هایی که شماره سریال سی پی یو را برمی گرداندند در سیستم های مشابه عددی ثابت را برمی گرداند. (این مساله با تست تمامی موارد (توابع) موجود در این سورس ها بوده (مثلا در سورس نمونه آقای سالارسافت و یا آقا بابک چندین تابع و... برای این منظور که هرکدام مقدار برگشتی خاصی داشتند (شماره سریال - شماره آی دی و...) همه توابع چک شدند) )
و در مورد برنامه های شماره سریال هارد نیز چندین مورد که فکر کنم برنامه های قدیمی بودند نیز دارای چنین اشکالی بودند که بحثی ندارند
و در برخی از آنها نیز اصلا خروجی برنمی گرداند. 
ولی در مورد برنامه آقای دنیای دلفی مشکلی که بود این است که در برخی از موارد شماره سریال را نمی داد (یعنی مورد تکراری نداشت ولی در برخی سیستم ها پارامترهای مختلف هارد (سایز, کلاستر, مدل , ...) را مشخص می کرد و لی شماره سریال را مشخص نمی کرد)
و دیگر اینکه با توجه به نوع اتصال هارد به سیستم (MASTER, SLAVE, PRIMIAY, SECONDRY,...)  از تنظیمات مختلف باید استفاده کرد  یعنی قبل از چک مقدار پارامتر شماره سریال هارد باید بصورت کدنویسی نوع اتصال هارد موردنظر (که برنامه بر روی آن قرار است نصب شود) را باید تشخیص داد . (درنظر بگیرید که چندین هارد بر روی سیستم هست و پارتیشن موردنظر ما در هارد چهارم (SLAVE SENCODRY) نصب می باشد )

به هر حال دوست داشتم نظر همکاران محترم را نسبت به بدست آوردن یک پاسخ مناسب نسبت به این مقوله را بدست آوریم.
(شاید که هر کدام از دوستان دارای سورس و برنامه ایی خاصی برای این منظور هستند و از آن نیز مدتها استفاده کرده اند و مشکلی برخورد نکرده اند (ولی شاید این عدم برخورد به اشکال از عدم وجود سیستم های مشابه و یا سیستم های که دارای تجهیزات سخت افزاری خاص (مثال انواع نوت بوک) نبودند ولذا تصور بر سالم بودن برنامه اشان دارند) ) به هر حال اگر کسی به جواب مطلوبی رسید (با توجه به تست برنامه ها بر روی سیستم های مختلف ) ممنون میشم ما را هم مطلع نمایید

----------


## linux

Imports System
Imports System.Management
Imports System.Windows.Forms
Namespace WMISample
    Public Class MyWMIQuery
        Public Overloads Shared Function Main() As Integer
            Try
                Dim searcher As New ManagementObjectSearcher( _
                    "root\CIMV2", _
                    "SELECT * FROM Win32_Processor") 
                For Each queryObj As ManagementObject in searcher.Get()
                    Console.WriteLine("-----------------------------------")
                    Console.WriteLine("Win32_Processor instance")
                    Console.WriteLine("-----------------------------------")
                    Console.WriteLine("AddressWidth: {0}", queryObj("AddressWidth"))
                    Console.WriteLine("Architecture: {0}", queryObj("Architecture"))
                    Console.WriteLine("Availability: {0}", queryObj("Availability"))
                    Console.WriteLine("Caption: {0}", queryObj("Caption"))
                    Console.WriteLine("ConfigManagerErrorCode: {0}", queryObj("ConfigManagerErrorCode"))
                    Console.WriteLine("ConfigManagerUserConfig: {0}", queryObj("ConfigManagerUserConfig"))
                    Console.WriteLine("CpuStatus: {0}", queryObj("CpuStatus"))
                    Console.WriteLine("CreationClassName: {0}", queryObj("CreationClassName"))
                    Console.WriteLine("CurrentClockSpeed: {0}", queryObj("CurrentClockSpeed"))
                    Console.WriteLine("CurrentVoltage: {0}", queryObj("CurrentVoltage"))
                    Console.WriteLine("DataWidth: {0}", queryObj("DataWidth"))
                    Console.WriteLine("Description: {0}", queryObj("Description"))
                    Console.WriteLine("DeviceID: {0}", queryObj("DeviceID"))
                    Console.WriteLine("ErrorCleared: {0}", queryObj("ErrorCleared"))
                    Console.WriteLine("ErrorDescription: {0}", queryObj("ErrorDescription"))
                    Console.WriteLine("ExtClock: {0}", queryObj("ExtClock"))
                    Console.WriteLine("Family: {0}", queryObj("Family"))
                    Console.WriteLine("InstallDate: {0}", queryObj("InstallDate"))
                    Console.WriteLine("L2CacheSize: {0}", queryObj("L2CacheSize"))
                    Console.WriteLine("L2CacheSpeed: {0}", queryObj("L2CacheSpeed"))
                    Console.WriteLine("LastErrorCode: {0}", queryObj("LastErrorCode"))
                    Console.WriteLine("Level: {0}", queryObj("Level"))
                    Console.WriteLine("LoadPercentage: {0}", queryObj("LoadPercentage"))
                    Console.WriteLine("Manufacturer: {0}", queryObj("Manufacturer"))
                    Console.WriteLine("MaxClockSpeed: {0}", queryObj("MaxClockSpeed"))
                    Console.WriteLine("Name: {0}", queryObj("Name"))
                    Console.WriteLine("OtherFamilyDescription: {0}", queryObj("OtherFamilyDescription"))
                    Console.WriteLine("PNPDeviceID: {0}", queryObj("PNPDeviceID"))
                    If queryObj("PowerManagementCapabilities") Is Nothing Then
                        Console.WriteLine("PowerManagementCapabilities: {0}", queryObj("PowerManagementCapabilities"))
                    Else
                        Dim arrPowerManagementCapabilities As UInt16()
                        arrPowerManagementCapabilities = queryObj("PowerManagementCapabilities")
                        For Each arrValue As UInt16 In arrPowerManagementCapabilities
                            Console.WriteLine("PowerManagementCapabilities: {0}", arrValue)
                        Next
                    End If
                    Console.WriteLine("PowerManagementSupported: {0}", queryObj("PowerManagementSupported"))
                    Console.WriteLine("ProcessorId: {0}", queryObj("ProcessorId"))
                    Console.WriteLine("ProcessorType: {0}", queryObj("ProcessorType"))
                    Console.WriteLine("Revision: {0}", queryObj("Revision"))
                    Console.WriteLine("Role: {0}", queryObj("Role"))
                    Console.WriteLine("SocketDesignation: {0}", queryObj("SocketDesignation"))
                    Console.WriteLine("Status: {0}", queryObj("Status"))
                    Console.WriteLine("StatusInfo: {0}", queryObj("StatusInfo"))
                    Console.WriteLine("Stepping: {0}", queryObj("Stepping"))
                    Console.WriteLine("SystemCreationClassName: {0}", queryObj("SystemCreationClassName"))
                    Console.WriteLine("SystemName: {0}", queryObj("SystemName"))
                    Console.WriteLine("UniqueId: {0}", queryObj("UniqueId"))
                    Console.WriteLine("UpgradeMethod: {0}", queryObj("UpgradeMethod"))
                    Console.WriteLine("Version: {0}", queryObj("Version"))
                    Console.WriteLine("VoltageCaps: {0}", queryObj("VoltageCaps"))
                Next
            Catch err As ManagementException
                MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
            End Try
        End Function
    End Class
End Namespace

از این کد برای بدست آوردن کلیه اطلاعات مربوط به cpu می توانید استفاده کنید

----------


## sadegh_shz

> بهترین روش برای ساختن و ایجاد یک شماره سریال منحصر بفرد شماره سریال سخت افزاری HardDisk است اگر کسی کامپوننت با سورسش رو میخواد به من Pm بده




:lotf konid component ba sorsesh ra baram befrestid

----------


## Knophler

جناب پدرخوانده DLL پرولاک که دادید فعلا فکر کنم بهتر از بقیه باشه خواستم بابت معرفیش ازتون تشکر کرده باشم. مشخصاتی سیستم هایی که پرولاک نیز کد یکسان برگرداند در چه مواردی یکسان بود؟

شاید اگر عدد پرولاک رو با کدهای دیگه مثلاً پرولاک چهار رقمی(چهاررقم هست دیگه؟) + شماره سریال هارد بعلاوه تعداد درایوها بعلاوه دو رقم آخر سریال سی پی یو + دو حرف اول کامپیوترنیم ترکیب کنیم دیگه مشکلی نداشته باشیم :دی هر چند که آخرش تبدیل به یک شرط مقایسه در اسمبلی میشه و کراکر به راحتی اون رو تغییر میده حالا هر کدی که باشه 
با این حال به از هیچیه

----------

