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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:% B" |/ m& }8 y7 `0 d7 n
-s f000:0 ffff'SM'8 L, _/ j/ q. h+ }0 _4 a
F000:BFB1
& G  N: F& e1 o% _& K* S-d f000:bfb02 m+ V/ ^9 q4 H- k* u* P. n- M
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............' J& L. n5 u3 k5 v' `
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
% k2 U9 A9 j" a( I7 N& d5 SF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................: ~% N  Y! Q9 e( V- w' x- a
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......3 H9 X- k" s! q! O1 y' \! Z
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......! p8 F4 r/ z2 y/ n; z- }& |
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.( g* u5 O/ k% g; \# t9 `& n* g! f  Q
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V9 K1 F5 D9 j9 ^" L0 v
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..( Q8 i& M# J  O1 V& [+ j, i6 J& @& B
-d f000:06f06 V# z3 P$ T" W+ w
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
9 J6 X4 l7 Y1 N. S' t7 M) TF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American, X, V; j5 I% y  P/ j
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.# @2 D/ n" }2 N& v. q1 y! G$ A6 t
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2( N6 f$ e% P5 ?' d" o% G  `
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
) n2 `7 K" m1 U  M  N% a% mF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
4 M# L; j* v, V, L& {( k# YF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu8 y$ J1 q& y( _' G: X2 N6 G
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ7 ]2 \  S7 v" z; h3 E
5 u* v% O% |' J  K* [
: Y5 ]  N0 {' B( h
我要读出这里的06f9:076 Z, l' ^: [/ v+ T  z) l
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
5 r3 f# N, [1 N% P+ }( b4 \( v/ Y/ v
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码/ O- m2 W( {9 }" K! t) o! E
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
. K7 ?4 R4 G+ W$ Q! e1 s9 b" W正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
  Q5 m* n9 S" l; j1 t- I' V% r至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
4 K. c. g1 n% h7 E% U. |; u9 X.model small( `/ o7 \# f- Q1 M' B8 [' e$ ?
.386& S/ B( N, p9 q6 \( H1 W. s
.data
$ h/ P+ R- t$ r    SMBIOS_Sign db '_SM_'
  t% F+ q& c& S9 w) C9 F.code
6 Q! [+ C9 {/ H8 b! h1 J$ Jstart:+ S  e6 S* O9 ]7 X" D+ p! Z
    mov ax, seg SMBIOS_Sign3 ^2 g' g: b! E7 M2 G9 T5 ^8 w" S
    mov es, ax
2 V) t# W! I; u! B8 v/ A    mov ax, 0f000h
) m# L' F" f9 l( P; K) @3 h  M    mov ds, ax
# L7 X% n6 F- g8 X    mov si, 0. W4 s/ D7 w% u0 H/ k. X; p0 }
    mov cx, 04000h4 _6 a! `" _( {) b9 N
    cld
& k: A" K) W. _- b6 }@@:
3 a. ?6 v4 k* {    lodsd
7 q6 m/ l* j5 [4 }& ]    dec cx% y; t6 \% h" a4 P
    jz  short @F- N, a9 B$ T/ G" ~: |; A+ r" ]
    cmp eax,dword ptr es:[SMBIOS_Sign]; P! S7 ~  Z' h: H2 O
    jnz short @B- U/ g' L, C5 d: t+ v+ m+ A
@@:
/ K) r2 W. q" S% D' q: Q    or  cx, cx# D7 {- }" e/ T, Q
    jz  short @exit/ `  G, @  a, O4 g& _/ _% q
    add si, 14h' K% D% V0 I2 p* ]
    mov ax, ds:[si]. K' R7 E5 V5 U6 w
    add ax, 09h
& L+ s: ~1 L& _9 [- g5 y    mov di, ax, }+ d6 N! A% W
    xor bx, bx! }3 s6 G) g$ R% j! {6 X" @
    mov bl, ds:[di]  _) S" i' H: T4 M7 T* B% K4 V
    inc bl
) ]& `. ?) A+ a    shl bx,6
+ J7 \6 m, w/ q@exit:
2 R1 ^2 o+ g6 V. M6 |  r    mov ah,4ch
# m$ M) h- x9 E+ [    int 21h4 t. H* S# _" g: q8 r3 x
end start. f; ]* \9 B5 l7 O
cseg ends/ h8 S! \  l: A7 Y
推测你的算法是:7 e0 ]/ J! }1 k  ~9 Z
1.找'_SM_',然后在其后offset 18h的地方为下一个offset29 i! N& o5 V; D8 T/ q
2.找到这个offset2+9的地方的值' b6 I6 I/ {% ^! ?( a! B5 w
3.此值加一,乘以64为BIOS Size,在bx中.
3 y5 p0 ^+ _. n  p不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT" m2 W( h+ f7 C) H3 [
    ;此处输入数据段代码  6 m8 q3 E" L; H# `0 D
