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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
, n1 e* f* z. f) G6 E-s f000:0 ffff'SM'
9 C* }7 H. y6 C8 n( ]$ s8 yF000:BFB1" y5 _4 G' g. w$ Y' d/ d5 H
-d f000:bfb00 z6 R) m6 b" l; l7 o
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
1 s1 `4 T  l, J+ x' c! l4 U* KF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
1 p: w0 h( f% W' b% ~( w* P7 O# c: ^# rF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
- i6 Y& V" O' O. g5 rF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
" V. t% b  V4 z4 ]  b' ]) DF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......* H5 U6 Y7 Q$ ~  z6 W
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.  ?- q" V) `$ L" ]
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
2 k; n0 v# ?% v6 J2 ZF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
+ R! r: `3 r# w" {) _- E- ^8 f6 m-d f000:06f0! G. P& R" N/ x9 ~! c" o) O5 c7 Y" X
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................) R6 I% ?0 \' Y/ U5 A, W
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American* p7 i4 z4 N8 p: u
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.9 O. {/ {, B0 a1 Y1 a
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2) }# d( v5 e+ {% @9 X0 C! C8 t+ o. `3 m
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
4 ~% R0 m  ~( J; \F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
! k* U$ L7 u  d/ B- }& N: l2 A- OF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu# S: u2 {6 D: q4 i1 i9 R; x
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
, }& s; M5 f+ ^
+ Q: \) d; d2 G3 r- p  I8 q2 }1 G* @& x3 Q: S2 t
我要读出这里的06f9:073 C0 U1 w: {0 A& t4 k: H
然后得到一个(07+1)*64=512 这样来获取BIOS大小-4 A5 n# J  d+ l, J/ ?5 }

2 e/ `6 j* x( [( M6 G用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
+ h- Y2 ~8 C) z! _0 U8 e谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。+ N" l1 {: q) l
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。# C3 I3 X6 h  s) B3 |% \, j; ~
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
0 R' D4 E0 M1 W& D; g, T9 Q% ].model small
, M' ?" u1 e) d- b.386
) q; @. x( |+ {: r; X) z.data
) s! }7 @/ j/ }" S    SMBIOS_Sign db '_SM_'5 O, g# \7 \, m7 t6 D5 X9 p
.code7 {0 c1 P0 [3 q- s5 x
start:+ B$ k( g6 t" G7 v' F
    mov ax, seg SMBIOS_Sign
) D6 A: V1 ~3 H+ s    mov es, ax
6 l: b8 @2 y7 h( i0 r    mov ax, 0f000h
9 i' y0 G# |$ G: D' }    mov ds, ax& v$ i& C0 L0 C" v
    mov si, 0
8 @& D: V7 G! Z3 a( s    mov cx, 04000h
  f9 `) g7 ], }# C3 K    cld6 e1 @2 F% f/ w6 Z, Z& M8 ~" n' U
@@:
- b1 q' o% w& k    lodsd8 n. M: _' Z7 U" @, l
    dec cx
* ~. v* D$ w2 @4 x7 _5 q    jz  short @F
* a0 v. z6 o9 ~0 r" I    cmp eax,dword ptr es:[SMBIOS_Sign]0 t7 }2 e8 R; y9 |; k' o7 o; \
    jnz short @B6 Z* U5 ~4 ?% p
@@:5 m" `; v# r8 j" q8 w$ g
    or  cx, cx6 R6 g5 u1 ]* t' s
    jz  short @exit
3 n4 u4 N" T/ s$ `4 ~    add si, 14h% P1 T8 n" l9 f* @9 k4 B& ]1 O
    mov ax, ds:[si]
, U$ y4 H$ u6 t7 z0 j; L" g    add ax, 09h
+ i* Y- Y5 b" f) ?2 i7 j& ~    mov di, ax
/ i! u2 m+ G. K! |* J3 C: W% g' b    xor bx, bx/ j# N/ r2 |, [
    mov bl, ds:[di]5 G7 P- J; z- F' l
    inc bl2 i8 ^) c( f# _# s8 q7 W9 c- S
    shl bx,6
7 h& g3 o& j% X" v: h) \& M@exit:9 K0 e: {* G3 k4 |/ ^! A5 q
    mov ah,4ch8 M. O9 x4 {9 L0 X; i: i
    int 21h
# s- ~; G& c9 [$ G+ H0 ~end start" O/ {8 J$ t: y/ D/ h! H; d  ^
cseg ends5 ^$ O7 b' M1 O+ Z4 J
推测你的算法是:: p/ x+ @: ~( h( Y& q
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2( c9 v! H/ Y# N* y3 q. ?
2.找到这个offset2+9的地方的值
2 J2 a' `  ]- E# d3.此值加一,乘以64为BIOS Size,在bx中.% P. g! P3 _/ s
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT3 l* M) |+ U0 O" |7 s' D; d+ b8 c
    ;此处输入数据段代码  
5 [$ W/ ]# H. C8 }DATAS ENDS
4 l7 A1 ]1 {& M1 Z: b6 i# F
4 k" K2 `7 }9 Z1 Q" a6 p7 N, W5 ASTACKS SEGMENT' O  K1 L7 O0 j  }
    ;此处输入堆栈段代码3 g: u7 X+ W$ B+ T% \2 r6 U6 K
STACKS ENDS
/ c: h& p5 N9 F7 ]6 A8 J$ b% ?5 C- j5 t2 ?' P
CODES SEGMENT
  D  M/ F+ ]: j# m; Y4 \2 s* t( p0 y    ASSUME CS:CODES,DSATAS,SS:STACKS( ^+ Q7 Z1 u; b& a$ L
.4866 N/ Z1 U* w, ]% z( K2 Y) ?8 `# \
START:5 \3 q% A4 p+ m1 z, M/ y5 q
    MOV AX,0f000h
/ C7 d% K& J% `1 f/ E1 {( y    MOV DS,AX
* z5 V3 D/ _& w6 D9 }( k    ;此处输入代码段代码9 H- x5 H  h# J) O, e, d
    mov si,06 j/ b# K" n: }, E# T8 J
   last: ! S5 L; F) U, ], L$ X
    mov eax,[si]; S5 i0 J+ b, U/ N& }
    cmp eax,5f4d535fh: \; J+ ^. I5 O1 L' C
    je over, j3 ^3 Z+ o9 F8 Q
    add si,10h! t* x7 E* W3 B% H: m
    jmp last' Z* G' n1 k4 q
   
