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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
: ?+ L* Y' X( O1 K+ E+ S9 O+ |-s f000:0 ffff'SM'
" v" O% M* l0 U+ H, NF000:BFB18 B; ?! w3 g, {- o- n: u; d
-d f000:bfb0
' v) d9 a; r. W# I3 a4 A! `2 {7 uF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............, b4 j! L( F# ~
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
# W; |) J+ w  @6 N4 l$ v, yF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
( G2 t1 B  h* w! ]" P8 q; t( @F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
2 d  d0 |  u) H0 l1 B4 u+ m$ z$ ?1 GF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......5 |% u8 M5 u5 g2 _
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.( H& R+ E* O4 s, P$ ?* O0 _/ R
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
0 h; n; J: r8 ^( S+ b/ xF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
/ l# z/ G' F4 T5 ~5 f-d f000:06f0
( d+ d+ R+ [/ MF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
1 _# k# f3 i- {. Q2 FF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
: d$ d5 @2 A- |) z% ?F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
# P- l4 Y7 T$ f0 z# aF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/29 j; B' t1 u* M. T; U& c+ `
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u8 O! [; G3 O& x' ]- q
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
% f) u/ [4 p& x* hF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
/ S- o2 P" U9 x/ P' C) PF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
" ~( ?& a# u( r( h# n8 D* f$ E3 A, a
/ q, I# B. e# t* m; A! [" u- X# T0 P0 [
我要读出这里的06f9:07! o1 d3 A4 m0 F0 F/ G7 w; q
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
6 L* t/ @; B' x' {! R# r! @
5 ~4 o: g2 b7 f% x8 h+ _- k用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码. Y/ M  O* |; |
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。7 J8 `  R) A: G" H
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
+ c! x1 N6 D/ y8 t  [7 ?1 T至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:4 f) g& Q/ Z" q# v7 u
.model small
5 z7 `: S8 {- K/ O: N. G5 k6 x4 G* S.386
1 p4 n7 }* |& s4 K.data* P# r# s, O- N
    SMBIOS_Sign db '_SM_'8 r0 P/ H* j; B* @5 `
.code4 U" Z( d0 `/ E
start:# y6 b. ?; }# w6 V1 p0 h
    mov ax, seg SMBIOS_Sign
. i- l" H3 x7 a    mov es, ax
9 _+ l! ], C. a% ?& g" Z  u    mov ax, 0f000h! k" K  ^; b. ~, v5 C' C& x
    mov ds, ax# m# @% J. [2 |& U
    mov si, 0! C( p# g  A( |$ |( y* @5 W" i1 e) A
    mov cx, 04000h
3 t4 `2 }3 M; _$ }9 |    cld
: ]8 B. ~' ^  z$ O@@:% C. w5 J) |' x' h8 ^
    lodsd
1 C  m% Z' Q( A: ^3 |* {9 f, g    dec cx& b( T3 t+ c; u6 [( z6 ]4 ?3 ~
    jz  short @F
: _% x3 }( {) o# }4 T    cmp eax,dword ptr es:[SMBIOS_Sign]1 _& _3 N" K! V: V* q1 a
    jnz short @B2 K; o% y6 c1 }/ _
@@:
- c' _. Y3 i3 ^* V7 v$ G% i: Y    or  cx, cx
; T" X3 I8 e9 O7 `5 P6 k1 ], \    jz  short @exit
% T1 W5 ~+ E' o( ^8 f# Y, t* N( L    add si, 14h2 _7 c4 A6 @8 Q* [
    mov ax, ds:[si]
+ a" m( n  ~+ q9 f; r/ b    add ax, 09h
  p. O% t7 U; |3 G, s& Y    mov di, ax
  J& r, Z0 ]& `! e  {8 ?) l  g    xor bx, bx
( w1 R9 A4 i# v5 A; E9 T3 t3 g    mov bl, ds:[di]
# u$ ?0 P& B* _) X    inc bl2 P3 b& e! \( @) b# {, i
    shl bx,65 d- e, L2 n! g+ W* d  \, [: r
@exit:. n% t* F, T. H) H3 r
    mov ah,4ch! o& T1 i, l# k' c! W
    int 21h
, N8 Y( x2 I* Q" q# ^! x7 w2 mend start, A9 u# t4 w5 F% b
cseg ends
" q4 Z2 U7 t& u" N0 L, w推测你的算法是:
1 b! i0 [; L+ e5 D  U( c, H1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
+ F& F  E& F1 k& I! i2.找到这个offset2+9的地方的值
3 ^8 q( n' T- {* S" O! ^' h3.此值加一,乘以64为BIOS Size,在bx中.' c+ ~; {6 r$ Z! A% j! T3 P  |
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
9 B, Y0 E6 x& M! N3 y    ;此处输入数据段代码  6 Z; N" ]! i3 u- \4 b
DATAS ENDS
; `( V. p( i3 |" Q6 K+ J1 C0 g) u" A
STACKS SEGMENT; _+ i7 i9 n9 U2 S) Y" d5 X% L
    ;此处输入堆栈段代码9 F; t; Y& l; l* p6 U
STACKS ENDS7 q+ ]0 B. s* J; V& e5 u5 r
6 j% b! X9 \; ~8 J1 n' G" ~
CODES SEGMENT
- W% j! S- @- R    ASSUME CS:CODES,DSATAS,SS:STACKS9 \7 c) {' m5 @) j* O. d; M8 b# R
.486- e# q# w- E- f' Q; |! l: y% L* Q
START:
  M! _9 F7 \3 j6 Z    MOV AX,0f000h
6 r% Z( S/ }, \. m7 j6 `. Q    MOV DS,AX
# T  p% L% Q7 a6 O% ]    ;此处输入代码段代码
2 ^3 S3 n5 r  D4 {    mov si,0( ?% e$ t' n9 B; \  v6 O& d
   last: ; N; a2 ?* M2 k+ G% ~+ B
    mov eax,[si]: J* R/ s7 B2 N0 a
    cmp eax,5f4d535fh. s3 ~; o7 c4 H6 j5 C; d
    je over  p1 Z( f) @  m: ?5 m
    add si,10h, S& _% M( G0 H* u3 E4 t# A6 j
    jmp last; g, d. @% \. V5 T  z+ c2 K5 d
    4 Q4 s4 J9 N9 Q( G
    over:- a; P/ X4 X0 ?0 \& G- P
    add si,18h' T: `8 I- A/ {7 Y; u  T7 m
    mov eax,[si]3 K/ f/ w3 x$ C
    mov si,ax
+ k1 M3 Q9 p6 S6 c: Y! b5 b3 t! }    add si,94 ]& i( S) G* Y/ u$ D
    mov ax,[si]
$ x6 j$ ^( D: s8 \- l* m    add al,1
; _) _6 F+ W6 f4 x# d. P5 N4 ~7 G    mov bl,64. A. O2 w5 P# K7 \0 L& H3 I
    mul bl
" p; e3 z5 Q* x, L% t6 z5 m    mov bx,ax) J' `/ [* ~+ n3 O& x7 p9 n
   1 w+ w5 T/ K0 D0 Z3 ~
    call display
* m7 ?6 a$ J( \4 V: j    MOV AH,4CH
' j7 v  e( r! b. t1 X7 H  V" g    INT 21H  4 T9 F  e% j7 h# a6 \. J9 T" q5 n
    . u8 f, C7 r0 H+ ?8 \
    display proc near4 K  H  o% x; z. t, F
   push ax& U& _5 j- C. i6 N& r; A# |& P
   push bx
0 e! ?+ z7 ?, K, }  n  ~  P   push cx# o+ k5 U2 N/ i6 x0 m$ K- [
   mov ch,4, p$ O) Q' c' i/ k$ O1 ~
  rotate:mov cl,4$ A/ r) [* t3 H4 M+ Z3 D0 F
   rol bx,cl4 s; u* a* s) f9 `: p+ O. p- j
   mov al,bl0 y) L- ?; Y5 e3 Q! f3 W2 n$ d
   and al,0fh
* d! h6 W8 M+ b+ z4 S9 ?* t" c9 ?   add al,30h
% V; f# e$ p5 c! H* p$ v7 P   cmp al,3ah2 f: ~; N3 G& r* j* m  _
   jl printit2 c2 S! O& }0 {2 `  i4 k
   add al,7h
