找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 13762|回复: 6

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:( i9 q+ b9 L7 L" H/ c3 `
-s f000:0 ffff'SM'
2 C! C1 r4 a% i* T" f$ qF000:BFB1, @% x* o' e, C4 T" r
-d f000:bfb0' }# T$ H' \4 ~% `0 B" O
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
% n6 N5 i6 m2 }; r0 XF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...1 e% N, s4 a! [* u  k4 u+ f/ h
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
3 Z! m4 c5 w+ z7 EF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
* S" d$ K, t  x+ L6 C4 @. MF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
& L- C, J  G/ y- TF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
: R. U6 F4 v) ?3 V' n2 u2 @: F8 mF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V7 ~0 A5 j6 n. H1 c! j' p$ A- \3 T
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..4 j5 K$ t& u2 D
-d f000:06f0
1 _" D: @: D5 W% ~( u$ sF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................! p& k7 Z( x( j5 J' M5 I% N1 V% g! A- o
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
/ R% r/ x& F6 Y' @8 v! YF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
6 L6 ]" M2 M5 nF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
' k; i# d! p. N4 yF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
% J- z" J; o& J$ y' y: k6 S: EF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8.../ r# m" n& [4 h, R4 t# o
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu$ x) H9 L, K" p9 J1 `" g; Z
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
" m+ y) {: k+ F; f% |1 C
% I  b1 I* _, D2 [, t
/ ?# \5 q# \! \, S" C# v% S我要读出这里的06f9:07
9 e0 A2 Y( p- _7 G6 g) Z 然后得到一个(07+1)*64=512 这样来获取BIOS大小-- `( }8 H# D/ z6 i$ g' _8 }5 E  T) ?
& A9 \3 M8 C  r
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码( l6 C* ~& i) w; {6 A4 |
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
( ?7 Z  R  n# m正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。& ~2 A! y1 F! ?, S
至于如何实现,可以问google
回复

使用道具 举报

发表于 2008-4-1 13:23:53 | 显示全部楼层
楼主是做软件的么?
回复

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
3 P* F1 S% L/ {" c2 p.model small
! x' R8 w3 @- q/ [.386- y, b. x# A# J" f0 a; g
.data
4 m/ ~% h# L, Z' Q( t8 R+ \    SMBIOS_Sign db '_SM_'
6 `; N  G5 _+ d0 X7 u* Y) ]4 Z, Z.code
, ]7 r- f' }1 o, n# s/ |start:% R7 O1 \9 D/ O8 t1 ~9 n
    mov ax, seg SMBIOS_Sign* S: s, e* _# j. Y
    mov es, ax
9 m4 `5 j" U$ C    mov ax, 0f000h
9 U- \6 ~1 `  k3 X/ U2 K& a    mov ds, ax
, n) a3 j! h! B6 T8 H! [  L7 r- u    mov si, 0
: T: Y: U8 i: }' O& p8 W    mov cx, 04000h. f( N2 g/ k2 Y0 n3 \7 t* h% E
    cld
( ~  ~& K; |7 N; y) M@@:% F, v$ a; P/ O7 y
    lodsd2 l! ~( J) |& {+ D0 k- H* _
    dec cx
% ~2 E9 x' f- ?( R# o% t8 ]5 U    jz  short @F1 j4 ]3 [# o( ?  f1 J3 c
    cmp eax,dword ptr es:[SMBIOS_Sign]
& B9 H9 f# {& u/ L6 a9 c    jnz short @B3 t. w& o$ j6 k) w. s4 G; d
@@:
9 n; `) l- p2 N5 J9 O    or  cx, cx
& n) e% G. ]5 ^3 \% x0 D8 t    jz  short @exit
7 c2 J/ l3 X3 @' G# f" j' o    add si, 14h
- m9 q" {+ |+ i( G( r1 a0 |, r    mov ax, ds:[si]
6 x6 p$ V; M( h$ \) O# y    add ax, 09h
. K, F" n8 C9 x8 z    mov di, ax" z' E9 S" H0 w/ z7 d3 q
    xor bx, bx
$ C( U. x1 Z4 y- c9 y    mov bl, ds:[di]4 L: z0 A, ]+ a6 R2 i
    inc bl
2 {+ X8 P- O: D: y: s$ [2 j2 H    shl bx,6
  k7 U; E6 r% |@exit:4 l7 j7 C) F: q3 [  c% B- Q
    mov ah,4ch
$ H0 _4 M% M' S% x1 K# i    int 21h
  \: o% y& h+ u+ V' j( M) Rend start& G5 v' w0 C2 _' t
cseg ends
6 ^+ N4 a( I4 z推测你的算法是:( m  Y9 U6 Y1 Y$ J1 o, W( D6 Y# Y
1.找'_SM_',然后在其后offset 18h的地方为下一个offset25 C4 Q5 ^. ~2 {2 ~. H0 E
2.找到这个offset2+9的地方的值
9 Z* P. l: N% W7 @/ ?( Y3.此值加一,乘以64为BIOS Size,在bx中.: {6 {: s: b9 Z+ t. N" e, @' Y. j
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT, g$ R1 w6 d& h
    ;此处输入数据段代码  
% Y2 B7 D6 R$ \+ wDATAS ENDS' H" s1 v8 _& Z- a( ~; d

) ^/ h! i5 M  G3 m! h7 ESTACKS SEGMENT  m$ n4 @! ^* }; {
    ;此处输入堆栈段代码/ ?& {1 o8 Y: P+ L  Y
STACKS ENDS) x0 }6 q0 \6 \: \, m1 U9 S
' Y' P4 x# D, k" w6 s
CODES SEGMENT* M6 D' I% J. U
    ASSUME CS:CODES,DSATAS,SS:STACKS( j9 Q: u% l  D4 s- V1 s
.486% v3 \' s/ N+ W! P- ?8 |1 r3 Q
START:. z$ p4 ^* t8 Q, F
    MOV AX,0f000h' m# m. G# g3 O3 h) t  g
    MOV DS,AX+ q( l1 P. Q5 t/ O
    ;此处输入代码段代码
/ N6 n2 I' |% M4 c    mov si,0
% \2 M: @4 \# }# y8 ?2 o& G' n   last: 7 x2 z/ ~: X' U" f3 g7 y* V
    mov eax,[si]
4 e' n" K( G9 |3 C& Q" q" X; n    cmp eax,5f4d535fh8 n8 y5 C+ S9 l; v6 q
    je over
7 t3 n) w% R% }- x* e    add si,10h
8 Z9 @% d1 G) r. x2 M% D+ ?2 ]    jmp last$ M9 p& l  u6 R: X3 a
    5 N& _( G  D0 Y; o. l, O
    over:1 ?3 r, y6 {! O7 I( p
    add si,18h
) `* n/ M0 n4 V' S2 X$ R% l    mov eax,[si], x/ x" G+ }1 r
    mov si,ax
0 M3 v8 \: ]# i5 V' e, s    add si,97 p0 @) Y. h, G! j" @$ {5 v1 O
    mov ax,[si]
