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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
. y% F  Y# V) B# d! n-s f000:0 ffff'SM'; Z6 V" N; g/ b1 O* ]
F000:BFB13 x& ~8 h. k* e; a9 o
-d f000:bfb0
5 {: |6 V/ `1 X) x* cF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
0 a& E; P1 B' X5 {, r6 JF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
2 k, @' `& i. A3 T2 yF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................7 u6 i. ]) E5 U9 q2 J
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......$ |, N  W- W4 p) |
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
5 K# \4 G& \. f6 O, v" }" S4 c& dF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.( v: h- q0 k- ?1 P; J( |' Q; P
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V+ @6 T. B7 i2 f' W8 _- H
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..8 J5 x% j" P- j( _0 D2 J+ P
-d f000:06f0) h( I- Z& C, q& E( C. b
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................8 D7 a% |  O7 p* o& i( C% V& ]
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
* ^. R- v! f' TF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.5 o5 W; q* C" a5 ~: B4 d0 f
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2. D3 z4 H+ Q9 D2 H1 ?1 F- u9 v
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u6 \" ?( T3 q4 H; c- k
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8.../ b6 Q* {- G5 u1 Q
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
1 w& E5 a4 ]3 T% @+ w  a9 dF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ$ I. y2 N' h: M% H( Z, ?7 F, j7 C- }( l4 c
8 @0 R  _& Q; ?2 D8 p8 W, V

& V* M5 ?* O2 T% V  o2 R我要读出这里的06f9:07
6 c! V3 F" }3 O" w- W( N 然后得到一个(07+1)*64=512 这样来获取BIOS大小-% Q- @9 A% ^' t5 G+ T$ U
5 |9 g- L& O; [! E' N
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码- f; F% d; }& [5 {6 J+ {
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
+ F& p3 z. e0 j1 L0 k2 J3 U正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
# J) c0 [& N7 u9 Y至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:4 i- L, m/ w  V* N4 z1 \  m
.model small7 i3 i5 b' J& \5 M
.386% J/ V& d( m" q% O: w, V$ @
.data
5 a/ p8 V1 x& R' B! ~8 {    SMBIOS_Sign db '_SM_'1 [% F2 m! h2 H) |7 [4 U. W1 N1 Z
.code: J& m) r7 y; m: g4 n( I
start:# U+ Y1 N' N5 Q* U7 v. g
    mov ax, seg SMBIOS_Sign& ?, y3 O  O* H1 c$ F1 b. g
    mov es, ax! r5 v6 M' u/ Q7 R8 @2 m" g2 y. g. Y
    mov ax, 0f000h# n* k& @, h. W) n
    mov ds, ax
4 G6 k6 P$ ?; \4 y0 |    mov si, 0
5 `, z! U& [( Z    mov cx, 04000h0 W3 h3 s+ i: C
    cld
1 y) Q' ]' X! `@@:7 F) X8 ?4 U" c9 J( Y
    lodsd8 {, q; P5 @8 G1 D* T
    dec cx
7 c6 }8 K' q" g: c    jz  short @F
# ]/ Y$ K$ K: M4 Q    cmp eax,dword ptr es:[SMBIOS_Sign]% C, {- [# Q1 E/ G0 E7 s! r* L
    jnz short @B: ?2 M- w' s. U, m1 s
@@:
! B% t. K$ b% @) U5 _- R    or  cx, cx
2 u0 @' q* S. N2 M8 f! Q& ^    jz  short @exit
# J; D' V& W3 c5 Q" E    add si, 14h
7 m! V  ]* M" }    mov ax, ds:[si]
* y# \3 g6 x) D; p9 N* b& @. \1 E    add ax, 09h8 `: q% z/ |1 K9 R/ ^% y% v: }
    mov di, ax+ z. [3 k$ {! |, T- g4 l' B8 i: n
    xor bx, bx
- c( W3 x/ g' {* \( L. J% J# H$ G" L    mov bl, ds:[di]
+ d* x# I# c+ V) @8 e4 y: b    inc bl( X. h5 p1 u6 ^) j% L- Y
    shl bx,6/ |" m, z1 B/ ~( W
@exit:  j) s3 L% v; Z' W; |
    mov ah,4ch: I0 D; l" t( c4 T9 H" p
    int 21h
9 J) T0 i. _6 j1 ~/ C; R" C' D# N8 y& O( rend start& K: N7 L  C" w3 o1 Y
cseg ends
- z' H9 R' V" W1 I: X/ I: n推测你的算法是:, M3 y$ Q$ w* L0 K$ K9 ?# O
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
8 l6 }9 u  a9 T% h  M4 A0 B- A2.找到这个offset2+9的地方的值
2 Y3 R7 k% o( T5 u- ?3.此值加一,乘以64为BIOS Size,在bx中.& Z. u" }! l/ ?( O
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
; z) `5 D1 V% m. b    ;此处输入数据段代码  
9 w4 G/ q2 T( `/ \, y1 W+ K5 RDATAS ENDS
3 [% B. \: a: {+ I
- H9 c. [1 d; g  N# HSTACKS SEGMENT
4 [9 k# z& [! d    ;此处输入堆栈段代码
6 U! |6 X2 ~, m; N9 LSTACKS ENDS
9 P8 a# i% E+ r+ J$ z3 F: ]
7 x1 Y0 y0 k2 [& N/ [) {- w# `, |CODES SEGMENT) _) t; I3 O# ]  N% X9 r- ]8 ]
    ASSUME CS:CODES,DSATAS,SS:STACKS
6 E. z8 e! S  G" T* W6 u.486% U/ ]+ d" e$ a. e
START:% ?3 I9 p! D( j' x: X9 \& h
    MOV AX,0f000h
0 w5 G# ?2 ^* s7 B! d& I) `    MOV DS,AX; i8 I# J, Z, x6 U7 b. f" V" @  D6 m8 x4 _
    ;此处输入代码段代码8 d* j8 n: ^2 \# e) `. a+ \2 {
    mov si,0+ E+ A- L8 k% e8 N" a
   last: , x5 n; e2 b& i# U* U) V
    mov eax,[si]
& |; y& y) M' p% y# v. ~+ x    cmp eax,5f4d535fh) w% x* u( I' F- g3 N& A; A' z
    je over
3 @" H! {  u. F1 ~' L6 ?9 Y, g    add si,10h
2 N6 Z2 M' L9 p! {! @" H5 s( `# H/ S    jmp last& [$ c. M; h' F7 a& ^9 I
   
* ]" c/ j* v* T4 K    over:8 |: p1 ]; y. m) Q/ p4 F
    add si,18h
8 A+ ?$ u2 F, o6 o  [7 d: m2 G    mov eax,[si]1 F" Z0 e' J# a+ p5 [
    mov si,ax
* p& ~* t, V. }3 g& @    add si,9
* j# C' \3 y! a/ j; u  J$ ?/ e    mov ax,[si]# s* y  w+ P: Z8 E& ?
    add al,1. K: R, X: y2 @- _
    mov bl,64( T" |! j2 y2 ~  m
    mul bl: V! W+ p* O- j8 G
    mov bx,ax2 s( j' o$ k/ U
   * e1 _3 W* _, P# U: _  q  q1 ^, g
    call display
& W1 {; D; [6 G/ x- Z+ n    MOV AH,4CH
8 u3 b8 q* h# a' M- K  W    INT 21H  
1 b/ {3 V( J, S   
* H- q4 u0 ~1 f8 R  c$ Y, d) j+ J- c    display proc near
7 |$ s# g& k7 R  E7 [& p$ G+ U7 o   push ax
' d* l! e) w% s   push bx
( T7 t3 V9 D  K! n* N7 {0 y   push cx6 ?7 ^8 L* m) m  i& W; y
   mov ch,4: Z& _" O5 }5 [
  rotate:mov cl,4& I, T, J# b0 I. m4 L& A2 D
   rol bx,cl
8 N9 ?/ u- I3 y" T   mov al,bl
- I- ?" k" ^. r+ o2 q2 u2 }   and al,0fh
' U0 M5 [* t7 E- x   add al,30h
" m4 x6 v' x5 k0 A: w# ~- T4 L   cmp al,3ah- t# t9 }1 K+ [/ P" U0 y; Q- ~! P
   jl printit
! N; J: M3 ]8 \8 [7 {   add al,7h) L. G& x# r5 L' L) I; C7 \
  printit:
. g5 i- I- W5 d" D  mov dl,al+ Y& t1 ~1 y* |/ \7 h. @
  mov ah,2. S7 q" h- l. R
  int 21h
& n& o# I8 D; @, K" @9 _4 x* J' |7 d& F  dec ch
4 x+ T2 T. g: [: i) S/ k  jnz rotate
; w0 j2 I4 C. q  mov dl,20h/ v1 d$ e( Y& N/ M1 I
  mov ah,2h
4 c" `7 b: z$ ~; \) M; m( A  int 21h- D0 C& u( x1 X/ t
  pop cx, S9 l5 b; X( C$ E  \0 B; f( H
  pop bx0 v8 h: S+ k3 \8 k: t
  pop ax
' P* h  a* V8 Z# ]1 y+ m# i: @  ret  w9 N4 ?* f: d4 M
  display endp6 N$ I7 l8 I4 {
, H7 B7 i' }- x8 W9 T/ M4 }1 G
CODES ENDS
& w4 o: j  @0 e0 \* M  n$ |4 j    END START, u9 l) I8 Z7 ~) n

+ F: V; O" y  E% B+ @# ^- Q运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
4 N+ O4 y) G$ c6 P! a& dDATAS SEGMENT
2 d) d, {5 q, z( P    ;此处输入数据段代码  
& c5 f4 h: k  S( iDATAS ENDS
1 a# Y. ?& w+ r' C6 c
* m9 L! X& f( h" Z( _* _1 r. ZSTACKS SEGMENT
' Y% O1 p9 A3 ~6 i    ;此处输入堆栈段代码
; Z! c* M5 F9 p8 G$ C7 z7 a) fSTACKS ENDS7 q4 H8 p/ u) D8 T

+ }1 F) u. R+ z0 PCODES SEGMENT; |. S; @& W5 w9 ?9 N. c
    ASSUME CS:CODES,DSATAS,SS:STACKS
0 O$ t# g$ o1 ^9 Z  u& P& U; x.486
0 R9 P3 o$ R0 S. USTART:7 P- ]/ k0 L9 x/ n4 {) Q
    MOV AX,0f000h
0 K8 m( W! [. C0 ^# f3 n    MOV DS,AX ...
8 S1 p0 U9 ?2 e: x8 ~7 z- ^
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。+ y9 B- @' a5 l$ f0 k- C9 c+ h

: y+ G7 @, \" B# f' n: k- p8 i还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 14:08 , Processed in 1.652333 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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