# L2 C+ H% c  r3 x% g  printit:
  I# I5 U7 s4 \; D7 y' P  mov dl,al
5 v8 L/ J5 `1 F# m7 x! m( ]6 L/ @  mov ah,2- A+ ^3 N" I* Q# \# j
  int 21h
* P/ x1 W3 e' ^2 ?  S& B* ]  dec ch
4 p% z, {7 v; p2 J+ J  jnz rotate2 n: o; W8 G: ^- _% u) G2 u0 Z* T
  mov dl,20h, x& d# o. c2 a
  mov ah,2h" k  O6 v- e4 Z5 Z, k4 Q6 i2 G( o; E
  int 21h8 a+ Q1 d  ~! Q. @
  pop cx( ?; m3 O! K4 R5 U9 N+ e
  pop bx; B( s/ n( S0 ?7 A6 p, s
  pop ax- H5 C6 A7 B. H8 t7 O( l  m9 j  o
  ret
' `* |1 [, v( d: M% _/ y  display endp
' }7 f4 E1 T8 t# \
& t1 `" `( o+ M$ lCODES ENDS
- [- X8 ^# Z# K. H# A3 M; q& b2 T/ i5 l2 }    END START- O; a8 S* L" S  C* Q
2 i' |2 q  o% V
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
# ^" L) R4 J5 P7 _DATAS SEGMENT
6 x  c0 o4 E8 E' t  v    ;此处输入数据段代码  
/ j2 [% Q& j5 p8 Q$ m7 kDATAS ENDS
# ~9 m) {7 F8 G8 C9 C$ V
- v( n, g3 r+ D& }5 ~! y' lSTACKS SEGMENT
. p& |3 J5 Q7 U3 ^+ w    ;此处输入堆栈段代码
  \* Q  Q5 G" b$ B( ESTACKS ENDS' r  b: L3 z& k7 n, @- G
1 q2 F( d# \9 B% x  p! b
CODES SEGMENT
7 `, o- x% Y- u2 i: q, }* A    ASSUME CS:CODES,DSATAS,SS:STACKS3 u$ L2 X$ E& I# K7 z% G
.486
, m& [7 L( z7 Z6 TSTART:; P: m" M. Z, n( K7 S
    MOV AX,0f000h$ \; [) K3 D1 N) [. U
    MOV DS,AX ...
/ s. z- z0 W& m$ n) G
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。: e6 ]2 j" w1 s/ i4 C3 r- p. |% y& b

0 {; Y  Q2 T. U2 u& m8 t" H. ]0 E还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-3 23:13 , Processed in 0.186834 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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