Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Определение серийного номера материнской платы   Найти похожие ветки 

 
M@Rt   (2004-02-02 17:38) [0]

Подскажите как можно определить серийный номер материнской платы для 9х/w2k/XP, очень бы хотелось с примером.


 
DC-AC   (2004-02-03 07:50) [1]

M@Rt : а ты уверен, что у твоей MB он есть ? Найди в инете какой-нибудь софт (хоть Sandra, хоть любой SMBUS-монитор), который тебе его покажет. Вот тогда и поговорим дальше.


 
M@Rt   (2004-02-03 11:31) [2]

А разве при загрузке Биос не выдает дату биоса и серийный номер?


 
Anatoly Podgoretsky ©   (2004-02-03 11:38) [3]

Дату выдает, а серийный номер не выдает, поскольку нечего выдавать. Только два или три производителя материнских плат поддерживают серийный номер, это Dell, Compaq и еще кто то.


 
M@Rt   (2004-02-03 11:46) [4]

DC-AC, Anatoly Podgoretsky
Спасибо за объяснение, тогда может подскажите что кроме харда имеет обязательно серийный номер который вшит внутрь железеза, и который можно прочитать (например видеокарта) И как можно прочитать этот серийный номер (желательно не через реестр).


 
alexey_ar   (2004-02-03 13:54) [5]

А вот не надо ля-ля, я не видел ни одной матери со времен 386, которая бы при показе заставки биоса (там где список IDE-устройств, инфа о протзводителе биоса и тест памяти) не выводила в нижней строке надписи
"Press <...> to enter bios"
"yy//mm//dd-**********"
где ***** - это строчка из ~10 букв и цифр, которую я одинаковой у двух компов не видел. Давайте эту строчку назовем условно серийником матери (биоса?).
Внимание, вопрос! Эту строчку на любой матери в любой операционке (95/NT) выводит aida32 и некоторые другие проги. Хочется уметь считывать ее для лицензирования проги. Известно, что под Win95/98/ME ее можно получить просто строчкой как PChar($FEC71). КАК ПОЛУЧИТЬ ЭТУ СТРОЧКУ - СЕРИЙНИК МАТЕРИ (БИОСА?) ИЗ ПОД WIN2000/XP?


 
NightAngel ©   (2004-02-03 15:12) [6]

> КАК ПОЛУЧИТЬ ЭТУ СТРОЧКУ - СЕРИЙНИК МАТЕРИ (БИОСА?)


unit GetBiosInformation;

interface

uses windows, Sysutils;

type
 PRomBiosDump = ^TRomBiosDump;
 TRomBiosDump = array [$000F0000..$000FFFFF] of Byte;

type
 TReadRomBiosMethod = (
   rrbmAutomatic,
   rrbmGeneric,
   rrbmMemory,
   rrbmPhysical
 );

type
 NTSTATUS = Integer;

type
 PUnicodeString = ^TUnicodeString;
 TUnicodeString = packed record
   Length: Word;
   MaximumLength: Word;
   Buffer: PWideChar;
 end;

type
 PObjectAttributes = ^TObjectAttributes;
 TObjectAttributes = record
   Length: ULONG;
   RootDirectory: THandle;
   ObjectName: PUnicodeString;
   Attributes: ULONG;
   SecurityDescriptor: PSecurityDescriptor;
   SecurityQualityOfService: PSecurityQualityOfService;
 end;

type
 TFNZwOpenSection = function(out SectionHandle: THandle;
   DesiredAccess: ACCESS_MASK; ObjectAttributes: PObjectAttributes):
NTSTATUS;
   stdcall;
 TFNRtlNtStatusToDosError = function(Status: NTSTATUS): DWORD; stdcall;

type
 PRomDumpCodeInfo = ^TRomDumpCodeInfo;
 TRomDumpCodeInfo = (rdciStart, rdciEnd, rdciSize);

