PDA

View Full Version : درباره CPUID



Bahmany
شنبه 26 آذر 1384, 21:04 عصر
سلام می خواستم بدونم که چگونه میتوان CPUID را بدست آورد
- آیا CPUID برای تمامی کامپیوتر ها متفاوت است :لبخندساده

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

mzjahromi
یک شنبه 27 آذر 1384, 08:27 صبح
اگه یه جستجو کنی تو این زمینه بحث شده
ولی اگه تونستی یه CPUID پیدا کنی که برای سیستمهای 64 بیتی هم جواب بده و همیشه یک ID رو برگردونه به من هم بده

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

Bahmany
یک شنبه 27 آذر 1384, 17:42 عصر
من خیلی Search کرده ام الان لینکش رو بهتون معرفی می کنم تستش کنید

Bahmany
یک شنبه 27 آذر 1384, 17:56 عصر
بدبختی این همه پول ندارم ؟؟؟!!!!!!!!!

Bahmany
یک شنبه 27 آذر 1384, 17:58 عصر
http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20803727.html
این هم یک کامپوننت
http://www.lohninger.com/cpuid.html
اینها رو حتما تست کنید

پدرخوانده
دوشنبه 28 آذر 1384, 09:30 صبح
برای استفاده از نسخه دمو نیاز به هزینه ای که نیست :لبخند:
ولی برای راحتی بیشتر با اجازه آقای کرامتی من dll مربوطه به همراه مثال دلفی آن را اینجا آپلود کردم خواستید دانلود کنید

Bahmany
سه شنبه 29 آذر 1384, 17:41 عصر
مرصی این رو حتما تست میکنم

babak869
چهارشنبه 30 آذر 1384, 17:52 عصر
اینو ببین به کارت میاد؟
موفق باشید

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

arash_a
جمعه 02 دی 1384, 07:25 صبح
چرا این شماره سریال CPU پیدا نمی شه .
من خودم خیلی دنبالش گشتم و یا درست کار نمی کردن و یا Trial بودن !!
یعنی از بچه های سایت هیشکی اینو نداره !!!؟؟؟؟
:ناراحت:

دنیای دلفی
شنبه 03 دی 1384, 21:24 عصر
بهترین روش برای ساختن و ایجاد یک شماره سریال منحصر بفرد شماره سریال سخت افزاری HardDisk است اگر کسی کامپوننت با سورسش رو میخواد به من Pm بده

Bahmany
شنبه 03 دی 1384, 22:38 عصر
لینک هایی که گذاشتم چطور بود رو همه دستگاهها

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

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

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

SalarSoft
یک شنبه 04 دی 1384, 16:07 عصر
من از این کد استفاده کردم و جواب داده:



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
دوشنبه 05 دی 1384, 08:43 صبح
با CPU های 64 بیتس تست کردید؟
کسی امکان تست با CPU های 64 بیتی رو داره؟

دنیای دلفی
دوشنبه 05 دی 1384, 10:04 صبح
کامپوننت من روی تمامی هارد دیسکها ساتا - اسکازی - IDE- رید , ور غیره و روی تمامی ویندوزها جواب می دهد منحصر بفرد و به همراه سورس وقت کردم یک نمونه برنامه Upload می کنم

mzjahromi
دوشنبه 05 دی 1384, 10:06 صبح
امکانش هست برای من Email بزنید؟
mzjahromi@hotmail.com

Bahmany
سه شنبه 13 دی 1384, 18:57 عصر
برنامه بالا روی بعضی کامپیوتر ها کد یکسان میده

arash_a
شنبه 17 دی 1384, 01:02 صبح
پس چی شد یه Components و یا سورس برای یه کد منحصربفرد پیدا نشد ؟؟؟

ramin_mash
شنبه 17 دی 1384, 08:47 صبح
سلام
از فایلی که پدر خوانده تحت عنوان ProlockWithDelphiExample.zipگذاشته چه جوری باید استفاده کنم؟
یه پیغام error میده
ممنون

Dolphin
یک شنبه 18 دی 1384, 23:07 عصر
کامپوننت من روی تمامی هارد دیسکها ساتا - اسکازی - IDE- رید , ور غیره و روی تمامی ویندوزها جواب می دهد منحصر بفرد و به همراه سورس وقت کردم یک نمونه برنامه Upload می کنم

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

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

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

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

linux
یک شنبه 31 اردیبهشت 1385, 14:53 عصر
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
شنبه 23 آذر 1387, 16:48 عصر
بهترین روش برای ساختن و ایجاد یک شماره سریال منحصر بفرد شماره سریال سخت افزاری HardDisk است اگر کسی کامپوننت با سورسش رو میخواد به من Pm بده



:lotf konid component ba sorsesh ra baram befrestid

Knophler
شنبه 23 آذر 1387, 18:13 عصر
جناب پدرخوانده DLL پرولاک که دادید فعلا فکر کنم بهتر از بقیه باشه خواستم بابت معرفیش ازتون تشکر کرده باشم. مشخصاتی سیستم هایی که پرولاک نیز کد یکسان برگرداند در چه مواردی یکسان بود؟

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