DATAS ENDS
8 A2 Y4 {+ N: i. |. a2 h6 m5 d' U3 X. S' X
STACKS SEGMENT8 _9 A& d3 x( b3 K* m9 w( t, K
    ;此处输入堆栈段代码# t% K; @0 X" V
STACKS ENDS% `! M6 o( q" s( F; o9 {

! m: m) }( W2 u/ e! m# A7 iCODES SEGMENT$ }$ G' Q: b) a3 ~# h4 j3 j6 `
    ASSUME CS:CODES,DSATAS,SS:STACKS/ Q/ o+ ^& {! f
.486
* L' w! J' G' uSTART:
6 j7 z: j$ k4 Y3 U8 l6 H    MOV AX,0f000h% t) D* U+ k9 D5 _
    MOV DS,AX+ O& ?/ A9 Q7 [6 Q" g9 J& Y
    ;此处输入代码段代码
$ p+ f/ D. r# m    mov si,0' k- ?% P; Z, E6 ?) I
   last: # @% Z2 ]& s7 R  L1 @. F; z- i
    mov eax,[si]
4 I2 E: C4 C, A    cmp eax,5f4d535fh
% ~! ~8 l! Z3 E9 m& n    je over
5 N. D' X5 l* U    add si,10h
/ k, X) `+ X2 a2 a$ D3 l0 y* H    jmp last- F0 ]- G- w' W' {- T" `1 e
   
" \+ u7 g3 k& ?. l0 v2 K; O    over:
$ c+ U" R) A7 I: @2 T    add si,18h
& _/ c1 h0 Q. ~+ u2 N' g/ [    mov eax,[si]
$ o/ C8 T0 L8 L" a. I4 {/ X    mov si,ax$ Q- y+ ^/ E  B  z
    add si,9
% u( h. ~' ~* P7 |7 z0 d* }    mov ax,[si]
+ b- U+ Y5 {+ f    add al,1
7 Q9 f: T* K1 F    mov bl,64
; F# b/ O  Z- y4 |  O6 \    mul bl
. R: U  q6 w7 `0 s2 ~    mov bx,ax
/ I, p4 q! V6 G9 E" ]4 J   3 @& _) D6 d( u& p
    call display( J4 J2 _, T0 e" X. ?% M! j
    MOV AH,4CH
" ^5 o! G6 `' k; I    INT 21H  
5 R$ v# d) O/ c5 {/ n9 @      @& v0 {) v' \, I/ G5 K$ l: _8 Q6 g
    display proc near, x0 y: ~% N) r% i" h" |- v
   push ax' T/ F1 A2 q& a( [  u& ?
   push bx! b' ^6 [! \! N# q& X6 h
   push cx- O6 Y) c$ L8 [* B/ }$ Z; F
   mov ch,4
: y0 y( U" n, g9 c2 P3 [" G! Q  rotate:mov cl,4
: G* J# K3 ~$ j- c. `5 u/ ]# f3 C: O) q3 u   rol bx,cl
2 E1 h- t: {$ a4 }3 c   mov al,bl
' P) u: A* O" [* m3 o9 l1 G- G( O   and al,0fh" O" `7 F. B: f% f8 L. m
   add al,30h/ L% r. i8 d8 E$ ^! J
   cmp al,3ah  g2 E' s8 c* C3 P& `4 H2 M' s
   jl printit/ ^, T* @# V$ v, L& ?
   add al,7h# \, o2 t2 d% i' |* B
  printit:) @) b: M. P- v4 p7 Y
  mov dl,al
/ l7 J' Z7 \& E% u; ?7 u% m  x  mov ah,2& c3 k+ l7 m( M. F; T, [
  int 21h
5 d* R6 a8 O; ^0 d& M) J  dec ch
7 n; I" d$ j( L4 s7 s) m1 Q3 N  jnz rotate
$ R% Y( O# Z; X  mov dl,20h! A0 y+ R. y: ^8 @! y: Y5 T
  mov ah,2h
. P8 p' V- s' `  int 21h
% w7 M' }$ T8 ~( q4 ?9 a: R  r  pop cx
! l5 ~! s0 k5 ?( F; z3 a, A  pop bx
) i  v! l8 w, \  g* P8 R  pop ax
4 d  `7 a" Y- ^  ret
  a' N8 {; E& z; a( D: t  display endp5 u& z2 q4 H# Z

2 P2 w. g5 V; s2 m  _8 p6 uCODES ENDS1 s# s0 M& B5 j2 [* w
    END START& v* m; ?9 a7 E

3 k- j6 l* r# @& u# U1 t% b  ?: H运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
  z- N! v9 i* f6 G3 s+ QDATAS SEGMENT
7 E& C3 c: ], B' g    ;此处输入数据段代码  
5 S" ^0 m: F# P6 ^' XDATAS ENDS. _$ _, l5 }) @4 Q, x

" v5 I7 H+ b8 N' L( oSTACKS SEGMENT9 J1 s! }0 {% {4 G8 j; d# D
    ;此处输入堆栈段代码' `7 l+ @5 a* W& r. a1 g' y6 J
STACKS ENDS
4 X. ^( ^0 I3 e
3 i2 l$ P* s/ k1 o- X' VCODES SEGMENT0 J: {5 V) g+ m% E; C
    ASSUME CS:CODES,DSATAS,SS:STACKS
! i5 e; F5 t9 l8 [0 H! U' a.486) w1 m( ?' e- e' j& C
START:4 i1 v$ D, _+ n6 X" b
    MOV AX,0f000h' _0 \% |  h8 M9 N& M
    MOV DS,AX ...
7 v0 d" T1 E) A- W5 Z. C
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
# A6 N3 l: ^0 \$ E3 w! V. S# T* `* i4 `6 S3 D: p
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 20:28 , Processed in 1.398728 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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