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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
! D6 J  U5 |. D4 N, p-s f000:0 ffff'SM'+ Y$ k" Z2 h, S- f8 i2 @9 \
F000:BFB1) H! `& t+ I6 I
-d f000:bfb0* ?3 q: m7 U7 U1 G  K
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
: ?. B$ y" C5 O4 rF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...# G: Y+ K9 ]3 ]1 a
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................+ A* H9 w, p4 e7 }
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
( C5 ?. x! g+ yF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......( p6 G. ~3 e" `( L. `
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.+ I  W1 D! D! Z
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V3 D; F( Y" t& o( f: J
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
: c! e  l0 \$ h! \+ x  B( q-d f000:06f0
6 _: `% B" p7 n+ e. O. VF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
# l) Y9 ]1 W; J, ^F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
: [: S3 V6 g) |3 g% vF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc./ V. t8 m( U2 t8 G2 C# W
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
( D$ I" `; {1 [. Y, U5 BF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u1 V, G- @2 k* U3 X+ J8 Q1 ~
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...8 Z, G# b3 v; l% S8 I
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
6 c) T1 c" ?- l2 @5 x$ C2 oF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
* Y. ~( ]# W9 s6 [! ^) q5 h- t5 I* s+ V$ O

/ j! u* W9 }; h5 Y9 ], U8 J我要读出这里的06f9:07
2 [" a8 J; L- _ 然后得到一个(07+1)*64=512 这样来获取BIOS大小-* C% M$ C+ x! u2 H. x9 w5 Z* T+ `
- f; l& P6 W6 {, [  k- _& ?
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码$ i2 l* W! J* l% U
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
1 j) ?0 T& ]0 P& v( N. W$ U& P正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。( f- F. I# o* B3 `; g4 r6 B" L
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
& V9 f2 m  j1 U4 S, i.model small
, ]  v( @+ ~$ I0 b' b7 K.386- b  E- A0 t' P1 n) f: ~9 k' D
.data  Y7 @& A  b6 L% v8 z
    SMBIOS_Sign db '_SM_'
( l5 R' o/ p8 L9 L.code
. \# ?/ h) Z* |! Y( e5 A5 Bstart:; S5 J' K+ y# j  y
    mov ax, seg SMBIOS_Sign
! {2 Q' h  {7 ~: J  r3 ?0 c4 y  i+ ]    mov es, ax
* Q% G0 l$ |6 ?' [' }    mov ax, 0f000h/ a4 ?$ L4 {. k9 p
    mov ds, ax" f  ]# l! S# D* ~+ C1 p3 `
    mov si, 0! Z( z0 L5 |8 O+ Q( r( X$ D
    mov cx, 04000h
6 Q0 X9 G) }. F# D  q3 E    cld& j* s3 G( z+ q* A2 x* r
@@:! t  K. C( o+ G, q9 ~
    lodsd
8 ^% Q" r: R+ _% L; s    dec cx
6 U, y- U7 {  L/ R' }& T/ y: d    jz  short @F9 y0 J. A4 w4 R8 t. q
    cmp eax,dword ptr es:[SMBIOS_Sign]
% R" v: p3 _4 i$ s. }; d    jnz short @B) H7 R4 ^* I* y0 X
@@:
6 @. ?) v1 w  ~3 |$ f$ Y8 @! P" C6 ^    or  cx, cx3 ?6 j9 J1 }$ ?8 Q
    jz  short @exit
( m6 L3 }: k  b. f+ s8 ]    add si, 14h
2 b% ^) R7 L0 y# z    mov ax, ds:[si]
: n6 N5 u2 K! M1 r    add ax, 09h
3 i7 x0 X  `0 m+ O    mov di, ax1 n+ @2 O5 ^0 r7 Q& l
    xor bx, bx5 C0 E6 X/ j) y
    mov bl, ds:[di]
$ h/ G3 v: [, R4 t2 i: s- e2 Q4 c% f    inc bl3 A6 U, W' w- B8 W8 v
    shl bx,6- s6 \( w: x3 f9 R6 [8 l# a! z
@exit:
/ l! G9 s- h. |9 T    mov ah,4ch
# R- q* f0 K, _* m    int 21h
) C3 M2 Y( ?- ?9 K7 n- ]end start7 ~5 p. t" ]; x; R$ ]' o& V% m% Z
cseg ends
7 z/ V# l8 S* ^* b) O5 e推测你的算法是:0 O8 u5 a2 |: r. E: L" N
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
( F: S0 K8 |! ]. E, c( v) a  H2.找到这个offset2+9的地方的值8 d; c' O4 E7 `; D: n* N
3.此值加一,乘以64为BIOS Size,在bx中.
( d9 P% v$ Z5 H' r不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT. q( b% u. A) F  i5 ?
    ;此处输入数据段代码  
/ H; T' A% c7 T7 J1 Z; z+ UDATAS ENDS
" h; @0 v0 ^; `1 }6 V( Q  Y$ ~  w7 E$ d9 h) J: z0 i. M- ~/ Q7 x: l
STACKS SEGMENT3 T- ~* r' C2 k! B& a* W! h
    ;此处输入堆栈段代码5 w2 L$ o8 v4 m# ~7 u# N
STACKS ENDS. L: e# Z3 W, w7 H" q4 ~
( C4 X0 r$ H( S; J) N
CODES SEGMENT
4 J1 Y  H: d' j    ASSUME CS:CODES,DSATAS,SS:STACKS% b' i+ b7 ^9 ^  \+ i3 E
.486- j, n. d' W5 G
START:& v# I' Q* W; u$ l, b( f
    MOV AX,0f000h8 D) O' _  U# h9 ]" M8 Y
    MOV DS,AX" c7 _+ |' n  O) i6 Q; T
    ;此处输入代码段代码
; R6 `7 Y' D6 G1 S* b* J2 r8 m3 r    mov si,0+ G" E# v$ d" V, _6 L2 n% h
   last: & P( r( e# n' f5 ?" l% F
    mov eax,[si]
% g# b+ N/ ?: W0 T6 W* U    cmp eax,5f4d535fh
& P& c: Z- ?; e9 f( F    je over
* i) M4 X" T. F  F0 J4 P$ D/ \* |    add si,10h" I# S" |& Q+ X
    jmp last& z1 R% T# O( D
    / Y# {6 K  Y+ ?4 S9 p
    over:
7 [' O; L7 C0 H5 F$ N* q) g' @$ [    add si,18h
+ \% D, ^; y! c* |8 ~    mov eax,[si]0 [6 v! y6 x9 H  Z
    mov si,ax
$ k: d+ i' ^3 \9 B' N/ }    add si,97 E+ K* h5 A. }" t( F4 w0 _+ i
    mov ax,[si]
: g% G7 r6 u1 ]7 [" q+ J9 J0 j9 [) a    add al,1
* n6 N) D/ l; g3 z. h+ v3 H    mov bl,64; ~4 ?( V5 B+ V7 y0 _
    mul bl
$ p: ]' ]" z& L9 s    mov bx,ax7 r1 L" m; l) l# j/ D, X% V
   , I! P0 M7 }0 d2 C1 X  k! W. p; s! N) p
    call display
2 z' U' p, o- e    MOV AH,4CH6 X9 t8 v  N( ?# X) T2 ~$ b
    INT 21H  / N; l" @+ g; ^' b
    7 `$ E/ B. N# v6 r6 o( w+ t" U6 I; k
    display proc near* i0 g0 e$ i  ?, i  \
   push ax
: V$ m" O: C. o$ X0 ^   push bx  n4 F9 f0 r! C8 _/ A* ^% j
   push cx
8 g' F% ^2 b8 m7 h' r   mov ch,4! e. ?! a8 F- @+ d4 N+ }
  rotate:mov cl,4
1 \8 m( {5 }4 i+ A; c9 }   rol bx,cl
- W. U7 }8 g+ Y  D   mov al,bl/ M6 Z, ~, g* P2 s" l
   and al,0fh
- Q! t6 b3 U8 `& w+ }   add al,30h& b, F8 j" _. B, a! ~
   cmp al,3ah# m: q, w" I6 x: R7 J9 w, Q, \
   jl printit, J3 M5 \' V) j! F0 J
   add al,7h
& F( f' P- g% Z+ ?) M% e" k  printit:1 ?# Y, y& w8 Z7 l7 k
  mov dl,al
* F( E8 p6 }/ i9 m) {9 H  mov ah,2
# s# A" Y. h$ O) v  X  int 21h* @! w+ v$ s! l$ g, s: y: `
  dec ch
2 D% G; z" R3 h! o. V  jnz rotate
0 w3 L0 E: @3 j% l) d  mov dl,20h6 p2 e; w$ b5 e) Y3 ~. c( r
  mov ah,2h
' V# H- g+ q# L$ u  int 21h$ Z. J% v: a3 a& T/ a' B4 C' v0 z
  pop cx7 N% R8 l6 a# w& m% C. \! `
  pop bx
& `( i* F9 z% y5 a( z  pop ax% ]- R+ j8 ~$ `/ V( ^, O
  ret$ {, ~  }$ M) l2 N) S0 w
  display endp+ [' F6 A/ |; C" Q( \; l1 v

+ E7 {6 p8 b9 r# w3 l: CCODES ENDS
7 v6 V1 L& `+ w    END START! {) ?* @" g) W3 O
0 e0 U: q+ y* _  ~  h% p. V9 S
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
% c% d0 ^' W2 m( g" {( h' G: XDATAS SEGMENT
, C, R  F3 a+ h    ;此处输入数据段代码  ; z2 h3 b3 a, n7 t1 r; u1 s" o2 \
DATAS ENDS; f9 n" o1 R; H2 W$ f6 z
. x1 U" ]3 R4 t' n! j
STACKS SEGMENT
  n7 ]' j( H, f: B) |9 Z    ;此处输入堆栈段代码; d7 G6 A$ M9 m' m2 m2 G* I
STACKS ENDS
0 |3 K6 w( \1 i; z$ ?
2 b# ]( S4 H: U2 E, y2 G& ~6 }* XCODES SEGMENT
+ e4 F; Q! {9 |) \1 B3 S5 I    ASSUME CS:CODES,DSATAS,SS:STACKS
) Q* H+ Q3 L/ e8 r' `2 z.486
3 q! [5 _/ q( k* P# ?( X2 t; \5 mSTART:) {% y3 x3 N( t8 B2 T. a
    MOV AX,0f000h
' ^+ j; x1 m3 R3 ?* ?1 m    MOV DS,AX ...
& K/ t5 J4 {8 x
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
: R+ j9 r: d2 L6 g* j4 J. \$ a2 q( j9 d$ K
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 19:18 , Processed in 0.063679 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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