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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:- R9 ?7 {# l4 _/ o( a; n+ @
-s f000:0 ffff'SM'
% y0 @9 ~& Z7 }F000:BFB16 X* p2 A; J9 L3 c# M/ i
-d f000:bfb0
! `% ]+ `  J3 I2 K% fF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
$ K* {1 ?. V! fF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...0 Y1 d0 K/ [, q( x) Y
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
! T) `1 ]" g+ _4 f1 GF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......* U$ E, b- k, r! E
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
( [  o* x  d/ w# N  o/ L  V1 j. j- jF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
+ o+ A4 k, d' ^# OF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V- e/ P; ?3 u/ m7 f& q! q' ?
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
( S2 U" {- z7 M! g  C" N2 z-d f000:06f0
( F* `5 I1 o' X0 f, b% D$ _F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................& ^! n) B/ x: R  A0 N
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American( u' f6 E/ [( h
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.4 r: W( e, t1 q6 B
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/20 i7 n4 |8 }' A' `
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u/ z( {! i2 C1 m4 g1 u5 i0 L- m
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
. ]' H3 w8 h. [F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
( q6 l+ |6 Y5 }+ Y: iF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
0 Z8 N& H+ b' z, h4 _9 E' _# n
. q( D2 j7 O  B( D, ?7 r' Q
  i7 Z- H, s* o2 p我要读出这里的06f9:07( m5 H# g& y, w$ f
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
/ V; U( o/ J) q$ @- }
2 W- A/ O. H( }7 z" y$ v用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
( O/ B/ \# l1 c$ o4 w谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。7 Q* b) i. R3 l2 n2 c
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。  }" d! y7 u" u1 F) W4 ~
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:! C% _1 b# {! j% j
.model small) K/ u6 J5 h. \  c- K5 V
.386
# F6 n5 y# t+ p, |' {4 O.data
$ A3 X: L1 j6 {1 F; Q% }    SMBIOS_Sign db '_SM_'7 n2 O) d% \1 o. A8 D
.code. L' o. y( `+ M
start:. n& L+ K7 p/ |$ ]! @
    mov ax, seg SMBIOS_Sign
- S( y% a; H) ^6 F; M6 D5 b    mov es, ax
2 H, k/ g2 h7 @: r, o    mov ax, 0f000h% B: c/ W5 i* F0 U2 e5 r
    mov ds, ax( b7 I4 n  [; P
    mov si, 0
0 w% D7 b" U: L% t4 X, L: B: F    mov cx, 04000h7 ^  Z6 C/ S4 g: [+ t4 w/ u
    cld# X, |6 V: y- O- m( t: _$ D' p
@@:
$ d* o- }0 o2 x6 T$ a+ G2 ]    lodsd
. P- ~' B5 y6 r2 L/ w+ z- ?  A    dec cx' ~! B/ i! a8 P6 B* d, q
    jz  short @F  d7 w/ n0 u9 C2 |
    cmp eax,dword ptr es:[SMBIOS_Sign]  b+ a, @' K6 s' N
    jnz short @B
1 {# J: [1 v8 E5 |% a@@:
2 y: ?/ t0 K6 \( M5 Y- x9 g# @    or  cx, cx1 B9 \/ {: G8 n2 F
    jz  short @exit9 G2 `% ?  D; U! A. e3 U, Z& \
    add si, 14h
8 {1 A: ~1 `# L, X  h    mov ax, ds:[si]
$ ], ?, ~4 O( F9 }4 H    add ax, 09h
  r, l1 F2 w9 e$ b, ^    mov di, ax
" e; K: z, Y; ]    xor bx, bx- H7 R+ F0 w- P. R
    mov bl, ds:[di]
, `6 f7 o6 R# D+ b, A7 W    inc bl8 D# S" [+ [/ G  Q" n9 O4 K* R
    shl bx,60 B8 X  I& W# o8 f$ y0 L( t  X
@exit:  M7 O! j$ S- y+ h! h, V% T5 O& n
    mov ah,4ch1 w% I/ I/ q+ E! ?( D
    int 21h
1 L8 c0 @+ m% V5 F/ u& Eend start
7 K4 Y: ?0 ~9 o# m: `! t# [" ^* |cseg ends3 V$ m  h6 [% o: |+ l
推测你的算法是:, U; V& J5 R; l
1.找'_SM_',然后在其后offset 18h的地方为下一个offset29 k( o* u1 F, x# u* S9 C2 q7 C7 h' p
2.找到这个offset2+9的地方的值
* Y  U/ c6 K7 L* m% f) [; ], U3.此值加一,乘以64为BIOS Size,在bx中.
  E" O" O6 [5 ~. Z不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
# H' h, H1 z! B! R$ _0 h$ G    ;此处输入数据段代码  6 z0 m" S% X  q/ k0 r/ w' ]
DATAS ENDS
0 o9 c" V4 V2 M2 N$ R1 F' @2 H2 x+ x2 C8 C0 X4 ?6 R" P' U
STACKS SEGMENT  ]3 K; \: t8 }$ i' U1 z# t
    ;此处输入堆栈段代码
" Q3 A; G, o" w8 N" f$ J! k' HSTACKS ENDS
( c, O# M$ W/ l- Q/ Q- k
8 i! }1 R& ]( C# a' \: k4 y3 q$ OCODES SEGMENT8 v! l/ C' T8 c
    ASSUME CS:CODES,DSATAS,SS:STACKS: y4 L' [& M4 V5 e
.486- [; K: `/ t% u
START:2 O8 H/ {9 T$ f, Z6 p, h* }3 f
    MOV AX,0f000h5 P5 b/ F6 E" G8 ~9 _
    MOV DS,AX( N# w5 `9 Y; X  [) f0 ?4 v5 c; H
    ;此处输入代码段代码- H( U3 G- x+ a: `
    mov si,0
& \# b5 r3 ~# o4 Z2 f   last:
" \0 H- @: j, J0 {4 r( i5 y    mov eax,[si]6 ]9 ?/ i+ e* o) ~
    cmp eax,5f4d535fh7 H6 X+ R0 x0 z* k" a
    je over9 z/ q; R3 L( q' D2 |4 Y; {% A/ O1 s
    add si,10h
2 `7 m$ Y! f' u8 K* ~    jmp last' @6 X' ~) x/ {2 q& v
   
  G; p8 Z) q& T. s# O) |( x# {    over:7 u' k9 S4 m/ p
    add si,18h- j9 W' [. ~+ O, V! u
    mov eax,[si]: R* t6 M) Y- ~0 ~2 n
    mov si,ax4 k- I% Y: a) M: d4 [3 L7 ]0 }: r
    add si,9