! o  d4 y6 ^3 n9 p# z3 P1 `    over:
2 _9 v3 e" S1 Y3 x. E3 V    add si,18h
6 _6 W- z5 v4 N0 |- d) ~; ]+ o1 u    mov eax,[si]
( ]/ H$ v" s* q/ g) ^    mov si,ax
8 l5 u  L- I& J. \/ ~4 v    add si,95 }/ R* v# _3 D  ]
    mov ax,[si]
% h+ y4 p3 T0 Q1 M+ D    add al,1% O9 _; ]4 `0 s
    mov bl,64
& A! P6 n+ l+ s- Q/ N4 k    mul bl
6 A4 Z+ k0 P2 O; B# U* s    mov bx,ax
8 Z5 R$ m5 T* g, M7 n   
+ c4 v2 O8 K- W    call display
! [0 h* B. z$ v' }# ~2 v    MOV AH,4CH' Y5 Q0 ?6 o* z  z
    INT 21H  3 X3 E% `# d* b
    ' `2 Q# r  U" Y# l  a1 w
    display proc near+ o9 |* [( L& P% j' s
   push ax
4 D+ ^' y2 o  X2 L. [   push bx
1 S0 }. \; ^. V9 q7 n# m   push cx5 N( _7 v) ?, `6 v1 @7 F. l
   mov ch,4
+ @5 l- t0 t# ~/ L0 |/ Y, t  rotate:mov cl,4* s- S: Y: d. Y6 S6 B
   rol bx,cl& J4 b; }2 A/ b# a/ u
   mov al,bl
+ R8 ~- J+ v- x3 @3 P9 B   and al,0fh  E7 E3 W( \7 {+ I
   add al,30h# r6 h6 h+ e7 }
   cmp al,3ah
7 G3 h  M" c3 A   jl printit0 h7 @1 i) |5 |, \; f1 [4 |
   add al,7h' v2 |) J( w: ~) b3 F# n
  printit:4 u/ V4 F6 C! d: I
  mov dl,al
3 _; ?& \, @, ^6 v  mov ah,2
5 _4 U" c7 L& L2 ^2 s7 [  int 21h
5 i" ?/ q' {& R  dec ch2 R. Q( [2 p& o( q
  jnz rotate
. x. _% K6 G+ ~+ T  v: Q( @  mov dl,20h
: `: R; b) J( f, N- L  mov ah,2h9 [/ y6 j  i& K1 V
  int 21h+ J6 l: d. k) M
  pop cx6 J# c' o( q4 |6 F
  pop bx
$ V& p4 _0 N1 M  pop ax4 |$ }7 y. a. J: }) G+ \" g
  ret2 x4 E, r  V. ]6 _6 O
  display endp
/ X, [& h; m; s1 }/ A3 U' n# Z6 h3 W4 ~5 Y  V3 F
CODES ENDS1 Z6 U! V" [# g; d, s
    END START( X3 P/ o0 P* B# n
2 A  O8 E% D& \% w4 u
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun- F4 l2 K$ \5 j2 X% ?0 P
DATAS SEGMENT
3 I; \/ J- W# u( s2 p    ;此处输入数据段代码  % p) R+ D  U- ~8 t
DATAS ENDS
8 l! x# U  r: U8 B  m9 e5 q8 c3 D6 |/ A3 n1 k! B
STACKS SEGMENT0 g. L+ v  n/ ?
    ;此处输入堆栈段代码
: C' |8 k( w2 L; a3 d. MSTACKS ENDS, z3 {. j# @2 X/ j! K7 t( \2 ]0 p

( V- B1 B1 y# kCODES SEGMENT
4 E- o! E& E) M& |: `- v    ASSUME CS:CODES,DSATAS,SS:STACKS0 J( A3 ]2 o" A5 M; x* l
.486. ~* ]$ v# \0 b. ^, s4 Q; a
START:  s* O8 h+ N8 }  ]
    MOV AX,0f000h
+ W- Q) i2 I+ ^) C1 @& v    MOV DS,AX ...
% R& Y* ]. b2 t% b
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。" p- C$ s$ J2 ?* _( i

; Z# v( V1 l5 C7 R还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 04:24 , Processed in 0.032908 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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