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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
" d4 s$ t, M3 m% z- q$ q- M# A" ?-s f000:0 ffff'SM'8 K6 v7 D( O) z, |( i
F000:BFB1
; o+ h8 }2 z4 b1 E8 n+ @-d f000:bfb0" L8 {* Y& }1 I- z6 l5 W0 G
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
4 J) ]% X  Q1 s8 KF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
  U3 m0 r; s/ }6 fF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................4 }# p! d; k1 f; I  |7 t
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
8 N" ^1 k5 i3 i% t; O+ AF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
6 C1 x1 Y% W& l% F+ h: t7 jF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.+ b( }. \8 e* V
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V5 Y/ X& x6 a3 f* E. ^: S- R
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^.." ?$ M; a- e# |$ ]
-d f000:06f06 @) H2 h4 |  D1 k
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
% ]- n9 v9 G+ b- _8 Y4 o. ]; O' ]F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
- N0 X0 @( w; E1 [; r2 C: J) LF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc., i  n" T4 Q; q% t5 y8 e. W
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
* w2 U( c9 M- Z! ?; Z1 T# l, h) V3 wF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
: W( V: C1 `# z; X; S! ]F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
* e5 U, T6 N  H$ _0 C9 E, a9 A) R) iF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu1 y* j' E. C: F3 J# A4 v: V
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
, D  h* P# |% @% G. V' X
' |3 r5 ^9 o0 T
+ c: f) j  V# M! y& M( E我要读出这里的06f9:07' Q: Y7 Q) u- P
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
% H* v; B! P0 f7 ~4 p2 a4 T$ k4 p9 Q2 W# I  ^
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码3 ]9 B( G% {( Q- a; ?
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
# C# T: T6 t6 S4 @+ A3 d正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。# Z8 Y5 c& t# A" l1 y, B0 X
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
3 u# h3 {8 m4 |+ r1 g( A& g.model small" l& K2 V' |% u& c9 C
.386
( p" p/ R3 Y( S) R.data/ f. K6 D. o% [" L+ [- d
    SMBIOS_Sign db '_SM_', v, L/ {: I9 J0 m) G+ I
.code
6 M8 {- x% k  Xstart:& {, O% s( ]7 p3 f! Q( ^
    mov ax, seg SMBIOS_Sign6 O, {) A7 S  t# |' P# s- V. g  Y
    mov es, ax9 h) D4 S) U9 ?0 _
    mov ax, 0f000h" j: h* \7 L3 w" J, r- K  y
    mov ds, ax3 g+ h; ?7 e5 }, F
    mov si, 0
' M# g$ S# S4 D8 W& m    mov cx, 04000h( ^; y  _9 d$ y( x- m; Q) h
    cld
. W( H/ s& S$ ?: ^$ L5 p+ }@@:
/ u8 F2 L6 o, z' h9 Y  Q4 M    lodsd/ Y. L$ Q/ m2 j) h& |6 t
    dec cx2 _9 |8 P" u* a4 E# p
    jz  short @F
2 P: E" H* b( ^: ?    cmp eax,dword ptr es:[SMBIOS_Sign]5 z7 g9 z0 I( y3 q5 g9 e! F* z! d
    jnz short @B
% F# e3 K; e- ]/ r& U: G+ E  }@@:
7 x$ F- f$ J+ T  g' j6 T, z    or  cx, cx
5 y1 Q6 p! _" |    jz  short @exit+ z: S1 \. ?; I6 C  a# O3 e  m$ H
    add si, 14h+ c! r' W3 N% t. b; ]+ B1 t
    mov ax, ds:[si]
! _9 N' @3 q7 }    add ax, 09h7 Y  h, N% {- ]* A9 {1 j$ E, P# R
    mov di, ax
; {# w! t& U% r/ l. m. I1 a    xor bx, bx
1 C$ F( p; A6 l- R4 a( U    mov bl, ds:[di]3 o. d8 H4 ?5 K
    inc bl
9 D" \; T5 K" _: d0 D  b4 e( I5 f    shl bx,65 }* a* t8 P3 e0 i/ ^+ E
@exit:
1 n9 F& W8 B; v; O+ h7 ^+ ]    mov ah,4ch" p! @& G  \& K" _$ `0 i) B
    int 21h
4 k' n( E* g) [$ e" \& f1 Aend start' ~8 e2 j  q% w  Z6 O, p; l; s2 x* [; V
cseg ends/ v9 x* x1 c& r6 E: b, d# {
推测你的算法是:
1 a, y: `+ y4 |$ w9 w) n, {1.找'_SM_',然后在其后offset 18h的地方为下一个offset28 h+ Q' n- Z( a, y/ q& i2 q/ C' c
2.找到这个offset2+9的地方的值7 J% d( D! |! P4 b
3.此值加一,乘以64为BIOS Size,在bx中., g/ q3 x: {0 X' y5 v% L( H
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT8 E2 j: h# p. t4 T
    ;此处输入数据段代码  0 N9 a7 Z6 p# D9 k% L
DATAS ENDS
4 X6 y+ f5 e( B1 E) N( a% _5 l  O; ^9 n( {7 E1 M
STACKS SEGMENT
4 D6 j" Q  G/ \- q1 b    ;此处输入堆栈段代码( M& V5 {) l; ?# I, b8 r- R
STACKS ENDS) p+ q  [* y3 ^# t
: c7 R3 X1 |, E* J  L) F3 @
CODES SEGMENT# n# D$ D3 I7 s% B
    ASSUME CS:CODES,DSATAS,SS:STACKS. k' B) x, i1 N- i- O
.486. O  |. O5 M# V% b
START:+ H* \6 v1 v& b9 V! m
    MOV AX,0f000h, `9 k/ Y% W: R6 e+ Y
    MOV DS,AX% Y# I; G4 K& V  l) r2 }8 u0 M
    ;此处输入代码段代码- Y$ i* S( b2 n( |% `) G! J+ L
    mov si,0
4 U' X; [; F* ]: d5 C   last: ; O9 }' J+ y# i7 }4 E
    mov eax,[si]' G- r$ i. m$ Z7 G& m
    cmp eax,5f4d535fh6 Y* q' n! q$ c3 Q6 G8 n3 L
    je over) A9 j$ u- q% l7 t
    add si,10h
" K: \) b- W' Z5 u. ?1 V    jmp last7 c- k' U' ], j3 V. W* P  X8 M
    * X& z; w' Z1 @* a5 m
    over:
. {( Y0 ~. j5 D/ b4 G1 X; j    add si,18h7 ?4 |. e6 Q0 P0 M7 A
    mov eax,[si]3 ?+ L0 q% B3 R" Y; O
    mov si,ax0 `; V4 j: f, a( y
    add si,99 d- ]* G* B" j- E
    mov ax,[si]  R( \9 _6 J  A5 O9 z
    add al,14 R5 a5 y* L9 k( x0 Y, W8 s, F
    mov bl,64
, m$ a, W3 i' ~8 O& D    mul bl* i( y. n: w( F9 e8 l
    mov bx,ax" U) \$ Q) {! S  l# L
   
% f9 ^+ {% b1 ]* `- j6 _" R9 X! ~7 K$ {    call display
& ?5 Z5 e6 T  d- L# ?6 I9 l    MOV AH,4CH" C/ u* o1 n! i' P8 \; q+ u* S
    INT 21H  
5 B7 k9 C) S9 W0 h/ ?* ?7 q    * `# E' A' F6 ^/ v" I
    display proc near: B; M! q; {4 M( L5 M4 m  E. B
   push ax
+ `; S. w3 d5 P- z% l8 Z" }   push bx* i- e5 w) o; U! Q. W! y5 `# O
   push cx
3 L% h7 c- f' [* E, m2 l9 |$ d   mov ch,4" ]) X% z3 w4 c; j
  rotate:mov cl,4
$ [# r% n6 }& z1 O8 U   rol bx,cl0 V9 X9 L$ s* h4 h
   mov al,bl) t$ L0 W! u! ]2 t9 l7 a* [4 H
   and al,0fh# O) W/ c8 q2 K  V5 O
   add al,30h
: O( J& N1 w9 w- O, o   cmp al,3ah2 A. @; k: N+ c) u8 @, ]% N4 ]% [6 L
   jl printit9 l+ X* N: N# v1 u, o& I
   add al,7h2 {+ N7 ~% o: N6 H
  printit:
8 U- I9 g6 [' H7 v- Z  mov dl,al
  q, e2 l# t0 f3 V  |9 L  mov ah,26 t: x0 h, J1 ]
  int 21h+ s5 B  G4 M5 [6 S  ?7 B* ^
  dec ch- c$ }1 X' s& y* {& r  g& p+ o/ B! r/ [7 n
  jnz rotate  Y$ m' t" y1 X$ o* z
  mov dl,20h
6 v  F, g  Z+ W  mov ah,2h% V: Y, j, m- {0 f9 X
  int 21h
! _6 E0 k4 k# t  pop cx
) b2 J) m2 v3 |9 H6 |! T$ P$ K  pop bx/ V* b8 p% b% K8 H1 n! ?9 c
  pop ax
& k% u" z6 m+ r* L+ ]/ @: j  ret5 y0 C8 L( R" J% M
  display endp
7 F3 k6 J! S' f5 U$ l% z  u6 k; z4 E$ E) N
CODES ENDS
+ L5 l! x. V$ q6 ^, A3 |! U# g    END START
, c% f1 y! o% `2 e
  w) L2 _5 Q) G: m运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun; P4 |" O8 ]4 r' P; L
DATAS SEGMENT2 A, c- o5 ^1 V- {
    ;此处输入数据段代码  9 s  \" [/ o) G$ K8 `
DATAS ENDS
) K; z# b# B- \/ h
( Y! z1 v- q  X" D& V& w& xSTACKS SEGMENT
' u5 R( e3 y7 I( Y( k& ~( Q/ V    ;此处输入堆栈段代码, Z& a# n- k# U
STACKS ENDS  F, `3 P9 S9 r$ l: u
4 x5 W# B  U3 }- y+ V( ^( s
CODES SEGMENT, ]$ [4 ^0 f9 Z& X/ r& [) d1 H
    ASSUME CS:CODES,DSATAS,SS:STACKS& m& j8 X' t! Z1 M
.486
8 W. k- E, ?" C+ J6 C; XSTART:
$ ?0 e- J  a/ c' b$ ~8 M    MOV AX,0f000h8 A9 R1 u. h6 w9 {
    MOV DS,AX ...
! a- E& b0 B3 b
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。5 j# V1 `! I" {

& g% @9 z- j! T还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:16 , Processed in 0.033067 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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