const
 STATUS_SUCCESS = NTSTATUS(0);
 STATUS_INVALID_HANDLE = NTSTATUS($C0000008);
 STATUS_ACCESS_DENIED = NTSTATUS($C0000022);

 RomBiosDateOffset = Pointer($000FFFF5);
 RomBiosNameOffset = Pointer($000FE061);
 RomBiosCopyrightOffset = Pointer($000FE091);
 RomBiosIdOffset = Pointer($000FEC71);

 OBJ_INHERIT = $00000002;
 OBJ_PERMANENT = $00000010;
 OBJ_EXCLUSIVE = $00000020;
 OBJ_CASE_INSENSITIVE = $00000040;
 OBJ_OPENIF = $00000080;
 OBJ_OPENLINK = $00000100;
 OBJ_KERNEL_HANDLE = $00000200;
 OBJ_VALID_ATTRIBUTES = $000003F2;

 ObjectPhysicalMemoryDeviceName = "\Device\PhysicalMemory";
 ObjectPhysicalMemoryName: TUnicodeString = (
   Length: Length(ObjectPhysicalMemoryDeviceName) * 2;
   MaximumLength: Length(ObjectPhysicalMemoryDeviceName) * 2 + 2;
   Buffer: ObjectPhysicalMemoryDeviceName;
 );
 ObjectPhysicalMemoryAccessMask: ACCESS_MASK = SECTION_MAP_READ;
 ObjectPhysicalMemoryAttributes: TObjectAttributes =(
   Length: SizeOf(TObjectAttributes);
   RootDirectory: 0;
   ObjectName: @ObjectPhysicalMemoryName;
   Attributes: OBJ_CASE_INSENSITIVE;
   SecurityDescriptor: nil;
   SecurityQualityOfService: nil;
 );

 ntdll = "ntdll.dll";

var
 ZwOpenSection: TFNZwOpenSection;
 RtlNtStatusToDosError: TFNRtlNtStatusToDosError;

function ReadRomBios(var Dump: TRomBiosDump; Method: TReadRomBiosMethod;
 Timeout: DWORD = INFINITE): Boolean;
