求Win98下面主板Bios读写功能函数outportb,inportb之Delphi函数原型?(100分)

  • 主题发起人 主题发起人 anydelphi
  • 开始时间 开始时间
A

anydelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
在Dos的TC2下面读写Bios的功能函数为
outportb(int portid,unsigned char value);
unsign char inportb(int portid);
unsiged char 为 byte 0..255
int 在TC2下为 -32726..32726 SmallInt
有这两个函数就可以搞定Bios的读写,不知道其对应的Delphi函数为什么??
本人从网上找的如下资料,但是读写结果不正确,也请赐教!

procedure OutPortB(PortId:SmallInt;Data:Word);
asm
mov dx,PortId
mov ax,Data
out dx,ax
end;

function InPortB(PortId:SmallInt):Byte;
asm
mov dx,PortId
in ax,dx
end;

请高手赐教或者修改!!谢谢
 
分不多拉,我就这么点家当了!这是我今年问的最后一个问题了!
请高手出手援助!
 
你这个拿到Delphi里面基本就可以使用。
 
噢,我理解有点偏差。不过你的是端口读写的函数,仅仅支持98的。
看这个:读取主板序列号
uses SHA1, Base64;

function GetHashedBiosInfo: string;
var
SHA1Context: TSHA1Context;
SHA1Digest: TSHA1Digest;
begin
// Get the BIOS data
SetString(Result, PChar(Ptr($F0000)), $10000);
// Hash the string
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, PChar(Result), Length(Result));
SHA1Final(SHA1Context, SHA1Digest);
SetString(Result, PChar(@SHA1Digest), sizeof(SHA1Digest));
// Return the hash string encoded in printable characters
Result := B64Encode(Result);
end;


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 >= 8) 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;

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Text := GetBiosInfoAsText;
end;
 
我可以发一个单元给你,能够适用于NT以及9x!
留下Mail。
 
procedure OutPortB(PortId:SmallInt;Data:Word);
function InPortB(PortId:SmallInt):Byte;
同一个程序我用TC2的outportb,和inportb可以得到正确大案
但用以上两个函数却不正确???我觉得这两个函数的错误哟!!
???
 
ddt_2k1@163.com
 
另外我希望得到这outportb,inportb对应的dELPHI函数,可以吗?
 
已发,你要的outportb,inportb我不懂啊:(
 
你的Bioshelp.pas用Demo吗?
 
to yzhshi
SHA1, Base64好像不是标准的系统单元,你的代码运行不了:(
SHA1, Base64能发一份给我吗?
ddt_2k1@163.com
 
to shenloqi
outportb(0x5e,i); //将i字节的数据写到端口5e
inportb(0x3e);//将0x3e端口的数据读出到终端
 
to yzhshi
function GetBiosInfoAsText: string;可以用
function GetHashedBiosInfo: string;不行
 
to shenloqi:
能否发一份给我?
workid@163.com
 
难道没有知道嘛???????????????????
 
我认为你从网上查来的程序应该是可用的,当然只能在win98下用。
我曾经用过,当时我的程序能完成对NumLock指示灯的控制,只要你对汇编语言熟就行了。
你试一下,将你的PortID定义为Word,而且最好每次读一个字节。
procedure OutPortB(PortId:Word;Data:Word);
begin
asm
mov dx,PortID
mov ax,Word
out dx,al
inc dx
mov al,ah
out dx,al
end;
end;
输入函数类似。
 
to lw86我对汇编不太熟悉拉,要不就不请教高手们了!!!
这个函数用了以后数据全变成00了,结果不对拉:(
另外输入函数如何修改,都请赐教哟!
本人很奔,改了几次都没有改好
procedure OutPortB(PortId:Word;Data:Word);
asm
mov dx,PortID
mov ax,Data
out dx,al
inc dx
mov al,ah
out dx,al
end;
 
你看看这个,也许和shenloqi给你发的一样,不过这个应该算正道。
http://www.swissdelphicenter.ch/torry/showcode.php?id=748
调用:以下的也许对。
uses BiosHelp;

procedure TForm1.Button1Click(Sender: TObject);
var
Dump: TRomBiosDump;
i: Integer;
begin
ReadRomBios(Dump, rrbmAutomatic);
for i := 1 to $000FFFFF - $000F0000 - 1 do
Memo1.Lines.Add(IntToHex(Dump[i + $000FFFFF], 2));
end;
 
输入函数如下写:

function InPortB(PortId:Word):Byte;
var
i:byte;
begin
asm
mov dx,PortId
in al,dx
mov i,al
end;
return(i);
end;
你再试试。
 
to lw86还是不对,跟以前的结果一样的!
其实用 BIOSHELP.PAS到是蛮好的,只是找不到它们数据的影射关系!
一般的PC/AT、286、386、486等微机均配有CMOS芯片,CMOS&127;芯片包含了一个实时钟
和64个字节的CMOS内存。在CMOS内存中,0-0DH为实时钟的有关信息,0E-&127;3FH包含
计算机的硬件配置信息,如常规内存的大小、扩展内存的大小、&127;软盘的类型、固定
盘的类型及其物理参数、显示器的类型等,这些参数与计算机能否正常工作具有密切的
关系,另外还有计算机的开机口令和其它辅助设置信息。表1列出了&127;CMOS内存各字
节的用途。
表1 CMOS内存配置信息的含义
地 址
功能
说明
0,1
秒,秒报警
 
2,3
分,分报警
 
4,5
时,时报警
 
6
星期几
 
7,8,9
日,月,年
 
A
状态寄存器A
 
B
状态寄存器B
 
C
状态寄存器C
 
D
状态寄存器D
0=电池失效,80=电池有效
E
诊断状态
 
F
关机状态
由上电诊断定义
10
软驱
高4位为A驱,低4位为B驱,0=无, 1=360KB, 2=1.2KB, 4=1.44KB, 6=720KB
11
保留
 
12
固定盘
高4位为C驱,低4位为D驱,0=无,F=用户定义盘, 其它为系统定义盘
13
保留
 
14
设备状态
标志驱动器数、显示器类型、有无数学处理器等
15-16
内存
以KB计的常规内存数,100H=256KB,200H=512KB, 280H=640KB
17-18
扩展内存
以KB计的扩展内存数,200H=512KB,400H=1024KB等
19
C盘类型数
根据具体硬盘类型而定
1A
D盘类型数
根据具体硬盘类型而定
1B-1C
保留
 
1D-1E
C盘柱体数
1D-2CH只有当硬盘为用户自定义类型时起作用
1F
C盘面数
 
20-21
C盘WP
 
22-23
C盘LZ
 
24
C盘每柱扇区
 
25-26
D盘柱体数
 
27
D盘面数
 
28-29
D盘WP
 
2A-2B
D盘LZ
 
2C
D盘每柱扇区
 
2D
保留
 
2E-2F
校验和
为10-2DH共30个字节的和数,2EH为高位,2FH为低位
30-31
扩展内存
 
32
日期的世纪数
BCD码的世纪值,如1995年的世纪数为19
33
标志信息
 
34-3F
保留
 
 
后退
顶部