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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
/ z$ o0 H, H0 y, H. z2 h-s f000:0 ffff'SM'9 j: K  [8 V8 w5 e" Q5 I
F000:BFB1. n9 {- F; d- Z7 Z3 _$ U4 g
-d f000:bfb0
8 e, h7 v. u9 [F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
& T& o* Q& J( SF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
. B$ i6 Y) v# oF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
: p6 G% Y- k) i+ O6 JF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......9 G! ~% A3 z+ A" E8 P7 l2 H2 J0 K
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......  m" u, A$ W. Q6 _0 J
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
  p0 |! o- b' fF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V* a' W$ f, v( z. [; a, \0 @
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..* {3 y3 _$ ?" f3 G1 R' h$ ~
-d f000:06f0# p7 d/ z; D; r4 Z; A
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................2 b/ D, n  B' X" C
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
/ x8 R* i$ u1 x( k  V# tF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
( p. V  }# w& B" E; t0 kF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/21 Z! i4 R" l" o1 C) H+ f
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
' I/ j# f) N: e1 t' \$ b1 t; Q( g% BF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...; V  P% P$ w8 K; H) l/ V( F
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
2 A: ?* Z: M8 s8 b: M4 u- ^% s5 JF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
, E* o* W. Q% O( Z
1 e4 C. _' q! ^- ~' H% _6 M, i4 k
) V: ~5 X7 b; c! c我要读出这里的06f9:07; s, a4 _3 w' B, q9 Q
然后得到一个(07+1)*64=512 这样来获取BIOS大小-; d, y* p% A& d" ~4 |" y

6 _$ F+ b& M5 P7 W- z用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
$ w* j. W% D' O4 `1 ^谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
( m; ~( \# A. q9 C正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。4 O  {# p5 f1 b) h- c
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:, J  j+ [3 G% r# i
.model small) [6 r3 g2 g- K! e8 [
.386
" d2 W( L, o0 Q.data
; ^4 x$ U& T2 S7 y  }! M. u    SMBIOS_Sign db '_SM_'- a" g" j4 }& C/ B: d$ w
.code
/ u+ _5 N! X; {( wstart:% M# |, K, Z0 N4 h2 D: T& z
    mov ax, seg SMBIOS_Sign+ m6 [9 ?& |) \7 Y& h. W( q7 J
    mov es, ax; {1 y2 G8 h9 H4 c+ K; }( q
    mov ax, 0f000h  e. X( H3 e( F: u' L* C5 _
    mov ds, ax3 v* T, b% u8 P5 ]" {; p
    mov si, 0# w. |/ D" Q! F7 Q
    mov cx, 04000h
1 a' l7 D  r6 w9 h3 o; G  {    cld
$ `* k5 a( N' B/ G  F; O" x@@:
  u, P+ J4 S3 _    lodsd: }. ~3 s# n' k+ J2 b
    dec cx
1 v, N% S4 U4 v$ N2 d. C    jz  short @F
# ~2 c; x7 ~$ C( [9 C3 P    cmp eax,dword ptr es:[SMBIOS_Sign], E  y0 B. _2 g
    jnz short @B% Q7 P* ]3 u5 n( Y" ^, V
@@:
, ?6 f, c; W) L+ W" x( v    or  cx, cx
2 B8 w9 M) k- r4 D! D( C6 y    jz  short @exit
; _: a) b! {) c9 }6 p( D    add si, 14h6 O' @' {& y' T5 s" _$ W( [) V4 v! M5 k
    mov ax, ds:[si]
+ t* ]- `0 z1 i6 N; H& U- k    add ax, 09h
- c& |; ]" N# F- p; R    mov di, ax
7 u: k- p/ J( l8 b8 t    xor bx, bx
. I% y. k% p/ V    mov bl, ds:[di]/ m3 C" H3 G2 f
    inc bl
# ]1 g4 G/ g. e  y% T: V    shl bx,6
* n/ T% p+ `, k1 w@exit:, w  @+ a. T! I2 M" D$ B- i
    mov ah,4ch
, y' r7 [3 e& R4 |5 ~, `    int 21h
' @' F- w( ?4 c+ a, R3 send start
$ h' R1 M6 m* X( jcseg ends3 ?' K4 M: b( b" G" P' u
推测你的算法是:
5 Q- N* V8 v9 p- K1 T! `1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
! W; T8 k5 Z; E, E4 z; n; I0 b2.找到这个offset2+9的地方的值1 Y: {" q0 j+ `) X1 \- k
3.此值加一,乘以64为BIOS Size,在bx中.
1 D; O& Z" U7 q9 u8 R# {不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
7 [1 U* ]/ I" K) k$ Q% \    ;此处输入数据段代码  * v$ S  ?3 W# |9 Y# w
DATAS ENDS
6 I9 [2 }5 j/ H& R7 x
$ X% }' n8 y0 n7 ?. g5 t& [; PSTACKS SEGMENT& C8 q' C% k" w3 k  L6 }2 ]$ g
    ;此处输入堆栈段代码
0 _' a9 z0 s& B+ n. _. F+ I' RSTACKS ENDS: j4 @, ^5 d  |- R3 h
& T6 Z/ M$ Q. \
CODES SEGMENT% q" Y  [* m9 A
    ASSUME CS:CODES,DSATAS,SS:STACKS
" l( z* J8 b  w1 i9 a, {.486
% b; x- [$ \+ k7 P6 w  QSTART:
3 M% P6 e+ }  y8 t0 s    MOV AX,0f000h3 @4 h3 ~. H' ^  [' W4 ~" R  i: f
    MOV DS,AX
- V7 h) w" O& G, C    ;此处输入代码段代码
9 x2 F/ G3 ~0 _3 h8 ?; t    mov si,0
+ G) r9 F8 D/ [* C/ g   last:
; M! ^- V( u6 o8 {' a* ]  K    mov eax,[si]
% e+ Q3 ^9 z2 i  [' I1 |    cmp eax,5f4d535fh, u1 V1 ?5 s+ {. _" ]" R
    je over2 j* S0 K& w# [4 K' r
    add si,10h2 M& s% w8 q- u" R5 D
    jmp last& H" F  T) J7 S2 w
    . b: j- J7 J& Z# e: X
    over:
* a9 I* H) N* B7 {& Y. n    add si,18h; N$ ?! p7 P$ Y1 F
    mov eax,[si]# q, i: j' X. V% k+ D9 H
    mov si,ax
" `! a+ ~) i- p3 U/ \3 Z    add si,9) {$ |0 {; E; A, P- [* L
    mov ax,[si]- Q; |) `3 Y' w& Q  b2 M( l/ g5 h
    add al,1
3 W+ ]1 g5 j% G$ K; P    mov bl,64& m& D' W! r1 a7 f
    mul bl1 b  K$ ~8 ?8 O8 m5 n
    mov bx,ax
0 j$ I8 ], U, ^6 n   
3 S. Y  O7 u2 g' l! V% S( t    call display
0 {/ `7 ], J/ l+ p/ ]* h6 b    MOV AH,4CH/ v7 u7 y: r! ^% B) j
    INT 21H  
$ C8 J; N8 ^: t, T# v; D! s   
1 A4 \5 a9 L. F# _    display proc near; Z3 B/ a) S, d5 |7 t9 d* ?" a
   push ax
! p  ]3 O* |. {/ J; K9 v1 K1 f$ [   push bx
; [7 N/ b: W- u" E+ Q! R   push cx
; G, m) a& i: n   mov ch,4
8 ~9 W0 q6 y# ?  o$ r  rotate:mov cl,4) y+ z2 @1 z" s4 E" W6 @3 O( S
   rol bx,cl
" \# G* J% g5 N2 U8 `; @   mov al,bl* P# \0 B( P& N. f: X0 W
   and al,0fh
$ e) f1 Z4 z8 x) r: s; _) s   add al,30h' }" P( g6 `* y: p; \+ O5 s9 U) \
   cmp al,3ah0 C, J; z0 L4 C
   jl printit
1 w8 `. Q* u7 D! S/ }   add al,7h+ _; n9 P$ D) U, q
  printit:
/ P; E5 @. m- M  t/ u8 M2 i$ m4 h* j* j6 F  mov dl,al
0 B" J; u! o: N4 K1 w% ~  mov ah,2
( O& q- y: w' R9 z: r6 U+ ?  ]  int 21h* b( h8 @, W) K* W
  dec ch
, Q4 f& J  @6 L( `' `& ?. D5 L8 w  jnz rotate
' P+ k' l2 S) }6 T# U- b! u- A  mov dl,20h
6 U9 {4 G4 P% h1 c  mov ah,2h) I. g5 S9 M. A2 {* Z8 u
  int 21h6 v1 }4 X. q& d( M1 f
  pop cx1 m( z5 Q( M2 r0 M4 u$ q
  pop bx: [) B2 W7 |& ~# k
  pop ax" y8 f! \  Q1 s4 P! z1 }
  ret
/ ~' M$ \0 ]' b6 c& y  display endp
+ B+ j! H$ B) ]; c) H  t% d2 f
8 \1 s$ J# p# U1 f/ f, C8 B1 RCODES ENDS
7 ]' j4 {; }: |5 g- F3 O    END START
& A' Q+ i3 n) k$ @- R- V- J* F/ f6 ~  `% _
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun: L# A9 d: l* Z) m7 I4 i) l
DATAS SEGMENT6 |" f( n5 e5 z) |" E4 S' z
    ;此处输入数据段代码  
, l3 w2 m: y) v9 C, p- ^9 U- hDATAS ENDS
! [7 C& q3 i' L/ k6 i9 }$ X( ]
9 l5 t+ [0 W, B4 s1 L, D- \6 |3 D  ?STACKS SEGMENT
( T5 E/ s3 Z# {% a# X    ;此处输入堆栈段代码
- z5 Y5 {. |1 b2 sSTACKS ENDS
$ N" V% |, u4 k: S
3 v3 ?" ~4 E" fCODES SEGMENT% g. O: d* D0 x9 h$ ^9 o7 ^
    ASSUME CS:CODES,DSATAS,SS:STACKS- e) k9 M+ w; m. N! b9 n
.4861 _' U, l1 [! y9 b
START:1 M/ z9 C1 {% A/ \
    MOV AX,0f000h- b! i' J+ k/ g" K: A/ J
    MOV DS,AX ...
' p" w! O! u0 W) ^
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。6 ~1 V' }% ]' ^4 Z% Y
$ J' X% ?4 g3 t$ \# A. J0 k
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-22 00:26 , Processed in 0.082256 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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