(Конфе наверное тоже небезынтересно будет)
> Мне тут сегодня прислали исходник на С++ программульки, которая
> вытягивает заводские и физические данные из винтов под любой Виндой и
> правами пользователей (сам лично проверил, работает на 99,999%).
> Так как я плохо еще владею С++/Билдер, я взываю о помощи:
> помогите кто-нибудь, переведите исходник на Делфи рабочий вариант, что
> бы такая же прога была и на Делфи. Результат исходников обещаю
> выложить на все общее обозрение. Перевод с С++ на Делфи надо выполнить
> в ближайшие 2-3 дня, то бишь за выходные.
Feniks - приветствую! Не поделишься исходниками на С++ по определению
серийного номера винта? Если еще актуально, могу попробовать помочь
с переводом на Delphi
P.S. Ты не научился читать BIOS ID? У меня пока только следующие варианты:
1а. Win95 - чтение памяти напрямую, чтоб без Violation'ов лучше так:
if ReadProcessMemory(GetCurrentProcess, Pointer($FFFF5), @s[1], 8, n) then
...
1б. в Win2000 - если запустить DOS-приложение, оно может читать память BIOS
... var BiosDate: array[1..8] of Char absolute $F000:$FFF5 ...
WriteLn(BiosDate);
2а. Win95 - реестр: HKEY_LOCAL_MACHINE\Enum\Root\*PNP0C01\0000\BIOSDate
2б. WinNT - реестр:
HKEY_LOCAL_MACHINE\Hardware\Description\System\SystemBiosDate
2в. через WMI - но тоже читает из реестра...
3. можно еще писать драйвер, который сможет читать физическую память - но не
хочется..
http://www.compress.ru/Temp/1125/index.htm
4. остается читать из аппаратуры - как?
HardInfo 1.1 By Wang Jianhua на http://www.torry.net/systeminfo.htm умеет
P.P.S. Еще интересная инфа - как привязывается к компу Microsoft:
- серийный номер системного тома,
- MAC-адрес сетевой платы,
- идентификатор устройства чтения CD-ROM дисков,
- серийный номер процессор,
- идентификаторы графического адаптера,
- жесткого диска,
- адаптера SCSI,
- контроллера IDE,
- а также модели процессора
- и объема оперативной памяти.
- Кроме того, для переносных компьютеров проверятся возможность стыковки с
доком
http://www.itunion.ru/news/index.phtml?act=show&tid=4&fid=639
P.P.P.S. Возможно, будут интересны исходники для определения идентификатора
и
(с PIII) СЕРИЙНОГО номера процессора, тактовой частоты процессора
[вызывать CPUIdInfo и GetCPUSpeed]
{Флаг доступности процессора, идентификатор процессора, имя поставщика и
тип, семейство, модель, шаговость процессора, серийный номер, взятые
из идентификатора}
type
TCPUId = array[1..4] of DWORD;
TCPUVendor = array[0..11] of Char;
TCPUSerial = array[1..2] of DWORD;
TCPUSerialNumber = array[1..3] of DWORD;
TCPUIdInfo = record
IsAvailable: Boolean;
CPUId: TCPUId;
CPUVendor: TCPUVendor;
CPUType: Byte;
CPUFamily: Byte;
CPUModel: Byte;
CPUStepping: Byte;
IsSerialAvailable: Boolean;
CPUSerial: TCPUSerial;
CPUSerialNumber: TCPUSerialNumber;
end;
{Возвращает информацию об идентификаторе процессора, если CPUId, CPUSerial,
CPUSerialNumber недоступны, заполняет их числами $FF, остальные параметры
заполняет нулями}
function GetCPUIdInfo: TCPUIdInfo;
{Возвращает строку с информацией о процессоре вида:
Vendor:CPUVendor-CPUID-CPUSerial, например,
GenuineIntel-0000068A-00000002-00000000-0387F9FF-0000C30C-9C8895C0,
если информация недоступна, возвращает пустую строку}
function CPUIdInfoToStr(const Info: TCPUIdInfo): string;
{Возвращает CPUIdInfoToStr(GetCPUIdInfo)}
function CPUIdInfo: string;
{Возвращает примерную частоту процессора}
function GetCPUSpeed: Double;
function GetCPUIdInfo: TCPUIdInfo;
var
i: Integer;
{}
function IsCPUIdAvailable: Boolean; assembler;
const
ID_BIT = $200000; {EFLAGS ID bit}
asm
PUSHFD {access to flags - 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: TCPUId; assembler;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result}
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: TCPUVendor; assembler;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TCPUVendor)}
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;
{}
function GetSerial: TCPUSerial; assembler;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result}
MOV EAX,3
DW $A20F {CPUID Command}
MOV EAX,EDX
STOSD
MOV EAX,ECX
STOSD
POP EDI {Restore registers}
POP EBX
end;
{}
begin
FillChar(Result, 0, SizeOf(Result));
for i := Low(Result.CPUId) to High(Result.CPUId) do
Result.CPUId[i] := DWORD(-1);
for i := Low(Result.CPUSerial) to High(Result.CPUSerial) do
Result.CPUSerial[i] := DWORD(-1);
for i := Low(Result.CPUSerialNumber) to High(Result.CPUSerialNumber) do
Result.CPUSerialNumber[i] := DWORD(-1);
Result.IsAvailable := IsCPUIdAvailable;
if Result.IsAvailable then
begin
Result.CPUId := GetCPUId;
Result.CPUType := (Result.CPUId[1] shr 12) and $03;
Result.CPUFamily := (Result.CPUId[1] shr 8) and $0F;
Result.CPUModel := (Result.CPUId[1] shr 4) and $0F;
Result.CPUStepping := Result.CPUId[1] and $0F;
Result.CPUVendor := GetCPUVendor;
Result.IsSerialAvailable := (Result.CPUId[4] and $20000 <> 0);
if Result.IsSerialAvailable then
Result.CPUSerial := GetSerial;
Result.CPUSerialNumber[1] := Result.CPUId[1];
Result.CPUSerialNumber[2] := Result.CPUSerial[1];
Result.CPUSerialNumber[3] := Result.CPUSerial[2];
end;
end;
function CPUIdInfoToStr(const Info: TCPUIdInfo): string;
begin
if not Info.IsAvailable then
Result := ''
else
Result := Info.CPUVendor + '-' +
IntToHex(Info.CPUId[1], 8) + '-' +
IntToHex(Info.CPUId[2], 8) + '-' +
IntToHex(Info.CPUId[3], 8) + '-' +
IntToHex(Info.CPUId[4], 8) + '-' +
IntToHex(Info.CPUSerial[1], 8) + '-' +
IntToHex(Info.CPUSerial[2], 8);
end;
function CPUIdInfo: string;
begin
Result := CPUIdInfoToStr(GetCPUIdInfo);
end;
function GetCPUSpeed: Double;
const
DelayTime = 500;
var
timer_hi, timer_lo, prev_priority_class, prev_priority: DWORD;
begin
prev_priority_class := GetPriorityClass(GetCurrentProcess);
prev_priority := GetThreadPriority(GetCurrentThread);
try
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
DW 310Fh {RDTSC}
MOV timer_lo,EAX
MOV timer_hi,EDX
end;
Sleep(DelayTime);
asm
DW 310Fh {RDTSC}
SUB EAX,timer_lo
SBB EDX,timer_hi
MOV timer_lo,EAX
MOV timer_hi,EDX
end;
finally
SetThreadPriority(GetCurrentThread, prev_priority);
SetPriorityClass(GetCurrentProcess, prev_priority_class);
end;
Result := timer_lo / (1000 * DelayTime);
end;
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru