PDA

View Full Version : سوال: پیدا کردن کد اختصاصی مین برد



mahian90
چهارشنبه 02 شهریور 1390, 00:05 صبح
سلام دوستان

چطور میشه کد اختصاصی مین برد رو برای هر کامپیوتر پیدا کرد که با تقریبا همه مدل های مین برد کار کنه؟

pop123
چهارشنبه 02 شهریور 1390, 01:12 صبح
تا اونجایی که من میدونم معمولا این اطلاعات در 8kb اول حافظه BIOS قرار دارد حالا با کد زیر می تونید 256kb اول رو بخونید و تبدیل به Text کنید و از اون استفاده کنید.


function GetBiosInfoAsText: string;
var
p, q: pchar;
begin
q := nil;
p := PChar(Ptr($FE000));
repeat
if q <> nil then begin
if not (p^ in [#10, #13, #32..#126, #169, #184]) then begin
if (p^ = #0) and (p - q >= then begin
Result := Result + TrimRight(String(q)) + #13#10;
end;
q := nil;
end;
end else
if p^ in [#33..#126, #169, #184] then
q := p;
inc(p);
until p > PChar(Ptr($FFFFF));
Result := TrimRight(Result);
end;

karimim
چهارشنبه 02 شهریور 1390, 12:25 عصر
تا اونجایی که من میدونم معمولا این اطلاعات در 8kb اول حافظه BIOS قرار دارد حالا با کد زیر می تونید 256kb اول رو بخونید و تبدیل به Text کنید و از اون استفاده کنید.


function GetBiosInfoAsText: string;
var
p, q: pchar;
begin
q := nil;
p := PChar(Ptr($FE000));
repeat
if q <> nil then begin
if not (p^ in [#10, #13, #32..#126, #169, #184]) then begin
if (p^ = #0) and (p - q >= then begin
Result := Result + TrimRight(String(q)) + #13#10;
end;
q := nil;
end;
end else
if p^ in [#33..#126, #169, #184] then
q := p;
inc(p);
until p > PChar(Ptr($FFFFF));
Result := TrimRight(Result);
end;


کد نوشته شده کامل نیست، لطفا تصحیح کنید.
با تشکر

mahian90
چهارشنبه 02 شهریور 1390, 15:51 عصر
تا اونجایی که من میدونم معمولا این اطلاعات در 8kb اول حافظه BIOS قرار دارد حالا با کد زیر می تونید 256kb اول رو بخونید و تبدیل به Text کنید و از اون استفاده کنید.


function GetBiosInfoAsText: string;
var
p, q: pchar;
begin
q := nil;
p := PChar(Ptr($FE000));
repeat
if q <> nil then begin
if not (p^ in [#10, #13, #32..#126, #169, #184]) then begin
if (p^ = #0) and (p - q >= then begin
Result := Result + TrimRight(String(q)) + #13#10;
end;
q := nil;
end;
end else
if p^ in [#33..#126, #169, #184] then
q := p;
inc(p);
until p > PChar(Ptr($FFFFF));
Result := TrimRight(Result);
end;

سلام
ممنون از اینکه پاسخ دادید.

من از کدتون چیزی نفهمیدم یه قسمتشم کم بود و نمیشد کامپایل کرد.

اگه کدو تو یه سورس برام بزارید ممنون میشم

BORHAN TEC
چهارشنبه 02 شهریور 1390, 17:20 عصر
کد بالا کار نمیکنه و خطای AV می ده. در حال حاضر بعید است که کد بالا کاربردی داشته باشد.
شما برای بدست آوردن شماره سریال motherboard می توانید از کد زیر استفاده کنید:
uses
{SysUtils, Variants, }ActiveX, ComObj;

function GetWMIstring(wmiHost, root, wmiClass, wmiProperty: string): string;
var
objWMIService: OLEVariant;
colItems: OLEVariant;
colItem: OLEVariant;
oEnum: IEnumvariant;
iValue: LongWord;

function GetWMIObject(const objectName: String): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx; // for access to a bind context
Moniker: IMoniker; // Enables you to use a moniker object
begin
OleCheck(CreateBindCtx(0, BindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten,
Moniker)); // Converts a string into a moniker that identifies the object named by the string
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
// Binds to the specified object
end;

begin
objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s', [wmiHost, root]));
colItems := objWMIService.ExecQuery(Format('SELECT * FROM %s', [wmiClass]),
'WQL', 0);
oEnum := IUnknown(colItems._NewEnum) as IEnumvariant;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
Result := colItem.Properties_.Item(wmiProperty, 0); // you can improve this code ;) , storing the results in an TString.
end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
str1: string;
begin
str1 := GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard', 'SerialNumber');
ShowMessage(str1);
end;
البته باز هم باید توجه داشته باشید که همه مادربوردها مستقیماً شماره سریال ندارند. پس با این تفاسیر چگونه ما میتوانیم شماره سریال مادربورد را بدست آوریم؟
جواب: برای این کار شما می توانید مشخصات مختلف مادربورد را در کنار هم قرار دهید که با این کار شما می توانید مقدار یکتایی را بدست آوردید. (فکر می کنم که نرم افزار Everest نیز از همین روش استفاده می کند).

mahian90
چهارشنبه 02 شهریور 1390, 18:12 عصر
سلام

خیلی خیلی ممنون ازتون.

همین کدی که قرار دادید که برای هر مین برد یکتاست. درسته؟

BORHAN TEC
چهارشنبه 02 شهریور 1390, 18:17 عصر
نه کدی که من قرار دادم برای همه مادر بورد ها یکتا نیست ولی با اون روشی که گفتم می تونید یک کد یکتا را بدست بیاورید که با ضریب بسیار بسیار بالایی (بیش از 99.99%) یکتاست.

mahian90
چهارشنبه 02 شهریور 1390, 21:34 عصر
نه کدی که من قرار دادم برای همه مادر بورد ها یکتا نیست ولی با اون روشی که گفتم می تونید یک کد یکتا را بدست بیاورید که با ضریب بسیار بسیار بالایی (بیش از 99.99%) یکتاست.


اون مشخصات دیگه رو چطور باید بدست بیارم؟

BORHAN TEC
چهارشنبه 02 شهریور 1390, 22:50 عصر
اون مشخصات دیگه رو چطور باید بدست بیارم؟
به کد زیر که قسمتی از برنامه بالا بود دقت کنید:
GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard', 'SerialNumber');
به جای پارامتر چهارم می توانید از موارد دیگری که در صفحه زیر وجود دارد استفاده کنید:
http://msdn.microsoft.com/en-us/library/aa394072(v=vs.85).aspx