" \# `# a' y7 m" t    add al,1
$ C; W, K, `  N, g1 ]6 E    mov bl,64# M# n( W9 k/ _; _8 [3 Y
    mul bl
% @( \2 I* b6 y6 R3 Y  `    mov bx,ax
# ^$ v# U' P: G- \   
' p& A9 n" k9 c) G" ^    call display" A9 K. J: s) V& R2 d/ `+ N5 i% q
    MOV AH,4CH
' T$ A3 M! H0 y; \$ X    INT 21H  + Q: X' O/ L; y3 s: `
   
: p8 ]) D3 w& K+ ]5 I, @& P1 h    display proc near$ O; P8 i" Z1 s% q/ j: @
   push ax
3 E! l# J  ?9 I" J7 w$ ~. S/ @3 g   push bx7 r1 A4 C9 e; s1 O) D  Z
   push cx
( ?; ~, [' C8 f3 @   mov ch,4
8 d& H4 M) N6 i  rotate:mov cl,4# C. y# ~' ?) ]2 x
   rol bx,cl) `( N) z7 S( k  {! H. n
   mov al,bl/ I+ N4 a, i* t; n3 Q1 K
   and al,0fh
* o2 t- ]( x: ^% M5 r   add al,30h
, K# F) }4 A9 W   cmp al,3ah: o: ?3 V9 S: a9 G$ a. S# g; ]
   jl printit
: i6 I$ |8 M3 R8 B   add al,7h2 `  k% S5 x' e+ e
  printit:
$ \" y3 T# m* N$ O0 [4 b& _  mov dl,al; s) c: ~' R. Y& [4 W+ p
  mov ah,2
# T1 J' d1 X  ^0 ]# k5 G  int 21h
) b) z% S4 |* m6 A  dec ch
: j  t# x: G6 s, i  jnz rotate
& Q# K6 ~# t2 i: T  mov dl,20h
, ?0 M+ }1 E7 E) B. r1 J% `  mov ah,2h
' P  A* D' T. u  int 21h
  s9 X% c! [" h+ C7 w, x  pop cx
5 v; i5 M' \' s0 P+ E4 C* ~  pop bx
5 @% r& `  d: d! T  pop ax* ^4 ^) U0 p* N; W$ D
  ret: P& U# t# s6 l+ y5 W
  display endp. k5 u/ @* \# V# P; S6 y

# I  F1 z0 S! V& e' F5 h1 K* KCODES ENDS
* X- }' Q% X3 X% N    END START
& U% f! k, [" ?( V1 S* [
2 m( e+ c5 C5 y5 L$ E运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
; W6 b# L1 M1 m3 X' ^, C$ Y* f. Y9 MDATAS SEGMENT
0 @5 v" u6 v! Q" j! [    ;此处输入数据段代码  * }  ~% T0 Q6 {; c- m2 w
DATAS ENDS2 O  Z1 C) e1 L- k5 `) F: n

) G+ g7 I) i$ ]& W) ISTACKS SEGMENT
( q! h9 m3 h& ~6 E% F$ {8 v    ;此处输入堆栈段代码
+ p" m" g6 _, u: t' Y2 |STACKS ENDS
$ o' x$ T/ f  ^. ]/ G
+ U- ^, a( y$ @0 c* ZCODES SEGMENT$ y6 |' V6 }+ a
    ASSUME CS:CODES,DSATAS,SS:STACKS" ~  @! r) e& M9 _3 j
.486$ O' K) _$ ?2 X0 H* H& O
START:
& G8 q$ t' h  r4 M! n2 M    MOV AX,0f000h5 V! ~9 D* c) A- \% P# h
    MOV DS,AX ...

2 ^/ s% M. K# P5 n二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
! H# T; p  P# H3 G: x7 ^. k9 e
8 \/ r2 ^! w, W) ?( Q7 F% x8 z  p还是直接读rom芯片参数最好
回复

使用道具 举报

发表于 2009-2-16 17:13:15 | 显示全部楼层
只是 在F0000h-FFFFFh搜索而已,这是smBios范围.而并未指定 其地址在F0000h处.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-4-25 03:38 , Processed in 0.043708 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表