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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:# v, p' ?' d7 N. y" }$ c6 ]6 [
-s f000:0 ffff'SM'+ E  i( ]5 Y$ y! ?) E% N! h+ Y) U
F000:BFB1# u. c" z7 Q( y3 c4 |$ f$ W
-d f000:bfb0- r! ]- W, o- Y9 F- j
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
6 O; g6 V; ^+ j- e- |F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
5 F+ `1 G4 k5 V% LF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................  C/ m" b( B' E8 p
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......( I) H# Q3 i' H; ^. `: g
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
( ]9 H0 @, ]- v7 i* C' zF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
+ j; `, d- x3 M- t$ DF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
* C4 Y4 h* Z  y6 D( \F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..9 T* d6 v* }  A5 Y9 @
-d f000:06f08 ^6 B. r& y: v! g1 @7 i
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................! q2 I! _8 ~, K5 ^" P" o
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
. ^" C3 V: H" e# L8 T; |F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
( x; \$ |3 b; j7 i5 wF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2" y/ Z9 d- [9 V1 E$ C
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u/ i6 }+ ]4 w2 c" U' e3 ~3 k
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8.../ w& J% A5 D  ]
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
6 @8 T( F) ?" c0 DF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ) P! Q) z+ {9 c; i- i% u% j

5 e! z: `; r2 V7 }4 `, B7 K8 S& M8 L4 c7 |: }1 a
我要读出这里的06f9:07
" ~+ g2 E* f' i. V  a0 w$ | 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
! W* I/ w6 z( E; T; d
$ L4 p8 M0 F) i# G1 Y用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码3 g( i5 L+ Y( b( Q- m3 O
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
/ h! G& j2 D( C% E' m9 M+ }正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。; b; S- E) ]" ?7 X) ]; c# I8 k" q
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
- m' W# K& H- Q  i.model small! l. D0 B# n' S% H6 L
.386
3 G/ g. B( C, S/ f4 B6 }.data
: R% l* K1 W9 i/ X! u    SMBIOS_Sign db '_SM_'. K4 u$ L9 K; k) t# m* f5 @7 ~
.code: l  @& Y9 O4 V( C* H
start:6 v) p6 y1 O/ h7 n6 |( a
    mov ax, seg SMBIOS_Sign
% U" g3 b" {7 G- t) `    mov es, ax
; M( x3 J" S& T4 y( F% d    mov ax, 0f000h4 c, S- ?$ E6 B
    mov ds, ax
- g4 E& K0 f; K7 U    mov si, 0
3 \& q+ s6 M* a2 @. z( Z. n    mov cx, 04000h
( I5 H( ~7 ]( B( I+ x    cld, B+ ^  E9 L/ z3 n- s5 U$ B/ H# ]
@@:
# q6 U* h1 G* J1 B* W1 t    lodsd8 l% q: g3 j+ u- `: r+ Y
    dec cx
- S# U. p2 v3 {+ l) x    jz  short @F
% U, W% h3 [8 v6 B- A    cmp eax,dword ptr es:[SMBIOS_Sign]  \6 r) r: `/ a4 v+ D" A8 w
    jnz short @B9 f- ]" P6 H9 C5 L8 f7 p4 R* t
@@:% m5 J5 q. k- X8 n; X. J! P
    or  cx, cx
% G% A  \0 B; K8 d+ u3 D5 z% @( k    jz  short @exit5 j/ \; f$ ]  }1 T1 S0 D
    add si, 14h' r8 p0 e* w3 n" t! k
    mov ax, ds:[si]4 l  i* k- g# B2 }
    add ax, 09h
3 B( j, i7 Z( s- D1 i. E    mov di, ax8 ?. A- n. [; C: L
    xor bx, bx
. P  A3 t& E6 P- u1 t4 i! S    mov bl, ds:[di]
: {/ z! Z: D0 G% k) K" A/ K7 [    inc bl
% u( G, W2 N1 H    shl bx,61 k' Q4 P8 A# @( M$ g
@exit:' S  Z( P1 g( M; z; q& c
    mov ah,4ch6 O4 ]: `  D$ o5 R7 |/ [) ~
    int 21h
' L4 t  }) `! S! [- ?( Y, Yend start- ^3 E. E; j4 g3 j$ C
cseg ends. c* ?, u1 ~& O. x) g
推测你的算法是:& _) i% K' _# X2 g+ O  i" ?
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2" h; Q) j2 L) ], L9 x) B, A# U
2.找到这个offset2+9的地方的值
* c* r: m% e( w/ Z- l2 |; J8 L3.此值加一,乘以64为BIOS Size,在bx中.
! O! c: x* Y) R! s& n不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT3 B  B5 a. z* p' W& _# V; K3 C
    ;此处输入数据段代码  
) Z: b9 L4 g$ UDATAS ENDS8 Z. m+ g! x- |: W

/ H  k( J: z7 ?  tSTACKS SEGMENT
4 @( Q  K( o8 Z) D! l; ~    ;此处输入堆栈段代码6 @8 d* x  c( ^
STACKS ENDS
# S. v! U8 [9 T, y" B: `6 J
6 q2 c) t7 w* s+ S0 I" nCODES SEGMENT7 ?) f% S1 |$ z! n1 I% K( j" ~
    ASSUME CS:CODES,DSATAS,SS:STACKS
$ T0 o3 t% N4 s  ]5 e; x.486: i+ `$ G5 S2 O$ E) @
START:# d) k5 G- v8 D7 }" e5 l7 g8 N
    MOV AX,0f000h! t7 _/ k7 ?- V8 H, X7 V- C
    MOV DS,AX. y  v9 X! L" j  E4 n$ h* A( q1 s
    ;此处输入代码段代码
- Z3 B6 [& t" x5 h: D    mov si,0) a) S& c! |! ]; D, k
   last:
$ W) ]9 F# g: v; I    mov eax,[si]' |: H* K" @' F" H
    cmp eax,5f4d535fh
  g8 f' @+ `0 C$ R7 t# a$ z- ~    je over
) U9 F, w* Z: U5 t) i+ S    add si,10h$ f" f. a) q) D* I) M
    jmp last
/ R2 e5 A. B" |8 _% o   
, J" u- _0 u3 [. _$ ~7 c5 t    over:4 i: w# f" m- G0 A4 v; k* t
    add si,18h0 \- N/ [0 ?( I: c* _0 _+ p* o" m' W
    mov eax,[si]" q# D7 F0 i8 Y" C+ ]$ w9 J7 T0 {
    mov si,ax/ c- {* N) @, P! I. }- }
    add si,9
8 n1 E5 i* }9 L( J2 w  L    mov ax,[si]+ {8 `% m3 N! S0 y4 i" T, m+ a; Y
    add al,19 K' u' O" N- }% b: e
    mov bl,64
# x$ I$ r" f& i3 }( j1 D0 I    mul bl
% H+ W. v( g% M) F8 P# n5 v    mov bx,ax1 l9 u/ i  ]% g6 X8 w
   7 M- Q1 t% U1 y+ G
    call display9 Q4 J$ }& W) K6 A, N; \9 w
    MOV AH,4CH& h4 k. x( D% D% K
    INT 21H  - V* ]- \0 s! {) ~# A
   
) S1 V  y% V) j+ r    display proc near' K4 S, a8 Z8 X6 ~
   push ax* \# i9 c  }! H  O( D! a1 h5 |0 g
   push bx' a6 C, I- k( q, D
   push cx( i) c4 Z7 C! s/ F' p1 u
   mov ch,4. P2 `/ ?6 X/ X9 P
  rotate:mov cl,46 l& N( T! `$ o" W
   rol bx,cl: G  s: T# M( z+ l& z+ I, d% e! E
   mov al,bl
' r$ _# E. U5 a% r( ], e   and al,0fh2 L) o& Q9 z6 I" H( H9 O4 X- [0 `
   add al,30h" m5 P4 s* f0 m! w- O
   cmp al,3ah$ n6 y+ q' z0 X2 H
   jl printit
5 y; T, G  s& w% Y9 E# v$ x, e; n   add al,7h9 I2 D& `) w- t6 m
  printit:" v3 T0 }/ J. ?* [% X
  mov dl,al
2 [/ k6 f. p: b: v) [3 c3 L/ U  mov ah,2; @8 \9 O, ]1 B7 V# B% Y- R
  int 21h
( Z2 r- X: s9 E( |1 [+ Q. L( C  dec ch" ^. L8 M& @6 I/ K& t0 O, M
  jnz rotate* n% _9 R: P; k9 F& ~
  mov dl,20h
$ P) c: u- C8 k' F7 m; F( U: f  mov ah,2h! t0 }7 a3 _6 _$ L3 ^2 R! n
  int 21h8 ]3 {: K) t. Y
  pop cx
) J( G9 A3 h2 ?# }3 c2 d- j. v  pop bx9 Y, p0 Q: V4 g/ c+ [2 F' |
  pop ax  {2 R: n3 F# `& Z+ J6 X' ^& t
  ret3 R1 L) F% \# N. B4 K2 W. D; L
  display endp
5 w; |; Q9 Q. C: g& R5 {
! Q0 M: J' P) A4 t6 QCODES ENDS6 `3 z3 ^2 h  `/ I6 ?; Y% i
    END START
. h3 m$ `8 M  ^' F# j+ ~# L+ t
% I- t1 |5 |4 c' L- t# X运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun+ M7 T/ X; q/ Q
DATAS SEGMENT" g+ m. K* k8 z0 \4 F
    ;此处输入数据段代码  
2 R; S2 ~7 ~' }( y! l5 MDATAS ENDS( i# l) E  R$ s8 S+ L* r/ d) H& i
8 F8 j0 F* _, \
STACKS SEGMENT
- e) E2 [: @, A7 b    ;此处输入堆栈段代码
. v! @+ t/ H, p! ^% n" J; XSTACKS ENDS, z/ X" t" k" u4 n, h- \9 R& N
. {! [; r! \' ^+ P! j+ [. K
CODES SEGMENT9 l0 V# E9 N$ @2 H9 E
    ASSUME CS:CODES,DSATAS,SS:STACKS
2 @9 }  q7 ~! L# m- Q; E.486
4 f+ j! J) K' [- p- t! c1 BSTART:7 X$ R  q/ o2 K! v% F8 `
    MOV AX,0f000h3 z4 u1 f) s$ [) u1 p( I9 x
    MOV DS,AX ...

, I' w- X) h- a6 a& w5 |二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。& V7 T' @: n# V2 c! W. ~
  [- C% g# }. o: \6 s$ o7 K
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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