Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Информация о системе

Страницы: 1
Информация о системе
Хочу написать программу выводящую максимум информации о системе.
Интересует именно прямая работа с железом. Кто что знает подскажите, пожалуйста.


Заранее благодарю.
Если нужен Turbo Pascal и не собираетесь компилировать/запускать под Win32, а только под DOS, то вам нужно почитать про прямой доступ к памяти и прямой доступ к портам в Паскале.

В кратце, для прямой работы с памятью есть три предопределенных массива - Mem, MemW и MemL. Работают с ними так Mem[сегмент:смещение]. Mem - типа byte, MemW - word, MemL - longint.

Для портов два одномерных массива Port и PortW (byte и word). Когда присваиваем элементами массива Port или PortW значение - оно выводится в выбранный порт. А когда на элементы этих массивов имеются ссылки в выражениях, то значение вводится из заданного порта.
Андрей,
Это я и сам знаю. Меня интересует конкретика.
В какой области памяти что лежит, в какой порт что послать, что бы получить какую-то информацию и тд. и тп.
Вот, должно Вам пригодиться. Получение информации о жестком диске (IDE).

Код
{$IFDEF Windows}
  uses WinCrt;
{$ENDIF}
var
  InfoArray : array[0..255] of word;
  IdeInfo  : record
    Config    : word;
    CylsTotal : word;
    Unused    : word;
    HeadTotal : word;
    BPT       : word;
    BPS       : word;
    SPT       : word;
    Vendor    : array[0..2] of word;
    Serial    : array[1..20] of char;
    BufType   : Word;
    BufSize   : Word;
    ECC       : Word;
    Revision  : array[1..8] of char;
    Model     : array[1..40] of char;
  end absolute InfoArray;
  Count : byte;
  i : byte;
begin
  writeln('Информация о дисководах IDE:'^M^J);
{$IFDEF WINDOWS}
  for count := 1 to mem[$0040:$0075] do begin
{$ELSE}
  for count := 1 to mem[Seg0040:$0075] do begin
{$ENDIF}
    FillChar(InfoArray, SizeOf(InfoArray), 0);
    {Проверить готовность}
    while (port[$1F7] and $80<>0) do ;
    {Запретить прерывания}
    port[$3f6] := 2;
    port[$1f6] := $A0 + ((count-1) shl 4);
    port[$1f7] := $EC;
    {Проверить готовность}
    while (port[$1F7] and $80<>0) do ;
    {Получить информацию}
    for i := 0 to 255 do InfoArray[i] := swap(portw[$1F0]);
    {Напечатать информацию}
    writeln('Информация о физическом диске ',count-1,^M^J);
    with IdeInfo do begin
      writeln('Емкость неформатированная :', 9.5367431641E-7* {1/2^20}
        swap(BPT)*swap(CylsTotal)*swap(HeadTotal):5:0, 'Mb');
      writeln('Емкость форматированная   :',
        longint(swap(SPT))*swap(CylsTotal)*swap(HeadTotal) div 2048:5, 'Mb');
      writeln('Число цилиндров           :', swap(CylsTotal):7);
      writeln('Число головок             :', swap(HeadTotal):7);
      writeln('Число секторов на дорожку :', swap(SPT):7);
      writeln('Число байт на дорожку*    :', swap(BPT):7);
      writeln('Число байт на сектор*     :', swap(BPS):7);
      writeln('Размер буфера             :', swap(BufSize):7);
      writeln('Код ECC                   :', swap(ECC):7);
      writeln(' * -- неформатированная емкость', ^M^J);
      writeln('Серийный номер            :', serial);
      writeln('Версия                    :',revision);
      writeln('Модель                    :',model);
    end;
    write('Hажмите любую клавишу...');
{$IFDEF WINDOWS}
    readkey;
{$ELSE}
    asm xor ah,ah ; int 16h end;
{$ENDIF}
    writeln(^M^J);
  end;
end.
Покопайтесь в области памяти BIOS: адреса с 0040:0000 по 0040:00FF (256 байт).
Там можно найти много интересного
я думаю, что тут без асма никуда, как-то мне попадался на глаза исходник, там очень много программа про систему рассказывала...
Вот такой пример нашел, для информации о процессоре
Если Вам необходимо не только "вычислить" частоту процессора, а и узнать о процессоре как можно больше, пожалуйста, пользуйтесь следующим модулем:
Код
unit ExpandCPUInfo;

interface

type

TCPUInfo = packed record
IDString : array [0..11] of Char;
Stepping : Integer;
Model    : Integer;
Family   : Integer;
FPU,
VirtualModeExtensions,
DebuggingExtensions,
PageSizeExtensions,
TimeStampCounter,
K86ModelSpecificRegisters,
MachineCheckException,
CMPXCHG8B,
APIC,
MemoryTypeRangeRegisters,
GlobalPagingExtension,
ConditionalMoveInstruction,
MMX     : Boolean;
SYSCALLandSYSRET,
FPConditionalMoveInstruction,
AMD3DNow : Boolean;
CPUName : String;
end;
{информация об идентификации процессора}
function ExistCPUID:Boolean;
function CPUIDInfo(out info: TCPUInfo):Boolean;
{инф-я о технологии процессора}
function ExistMMX:Boolean;
function Exist3DNow:Boolean;
function ExistKNI:Boolean;
{------------------------}
procedure EMMS;
procedure FEMMS;
procedure PREFETCH(p: Pointer); register;