; Z3 p( R; Y0 D6 x8 E' s6 K0 q& h    mov ax,[si]
' r; |8 j/ f* p) U; h" e: |    add al,13 c( B0 J0 K6 h& @$ E* |
    mov bl,64
& u3 B( ?% i, m; e) V5 U: E6 t/ l5 @    mul bl8 m$ q: f* w0 ~% Z: s
    mov bx,ax7 Y' q* A# ^; e" Z
   
& g; M, d3 a" {. r& v' P) w    call display
: Z1 ^, r5 s9 q$ @    MOV AH,4CH
0 Y2 U; B( E0 N    INT 21H  
" ^; G3 q+ v; A' E2 A/ x/ a   
9 |- I/ R& @+ Y9 P' n/ s5 y8 Y3 n    display proc near- I$ {; w9 \. Q  G6 S; m7 D1 y
   push ax% K4 A. a+ m2 J( v9 S) [9 o
   push bx
& n0 ~: m/ W- Q: Y8 {8 c  ^   push cx- x( k- N3 |2 e! F2 p* d
   mov ch,4" q; n% ?+ |, ~1 B  c) z
  rotate:mov cl,4
7 X& H& S2 A: p# K/ q   rol bx,cl5 u4 b& A$ V, u* n, {
   mov al,bl
: X+ |" @: o( _) O2 F2 i   and al,0fh
7 K# h7 G7 A) x2 c8 V   add al,30h- Y8 @# A! S1 @* ^
   cmp al,3ah  B! i  Z. A# `
   jl printit! ^0 ~2 I' g6 y: M2 g; g6 I1 w* u
   add al,7h
1 R& y, T' x/ F$ F7 f4 |  printit:- j) J1 G9 r/ x$ A+ d2 d
  mov dl,al: o7 v) J2 }* m* E9 }. _" Z
  mov ah,2
, q! E' k. z' K* p3 K# C  int 21h7 {6 C* b3 e7 E/ c1 q( A
  dec ch
) a( E4 X# @; b  jnz rotate# x; t$ h6 r- w  C9 z
  mov dl,20h
4 p  m8 i' e* D+ a% J  mov ah,2h
! o$ Z: t- ~1 v4 S, @  int 21h  Z* c: w  u, U( `8 L- n- k
  pop cx
" t% T( e0 @3 a" E  pop bx  u% @( n! z* K
  pop ax
, i, B8 r4 @/ _/ y4 S  ret
( R1 X0 F( y$ {- B# e/ q, u& a  display endp
4 h4 _' j6 a# f6 o" [+ r7 H5 Q; l2 x3 l/ R1 h0 I# D& ~# c2 Z. ]
CODES ENDS& U. R9 |/ \. R1 x
    END START
' W' x' d7 i5 D3 r4 a/ L, B4 w& \% |: _
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun1 i; a( v( C5 Q- B- j9 F
DATAS SEGMENT
! p" c+ _+ J0 J    ;此处输入数据段代码  
3 K8 E, t% Z. _/ QDATAS ENDS6 A) n" _% l5 Z  e. _" C1 \$ U; @

! Z- G2 V" _0 |STACKS SEGMENT
, E- f7 y5 [  k1 q$ K    ;此处输入堆栈段代码* ^/ r& b0 O: }& F- W+ e% h
STACKS ENDS
. ~) n/ ?. P6 S( G
+ H  V2 Q& V9 b1 Y9 BCODES SEGMENT
" s) o+ q. ~2 [5 d! `5 @1 _( G  V    ASSUME CS:CODES,DSATAS,SS:STACKS# j5 s" F2 I6 d. F( @" s
.486
, q" j, a* h2 ]3 ^# RSTART:
: H( I. O) v: j. y' [7 D% W: m- G    MOV AX,0f000h
2 J) m( ]! G  d# z- b& d7 ^/ j    MOV DS,AX ...
6 F; z3 w4 p* H8 {; ^+ X. i
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
& S9 C* T2 H, ^7 i% E3 ^( z7 d# ]) {- m* ~! H  J
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 21:54 , Processed in 0.322626 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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