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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:& y9 N' h8 F$ W" v# O
-s f000:0 ffff'SM'% E8 t: I# I+ u$ j0 ~$ a2 u9 J. I
F000:BFB1( W0 G7 D* x# Q( \( _3 Y3 I; O) K/ L  v" P
-d f000:bfb00 i, l$ V+ l/ r0 r6 m/ u
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............5 B6 o! \& O) I
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...% v! `# A, R& z9 n% D+ k+ b
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
$ o( Y  C7 E$ j, I4 ?& J& }; G- BF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......+ A* {( Y* P7 A/ L
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
7 _) G# ^1 H, a* v; ~4 j1 ]F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
: F# E% h5 D: C" b5 ZF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V1 M6 j" b8 f6 s( Y6 R4 w- r. @, C
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..% e8 Y6 s, @9 k1 O- a$ h
-d f000:06f0" X+ m1 f. V4 o3 e3 Z
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................1 H( N  u' J& m. Q2 a: C8 s0 W
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
8 e! ^+ Z$ V. p# B/ D7 x/ Y1 \F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
/ G4 D* `) A. a2 Q5 m/ Q8 Z& F1 _% uF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
5 ?! P5 [& u6 {. v1 v$ ZF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u4 d% ]0 p' `- `- G) I3 U7 |, V
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
% h/ y! o, e! T* z1 B) VF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu* E: [! S9 g& ?, }4 Z
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
% ^3 g+ Y  Z; P  G
+ K" X% U, v% p- @1 t4 l1 K$ _" ], \. Z3 h7 U+ S& F5 o
我要读出这里的06f9:070 c7 p3 j1 h/ _+ e
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
3 F7 l6 |2 F; j0 H6 @$ b/ d* [9 h5 W- M+ i( l, c
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码4 h7 d1 }" H: z# J. }
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。( Q  w" L" }. n& t
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
1 t& J! P2 r" N至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:, [, @4 n2 r9 q7 ?. Y; Z
.model small
% H3 R8 a; q& p* J.386$ e) i1 S0 I/ y5 T! C( E& e/ j6 Q: {
.data% K: @/ y1 W! b, f8 }( N& \; b) t
    SMBIOS_Sign db '_SM_'
% e( ]& k8 |' ^% [4 V: A2 x: v.code7 W& h* m. J& O% v. H: a
start:8 P( r8 Y# t0 K/ J: S8 {
    mov ax, seg SMBIOS_Sign
5 \$ j$ `/ d4 n    mov es, ax) b8 U6 \/ J! l* o8 d( i5 ^
    mov ax, 0f000h% p& R  C+ ~+ \
    mov ds, ax9 O# q- J" w6 E6 q
    mov si, 0& L/ l4 D7 P: {9 y/ e5 q8 c
    mov cx, 04000h
5 C+ u7 L  p; s9 S    cld9 J' z/ x( _5 h% S& E/ |( z* _- ~2 }$ a( O
@@:7 B/ e" H+ Z0 w
    lodsd) _; i; d3 G* ?! }, P7 J% a% v
    dec cx
; `+ M; H: W& H: z% n    jz  short @F
2 w: Q9 D+ O* S' `/ h$ n    cmp eax,dword ptr es:[SMBIOS_Sign]
+ b- f/ F5 A4 s5 _  c2 d9 c    jnz short @B- y8 y- U9 Z: u8 q7 Z
@@:
& i3 e! H) D' w2 E% W1 b8 i    or  cx, cx
5 c! R; H  c( F  d. P, G" L    jz  short @exit& m7 _3 S9 ?7 {+ T
    add si, 14h/ J2 }- R7 S1 O+ [9 o# J
    mov ax, ds:[si]
* @4 O9 D" R* s    add ax, 09h
3 y. o, s3 A* \9 I    mov di, ax
* r4 p3 g7 R% P4 y    xor bx, bx
5 K' K4 H5 `% Z- U+ Y0 ^) t    mov bl, ds:[di]
+ w% }( I. z8 t" d0 B' _+ `    inc bl
/ z- Y" c$ \5 F    shl bx,64 C/ c* Z) Y/ u$ l9 W. l
@exit:& l. \1 ?$ b6 B* f, q
    mov ah,4ch6 a) F# ~; s. ]" x9 }. J
    int 21h" L& d- n7 E5 j3 P( H
end start
) w( T- E, }1 j) T/ _cseg ends
# M& T* E1 c% f& C+ M. ^. M推测你的算法是:) ~* s$ D# d% N$ _
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
$ F; y( v" a' x) ~  O: W: P" R2.找到这个offset2+9的地方的值& I) o" i/ L: }1 Q% Q
3.此值加一,乘以64为BIOS Size,在bx中., f) Z7 |" ^* {& y
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
6 J  D2 U9 P" |( ]' e7 c( l    ;此处输入数据段代码  
4 {7 Q3 H5 P' b: p' ?, C/ v+ t  [DATAS ENDS
5 ~" B5 w. l' k6 T7 b
0 u+ w* u- e% Z  ^# OSTACKS SEGMENT
& ~! `/ W) ?0 i3 C( _    ;此处输入堆栈段代码
% I  h" a/ e) _. ]; SSTACKS ENDS) E# h' ^$ C' A/ d7 {: G2 k
+ B, Q7 n+ _: s- N( n. r) N. M
CODES SEGMENT
9 R5 G$ P  H# ]) e' {    ASSUME CS:CODES,DSATAS,SS:STACKS
+ B4 Q  l: E) S, D3 K: t. w6 y1 i.486
$ b) c, L* o" K! JSTART:
& {- E' A3 L. z+ u" \6 \    MOV AX,0f000h( a5 v9 H* v* u1 A3 m
    MOV DS,AX. V) F  Z$ ]9 ]" S; ^
    ;此处输入代码段代码
6 \" C. R& |4 t1 D9 s9 W    mov si,09 ~! L$ }" Q: w2 G6 U! Z( p
   last: % m/ ^: b( S7 Z
    mov eax,[si]& M( \# u8 p9 U5 I
    cmp eax,5f4d535fh
; }2 ^0 r6 C& B8 W7 V3 {# u* a6 d    je over
( q6 E/ Z8 J# }% N. D    add si,10h8 z2 P9 y( |# i6 s4 A/ B
    jmp last
* y" @( T+ d# Q% @) n% }/ `   
/ U  C3 E' b6 S  k  w/ L    over:
3 a+ k: i0 ~* l* e/ _    add si,18h
: O4 ?" ?  M6 t! w6 r' S    mov eax,[si]3 b1 v$ m# n9 Z) Y
    mov si,ax) {2 D& _4 q' Z1 S8 X& e! N
    add si,9  u6 P6 w; `9 C* i
    mov ax,[si]
: c8 B! |: X+ r, W    add al,1
: V% ?& t; o0 o/ c7 ?+ ]    mov bl,642 D6 X: p- P$ W3 f) A" M
    mul bl: f2 \; u! O- f: b, r6 B
    mov bx,ax
! ]6 A' a" N4 X( \3 n& ^   & ~( ]/ a4 K$ N0 V  l5 L+ l
    call display
0 ^+ n! O4 K' N4 z, {    MOV AH,4CH4 g5 x! x9 C' k
    INT 21H  9 w5 L4 s2 F1 P! V  y* K1 }
   
: _' c$ }: A3 y) y( ?    display proc near! u9 Y: h+ x# y1 P/ E
   push ax9 T5 u- C. n0 O
   push bx- `/ g2 [6 Y0 d' G
   push cx
0 \1 c  X& r# |$ x9 M7 i   mov ch,4
# @( Z0 [  E5 e/ d$ {2 [  rotate:mov cl,48 _& z2 c! y# u8 _2 p' W5 w9 k
   rol bx,cl
' W  v( I0 v6 E( W3 u   mov al,bl# K: w9 R( N$ H$ u; A2 f
   and al,0fh) R% S* k. z/ c6 L9 ?4 y5 |( _0 B
   add al,30h+ P1 N# O8 d1 Y/ C0 [
   cmp al,3ah
, W$ `7 y+ F& `8 s+ N   jl printit
7 G9 {, I8 z& V2 C  \   add al,7h
2 \/ w" a# {  H, q& w  printit:
6 F% N5 ^# `: ?, C) L; G2 [  mov dl,al& \4 P' {* {# x3 k( c
  mov ah,2
: k7 k7 z2 Z& W7 A+ \: w  int 21h) J( N9 k; q/ n6 f( G  [1 C
  dec ch9 ?0 t; L, E9 m1 q( k) G0 L5 Z# z% v
  jnz rotate) C5 U5 o5 k& P. I  g9 J( P
  mov dl,20h6 P6 @! I* ]! ?9 ^' D% }8 n, |
  mov ah,2h8 @) r& a8 i2 H5 J
  int 21h* i: l/ D. j% G- C
  pop cx
/ M$ B, o8 l: S  pop bx
# e; J! H; z) e: t  pop ax/ ]/ h  q" V" L; O, q- A
  ret
1 @5 I$ A* K4 y$ Q: F9 z  display endp
  Y' W  L  j) U$ d8 K
$ K2 H- Y8 c$ }" d1 s5 M. eCODES ENDS
/ w1 J7 r; F+ D! E3 x4 N1 v    END START, o2 d/ F9 `% g% @

9 q/ _. p9 J6 O. @: R% ]运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun6 b% `, r+ g1 m- F& x
DATAS SEGMENT6 J' G$ {; d- q7 m
    ;此处输入数据段代码  
5 L. g( b8 ?3 T9 H0 ODATAS ENDS
" h) P+ g% r* ~# Z' n6 n' W! S$ N* n" {! [) S: X4 A- P
STACKS SEGMENT% S. p* a+ C1 A8 u) v& z
    ;此处输入堆栈段代码- E! |( y7 F% L
STACKS ENDS" z: t& u, x- n' t
; P" ~; N, n. e2 ^
CODES SEGMENT; ]; r5 o( A0 d+ c6 h3 V
    ASSUME CS:CODES,DSATAS,SS:STACKS7 M2 T% Z2 a( y$ \
.486
  p9 F- z% s; aSTART:
* q9 {* O- r+ J$ b  @& }    MOV AX,0f000h
) ?6 F* l1 r' f. p    MOV DS,AX ...

3 z  B) ], v) R% H) O! _/ X二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
% A2 }2 ]1 x7 F# @% l
% I1 @6 I* V: I' f. S还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 01:03 , Processed in 0.044111 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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