implementation

function ExistCPUID : Boolean;
asm

pushfd
pop eax
mov ebx, eax
xor eax, 00200000h
push eax
popfd
pushfd
pop ecx
mov eax,0
cmp ecx, ebx
jz @NO_CPUID
inc eax
@NO_CPUID:
end;

function CPUIDInfo(out info: TCPUIDInfo):Boolean;

function ExistExtendedCPUIDFunctions:Boolean;
asm
mov eax,080000000h
db $0F,$A2
end;
var

name : array [0..47] of Char;
p : Pointer;
begin

if ExistCPUID then asm
jmp @Start
@BitLoop:
mov al,dl
and al,1
mov [edi],al
shr edx,1
inc edi
loop @BitLoop
ret
@Start:
mov edi,info
mov eax,0
db $0F,$A2
mov [edi],ebx
mov [edi+4],edx
mov [edi+8],ecx
mov eax,1
db $0F,$A2
mov ebx,eax
and eax,0fh;
mov [edi+12],eax;
shr ebx,4
mov eax,ebx
and eax,0fh
mov [edi+12+4],eax
shr ebx,4
mov eax,ebx
and eax,0fh
mov [edi+12+8],eax
add edi,24
mov ecx,6
call @BitLoop
shr edx,1
mov ecx,3
call @BitLoop
shr edx,2
mov ecx,2
call @BitLoop
shr edx,1
mov ecx,1
call @BitLoop
shr edx,7
mov ecx,1
call @BitLoop
mov p,edi
end;
if (info.IDString = 'AuthenticAMD') and ExistExtendedCPUIDFunctions then begin
asm
mov edi,p
mov eax,080000001h
db $0F,$A2
mov eax,edx
shr eax,11
and al,1
mov [edi],al
mov eax,edx
shr eax,16
and al,1
mov [edi+1],al
mov eax,edx
shr eax,31
and al,1
mov [edi+2],al
lea edi,name
mov eax,0
mov [edi],eax
mov eax,080000000h
db $0F,$A2
cmp eax,080000004h
jl @NoString
mov eax,080000002h
db $0F,$A2
mov [edi],eax
mov [edi+4],ebx
mov [edi+8],ecx
mov [edi+12],edx
add edi,16
mov eax,080000003h
db $0F,$A2
mov [edi],eax
mov [edi+4],ebx
mov [edi+8],ecx
mov [edi+12],edx
add edi,16
mov eax,080000004h
db $0F,$A2
mov [edi],eax
mov [edi+4],ebx
mov [edi+8],ecx
mov [edi+12],edx
@NoString:
end;
info.CPUName:=name;
end else with info do begin
SYSCALLandSYSRET:=False;
FPConditionalMoveInstruction:=False;
AMD3DNow:=False;
CPUName:='';
end;
Result:=ExistCPUID;
end;

function ExistMMX:Boolean;
var

info : TCPUIDInfo;
begin

if CPUIDInfo(info) then
Result:=info.MMX
else
Result:=False;
end;

function Exist3DNow:Boolean;
var

info : TCPUIDInfo;
begin

if CPUIDInfo(info) then
Result:=info.AMD3DNow
else
Result:=False;
end;

function ExistKNI:Boolean;
begin

Result:=False;
end;

procedure EMMS;
asm

db $0F,$77
end;

procedure FEMMS;
asm

db $0F,$03
end;

procedure PREFETCH(p: Pointer); register;
asm

// PREFETCH byte ptr [eax]
end;

end

оригинал http://delphiworld.narod.ru/
Вообще существует много разных типов карт, дисков, процессоров и т.п. И во многих программах есть зависимость от них. Неужели надо везде включать условие типа "если такой-то процессор, то это... такая-то видеокарта, то это..."? Ведь комбинаций может быть много очень.
Кто-нибудь сталкивался с написанием таких условий? Или часто можно как-то абстрагироваться от этого?
Цитата
sherlock2010 пишет:
Вообще существует много разных типов карт, дисков, процессоров и т.п. И во многих программах есть зависимость от них. Неужели надо везде включать условие типа "если такой-то процессор, то это... такая-то видеокарта, то это..."? Ведь комбинаций может быть много очень.
Кто-нибудь сталкивался с написанием таких условий? Или часто можно как-то абстрагироваться от этого?

К сожалению нет, в большинстве случаев надо писать под конкретную железку.
Как то приспичило мне программно изменять свойства сетевых интерфейсов, ip адрес, маску,шлюз,днс в общем самые основные настройки.
Вот поделюсь опытом. Для всего вышесказанного существует библиотека Internet Protocol Helper API (iphlpapi.dll)
Есть адаптированные версии для дельфи, так что нет необходимости закорачиваться с подключением функции из dll, правда найти ссылку для скачивания IpHlpApi.pas так и не получилось
Описание библиотеки на сайте МСДН
http://msdn.microsoft.com/en-us/library/aa366028(v=VS.85).aspx
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)