function ReadRomBios9x(var Buffer: TRomBiosDump): Boolean;
function ReadRomBios16(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean;
function ReadRomBiosNt(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean;
function DirectoryExists(const Dir: string): Boolean;
function _RomDumpCodeToFile(const Filename: string): Boolean;
function _RomDumpCodeExecute(const Com, Dmp: string; Timeout: DWORD):
Boolean;
function _RomDumpCode(Info: TRomDumpCodeInfo): Pointer;
function GetRomBiosString(const Dump: TRomBiosDump; Address: Pointer):
string;


 
NightAngel ©   (2004-02-03 15:13) [7]

implementation

function ReadRomBios(var Dump: TRomBiosDump; Method: TReadRomBiosMethod;
 Timeout: DWORD = INFINITE): Boolean;
begin
 Result := False;
 case Method of
   rrbmAutomatic:
     if (Integer(GetVersion) < 0) then
     try
       Result := ReadRomBios9x(Dump);
     except
       Result := ReadRomBios16(Dump, Timeout);
     end
     else
       Result := ReadRomBiosNt(Dump, Timeout);
   rrbmGeneric:
     Result := ReadRomBios16(Dump, Timeout);
   rrbmMemory:
     Result := ReadRomBios9x(Dump);
   rrbmPhysical:
     Result := ReadRomBiosNt(Dump, Timeout);
 else
   SetLastError(ERROR_INVALID_PARAMETER);
 end;
end;

function ReadRomBios9x(var Buffer: TRomBiosDump): Boolean;
begin
 Result := False;
 try
   FillChar(Buffer, SizeOf(TRomBiosDump), 0);
   Move(Pointer(Low(TRomBiosDump))^, Buffer, SizeOf(TRomBiosDump));
   Result := True;
 except
 end
end;

function ReadRomBios16(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean;
const
 TempSub = "~RomDmp";
 ComName = "RomDump.com";
 DmpName = "Rom.dmp";
var
 TempPath: string;
 TempDir: string;
 TempIdx: Integer;
 TempIdxStr: string;
 ComFile: string;
 DmpFile: string;
 DmpHandle: THandle;
 Written: DWORD;
begin
 Result := False;
 SetLength(TempPath, MAX_PATH);
 SetLength(TempPath, GetTempPath(MAX_PATH, PChar(@TempPath[1])));
 if Length(TempPath) > 0 then
 begin
   if (TempPath[Length(TempPath)] <> "\") then
     TempPath := TempPath + "\";
   TempIdx := 0;
   repeat
     Inc(TempIdx);
     Str(TempIdx, TempIdxStr);
     TempDir := TempPath + TempSub + TempIdxStr;
   until not DirectoryExists(TempDir);
   if CreateDirectory(PChar(TempDir), nil) then
   try
     TempDir := TempDir + "\";
     ComFile := TempDir + ComName;
     DmpFile := TempDir + DmpName;
     if _RomDumpCodeToFile(ComFile) then
     try
       if _RomDumpCodeExecute(ComFile, DmpFile, Timeout) then
       begin
         DmpHandle := CreateFile(PChar(DmpFile), GENERIC_READ,
           FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
         if DmpHandle <> INVALID_HANDLE_VALUE then
         try
           FillChar(Buffer, SizeOf(TRomBiosDump), 0);
           Result := ReadFile(DmpHandle, Buffer, SizeOf(TRomBiosDump),
             Written, nil) and (Written = SizeOf(TRomBiosDump));
         finally
           CloseHandle(DmpHandle);
         end;
       end;
     finally
       DeleteFile(PChar(DmpFile));
       DeleteFile(PChar(ComFile));
     end;
   finally
     RemoveDirectory(PChar(TempDir));
   end;
 end;
end;

function ReadRomBiosNt(var Buffer: TRomBiosDump; Timeout: DWORD): Boolean;
var
 NtLayer: HMODULE;
 Status: NTSTATUS;
 Section: THandle;
 View: Pointer;
begin
 Result := False;
 NtLayer := GetModuleHandle(ntdll);
 if NtLayer = 0 then
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
 else
 begin
   if not Assigned(ZwOpenSection) then
     ZwOpenSection := GetProcAddress(NtLayer, "ZwOpenSection");
   if not Assigned(RtlNtStatusToDosError) then
     RtlNtStatusToDosError := GetProcAddress(NtLayer,
"RtlNtStatusToDosError");
   if not (Assigned(ZwOpenSection) and
Assigned(RtlNtStatusToDosError)) then
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
   else
   begin
     Status := ZwOpenSection(Section, ObjectPhysicalMemoryAccessMask,
       @ObjectPhysicalMemoryAttributes);
     case Status of
       STATUS_SUCCESS:
         try
           View := MapViewOfFile(Section,
ObjectPhysicalMemoryAccessMask, 0,
             Low(TRomBiosDump), SizeOf(TRomBiosDump));
           if Assigned(View) then
           try
             FillChar(Buffer, SizeOf(TRomBiosDump), 0);
             Move(View^, Buffer, SizeOf(TRomBiosDump));
             Result := True;
           finally
             UnmapViewOfFile(View);
           end;
         finally
           CloseHandle(Section);
         end;
       STATUS_ACCESS_DENIED:
         Result := ReadRomBios16(Buffer, Timeout);
     else
       SetLastError(RtlNtStatusToDosError(Status))
     end;
   end;
 end;
end;

function DirectoryExists(const Dir: string): Boolean;
var
 Attr: DWORD;
begin
 Attr := GetFileAttributes(PChar(Dir));
 Result := (Attr <> $FFFFFFFF) and
   (Attr and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY);
end;

function _RomDumpCodeToFile(const Filename: string): Boolean;
var
 ComFile: THandle;
 Size: Cardinal;
begin
 Result := False;
 ComFile := CreateFile(PChar(Filename), GENERIC_WRITE,
FILE_SHARE_READ, nil,
   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 if ComFile <> INVALID_HANDLE_VALUE then
 try
   Result := WriteFile(ComFile, _RomDumpCode(rdciStart)^,
     Cardinal(_RomDumpCode(rdciSize)), Size, nil) and
     (Size = Cardinal(_RomDumpCode(rdciSize)));
   if not Result then
     DeleteFile(PChar(Filename));
 finally
   CloseHandle(ComFile);
 end;
end;

function _RomDumpCodeExecute(const Com, Dmp: string; Timeout: DWORD):
Boolean;
var
 ComSpec: string;
 si: TStartupInfo;
 pi: TProcessInformation;
begin
 Result := False;
 SetLength(ComSpec, MAX_PATH);
 SetLength(ComSpec,
   GetEnvironmentVariable("ComSpec", PChar(@ComSpec[1]), MAX_PATH));
 if Length(ComSpec) > 0 then
 begin
   FillChar(si, SizeOf(TStartupInfo), 0);
   si.cb := SizeOf(TStartupInfo);
   si.dwFlags := STARTF_USESHOWWINDOW;
   si.wShowWindow := SW_HIDE;
   if CreateProcess(nil, PChar(ComSpec + " /C " + Com + " > " + Dmp),
     nil, nil, False, CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP, nil,
     nil, si, pi) then
   try
     Result := WaitForSingleObject(pi.hProcess, Timeout) <> WAIT_TIMEOUT;
   finally
     CloseHandle(pi.hProcess);
     CloseHandle(pi.hThread);
   end;
 end;
end;

function _RomDumpCode(Info: TRomDumpCodeInfo): Pointer;
var
 CodeStart: Pointer;
 CodeEnd: Pointer;
begin
 asm
         JMP @@End

 @@Start:
         XOR eDX, eDX
         MOV DH, 0F0h
         MOV DS, eDX
         XOR eDX, eDX
         XOR eCX, eCX
         DEC eCX
         XOR eBX, eBX
         INC eBX
         MOV AH, 40h
         INT 21h
         JC @@Exit
         XOR eDX, eDX
         MOV DH, 0F0h
         MOV DS, eDX
         XOR eDX, eDX
         DEC eDX
         XOR eCX, eCX
         INC eCX
         MOV eBX, eCX
         MOV AH, 40
         INT 21h
         JC @@Exit
         MOV AL, 0
 @@Exit:
         MOV AH, 4Ch
         INT 21h
 @@End:

         MOV CodeStart, OFFSET @@Start
         MOV CodeEnd, OFFSET @@End
 end;
 case Info of
   rdciStart:
     Result := CodeStart;
   rdciEnd:
     Result := CodeEnd;
   rdciSize:
     Result := Pointer(Cardinal(CodeEnd) - Cardinal(CodeStart));
 else
   Result := nil;
 end;
end;

function GetRomBiosString(const Dump: TRomBiosDump; Address: Pointer):
string;
begin
 Result := "";
 if (Cardinal(Address) >= Low(TRomBiosDump)) and
   (Cardinal(Address) <= High(TRomBiosDump)) then
   Result := string(PChar(@Dump[Cardinal(Address)]));
end;

end.


 
M@Rt   (2004-02-03 18:13) [8]

NightAngel
Извини конечно, но ещё один вопрос, а как эту инфу вывести в файлик, именно нужные переменные, я пока что не понял в какой переменной окажется серийник материнки (точнее биоса)


 
DeadMeat ©   (2004-02-03 19:22) [9]

> [8] M@Rt   (03.02.04 18:13)
А может тебе ещё рано этим заниматься... Лучше возми готовые компоненты, если хочешь защитить свою прогу от копирования... Поищи на Torry, обязательно чего-нибудь наёдешь...


 
DC-AC   (2004-02-04 08:13) [10]

alexey_ar  : это т.н. BIOS Extended Info. У двух одинаковых MB (можешь мне поверить, я проверял на участке сборки компов на старой работе) эти строчки АБСОЛЮТНО одинаковы !


 
M@Rt   (2004-02-04 10:23) [11]

DeadMeat
Скорей всего что рано, просто это надо не для защиты программы а для создания уникального номера на основе данных о компьютере, может есть у кого то более удачные идеи,то подскажите в каком направлении копать.


 
Alex Konshin ©   (2004-02-04 10:32) [12]

MAC Address сетевой платы?


 
M@Rt   (2004-02-04 11:14) [13]

а если у человека нет сетевой карты?


 
Alex Konshin ©   (2004-02-04 11:25) [14]

А если нет винчестера?


 
M@Rt   (2004-02-04 14:28) [15]

Подскажите тогда хотя бы где в реестре хранится серийный номер видеокарты


 
DC-AC   (2004-02-04 15:21) [16]

Если он и где-нибудь есть (в чипе, видеобиосе, etc), то с вероятностью 99%, что его нельзя получить программно без обращения к производителю оборудования.
Название видеокарты - можно.
function GetVideoVendor: String;
var lpDisplayDevice: TDisplayDevice;
begin
lpDisplayDevice.cb := Sizeof(lpDisplayDevice);
EnumDisplayDevices(nil, 0, lpDisplayDevice , 0);
Result:=lpDisplayDevice.DeviceString;
end;
Так пойдёт ?


 
M@Rt   (2004-02-04 16:46) [17]

DC-AC
Спасибо



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.038 c
14-1082547606
Knight
2004-04-21 15:40
2004.04.11
Можно ли редактировать набор кнопок в диалогах сохранения...


14-1079869850
YurikGl
2004-03-21 14:50
2004.04.11
Уже спам рекламируют


3-1081334604
BigError
2004-04-07 14:43
2004.04.11
QuantumGrid (cxGrid) и выделение.


6-1079458114
mbgmz
2004-03-16 20:28
2004.04.11
Есть ди способы подключиться к MySQL базе напрямую.


14-1079488343
vidiv
2004-03-17 04:52
2004.04.11
Как скрыть код php?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский