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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
" Y) P! s* d* J- x-s f000:0 ffff'SM'" |" p- v; j2 ?8 F
F000:BFB1
7 D0 w: s, y; ]-d f000:bfb0
+ G5 p1 r+ D7 q/ A' O  [F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............9 y! l, m+ R6 u# ~0 B: v
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
# Q( ?) K1 J* h# q4 K; IF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
2 a4 _& U% |0 A; G% WF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P......." q* X7 ~% J' V9 ]/ [- A9 k
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
( Z1 L5 E) \% t3 iF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.4 j8 |( n! N4 U3 e  p6 A
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
% T8 g. \5 o: V# nF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
! ?1 L* p" w  [# `8 w-d f000:06f0
, i5 `; Y* h6 K: q% V" @% E& fF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................5 X1 b; {4 o# X' H- B
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American5 p- e- d2 ]! n
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.' u* ?, o. d& Q! v& x% j5 _
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/22 U+ Z/ @8 [3 X7 F
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
/ W& i' j) I3 nF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...4 N2 H+ b3 M: f& u! G/ _' ~+ [
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu# Q* b6 a+ d8 ]# T
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
' L$ G* b5 ~* r
. n0 X1 ?( o7 p1 R' }6 V4 L* _9 Y! V: Z) L  }
我要读出这里的06f9:070 g7 N- ]( _# Y) K" ~1 A
然后得到一个(07+1)*64=512 这样来获取BIOS大小-: c; r4 n2 @; \4 G6 n+ F
% ~+ h% {. Y4 X% Z9 p% }, h
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码: g  k5 M; x3 J2 T. J
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
7 G8 {/ G9 u2 @2 P3 L' h; v正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。! s1 N4 X. d3 p7 b# y
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
$ W5 v0 {' Y$ i/ k9 _.model small  {( V. F& a. Y+ j2 e
.386$ a; l5 P* T, B1 ]6 ^$ J4 [& i) t
.data0 w) N' @8 b4 ]" c+ G' Z
    SMBIOS_Sign db '_SM_'
9 n, A# m/ H) r& E' j+ _# ~1 h.code
8 t. g, k+ x+ S$ p- l) C" C$ qstart:
8 p7 Z: M# d' i* U    mov ax, seg SMBIOS_Sign
6 Y" Y3 _* c! D1 N5 R& y8 }    mov es, ax
3 g+ ^, w3 U0 H9 j    mov ax, 0f000h
, F1 C0 L7 M. }7 i) ]- \3 `) Y    mov ds, ax
/ a6 Y  {- i; g" D( T" E    mov si, 0
) J8 e- ^% ?) o, i3 m$ k( s0 A8 G    mov cx, 04000h4 ^1 O$ t: @4 }! ^7 I; W
    cld
* B$ s' B4 V- w& A$ C@@:
2 H) a" `) x/ u9 T' W* q    lodsd. j$ p( u4 V7 m1 N
    dec cx7 o& x" m4 B" Q, y, E( F
    jz  short @F/ q) C! [& r% }! x5 E
    cmp eax,dword ptr es:[SMBIOS_Sign]+ @* g8 {, n$ e8 P7 m
    jnz short @B8 o  }+ Y' l4 l; ]( a  Q9 I
@@:9 C, {- W; w0 @- C8 L& S' a% E
    or  cx, cx% Y8 A3 L( N, g/ Q
    jz  short @exit/ t8 C7 Y; M: u* h) p
    add si, 14h
+ H) o4 f$ p2 ?" C" {1 i    mov ax, ds:[si]
. `' K$ z5 V5 V% m6 a; m. \, z9 D# m    add ax, 09h
) O* L% E2 j$ [4 b6 M    mov di, ax( E( \5 |6 c$ p, w- T& v
    xor bx, bx0 m0 e8 t: M" k0 v
    mov bl, ds:[di]- P( w5 c- `+ G7 N. z+ k! O$ d. j
    inc bl
8 t# E. Z- Z2 j    shl bx,6
( G  c9 Y9 k6 a@exit:/ J$ O/ E( _6 j! J$ e5 Z, o. ^& e% z
    mov ah,4ch6 c0 ?/ ]0 T  A
    int 21h, i! j1 P2 }) \1 _8 a
end start
: P- L% i7 h; L: `! `: R" |5 a" vcseg ends
  r$ n! q) `5 i, x* m7 }推测你的算法是:7 Y  D& A& y! s) k; z; B- A
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
( z) }) Q+ S* m, S9 f, R4 N" _2.找到这个offset2+9的地方的值4 h" `) r! s: z. w
3.此值加一,乘以64为BIOS Size,在bx中.3 T" H& Y+ E$ c1 G' D4 ~
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT, k" h1 D+ P& y' K/ p
    ;此处输入数据段代码  
4 c5 E( @2 E2 aDATAS ENDS7 q$ i, H; Q4 E0 g

8 B5 v6 }' ~: wSTACKS SEGMENT( ^9 p$ R6 f$ K0 L) m1 n% Y
    ;此处输入堆栈段代码8 p" e( G  v8 m2 v7 C$ K  Q
STACKS ENDS
+ n- x* ?+ D- {! B
) o3 Q6 ~* F3 M3 w' O6 JCODES SEGMENT9 X, t( {. G. q/ ~7 w! @% w: C
    ASSUME CS:CODES,DSATAS,SS:STACKS
& N+ E% u9 j2 K7 q! ?; ].486
  \$ X, e. |) p: [; y3 t4 P2 A' @1 x. ASTART:- _0 w: z. r# X, w2 r# [
    MOV AX,0f000h0 C4 ?( t4 b3 I# x  }  D  @/ ~
    MOV DS,AX
2 @! p. B7 B8 q' A2 f    ;此处输入代码段代码
/ Y# d3 [; ^) v: S1 R    mov si,00 W$ y$ n% j6 `$ e# o
   last:
, r  q) Z$ l! c$ U8 c6 K( s; P    mov eax,[si]. W" ~7 c2 Y1 \2 t* |! G5 H
    cmp eax,5f4d535fh6 r1 P6 n* p& ~0 h
    je over
( S! [( \; F( @, J9 ~6 I3 t    add si,10h' V6 x7 I, y7 s9 i3 P* m# S
    jmp last% H# u* e) ]! m% g
   
6 ~/ ^' h# }5 |; l! c; r    over:
; `7 _6 `+ e  k% }; w6 n    add si,18h# w( E  q" y' f" p$ A5 ?
    mov eax,[si]
9 @7 F9 O+ o0 Y, q0 Q    mov si,ax9 B6 S( _5 [6 |$ ~3 n" \& G
    add si,9
+ }! \7 {4 k$ p2 H3 w: `4 o2 V    mov ax,[si]
! X& G- M1 b: P6 a6 V) ?5 O$ ]    add al,1
' x9 I' s: D1 F6 d) J& T2 H$ B    mov bl,64
4 D+ I; X6 }  E" \+ e# W+ u4 S    mul bl
& K/ l/ W) q- c0 @: z    mov bx,ax# O! Y% z; ?2 e% O) G% ~
   
6 ~) k9 ~1 }5 O3 r    call display6 i' l. v5 @+ Q4 \, G  c7 X" |
    MOV AH,4CH
5 ?0 @& _) |8 U2 f! @; k+ Q/ Z# V- t    INT 21H  , O4 d3 S4 R& v+ p# d1 T
    7 J' m: ?: ~  M9 n* [" z7 p
    display proc near6 U! c1 ~) @1 h4 _, ]3 q# @
   push ax
2 c$ [7 a9 N1 i' y   push bx) ?9 [9 x- ~7 i( t9 m! U6 U
   push cx: ]4 ]) Y% F$ P- r: Y7 u* H
   mov ch,4
( d' ?- H) v8 I" z5 |. d7 B  rotate:mov cl,4
/ ?1 b* Y% i9 ]* y& h" @8 A   rol bx,cl
, b1 I6 Q, B% o   mov al,bl
7 q) s2 L2 q$ [   and al,0fh) D8 F# q7 c( O" T* ^% c7 Y* F
   add al,30h3 }. q& m: t8 h1 ^5 K( E" W  T
   cmp al,3ah9 \$ o* N! H2 n& Z: y& S
   jl printit$ h* N" n) K. p
   add al,7h4 W; G$ b# L7 s
  printit:# f0 ^* |7 {- [# F. Q6 A4 m
  mov dl,al
$ y- a  a  C4 M6 X: V; W  mov ah,2) t5 |; q+ M; F: p
  int 21h& F  d9 U  G- S7 H2 N+ v& _  g' i" k) E
  dec ch
; c4 P* M( `0 a  A2 |2 r8 J& A  jnz rotate( w9 ~' }4 X: u
  mov dl,20h
. Y+ A* C& P/ V( _  mov ah,2h0 z, ?  o" h% M8 {
  int 21h
3 D# P: P; B4 `0 N  pop cx
$ A+ C$ ^  U; H' m, h& B  pop bx& C+ F9 H' E- r) U/ {' ?
  pop ax
* F+ P. B# ]7 i  ret
& H- {/ Z$ U, v, j/ i9 j  display endp
- s3 ?6 ~$ P: \1 Z' S2 n) s5 d7 E0 D
, d" M! \; z7 h1 pCODES ENDS
  F6 P( I0 Y8 B) i: E' P( q" O    END START
% v: N; D  J, n" {+ H7 D
5 f# [) w% @  _# [运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun9 q; H  [/ |5 w6 u: s+ Q* O* ]
DATAS SEGMENT& k* X+ F8 f- g0 o
    ;此处输入数据段代码  
! G4 i7 e6 k! f+ V, fDATAS ENDS5 @2 k& F7 O5 T% G% y. i) k

& T$ P; c' K, u  f$ n, g1 }  T; ^  fSTACKS SEGMENT3 W; z# Q! q( L# c8 B# G
    ;此处输入堆栈段代码! P4 i0 [8 f# a# V# [* e( |- A
STACKS ENDS
+ d' u. E$ o7 I$ }2 F# Y4 ~1 k3 I# E3 c: o# I3 E8 m
CODES SEGMENT4 ?  Q* R- x! c- H- f) }( R, E2 y
    ASSUME CS:CODES,DSATAS,SS:STACKS
9 v' }7 ]: a2 @: V, A: W* f.486: f  o( U4 Q) Z
START:4 l# C# Y* E) z3 Q: n' M
    MOV AX,0f000h5 f4 Q' Z/ u8 G4 T
    MOV DS,AX ...
! H# g  N6 J. M7 }  p7 z8 e9 O) e: M( T
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
& z% t+ m" j' K8 ~
0 j* A7 p+ ~# N' C2 e' K还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 02:17 , Processed in 0.071885 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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