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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:+ }1 h: y' x7 T6 @) W5 \% ?2 l" J
-s f000:0 ffff'SM'
/ x: N' d+ D- }7 m3 @* yF000:BFB1: p/ B7 S/ f6 b* s  y0 r
-d f000:bfb0* n0 C  V& ~8 N+ I
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............( G4 S- G5 j; B6 j, d0 X; s+ }
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
0 e7 g( T8 Y% F. WF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................( e* I) H  m$ V, L3 ?; v
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......  V' O" r4 s) z- @# h' z% p, i+ [* `
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......4 T+ \  K7 `6 n# ?$ I, I
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
7 F: X! I6 p8 B0 k' q# MF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
5 I7 H" C" L: h& F0 A. ~" VF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
8 q9 T) o+ R+ C. K! t- c( v-d f000:06f0) _, h7 L, {+ I$ {0 d
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
' C; o8 b  G/ N6 ?F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American1 k* b( l5 f, D. n: [8 n' D% S) Z
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.: |" j2 U( P1 D9 i  u4 n# g
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/28 l! F. V3 b2 F* T! N0 J
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
" R; q6 v- \. B3 a) M& X% N. IF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...9 Y; `- c, I& y0 r% v, {4 F" Q
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
; v& C' }0 S, [  t  B% U& uF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
# x- R- y* u' i9 b4 [2 G0 Q/ D/ f

  C4 P$ C# @8 \! m8 u我要读出这里的06f9:07
4 D6 W( V0 E4 ~7 p0 t 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
" g( w" a0 C+ D1 T9 d# s: B6 N
7 e: m% J% M9 c用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码' z1 n$ F$ a. P  Z8 m% i, V2 m
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。7 v! R# O  m- u
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。5 w0 B8 ~& f  G; L  u# k" ?
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
9 b) G) e. |+ v8 X.model small
" Z5 ~2 t* Z8 w& t( y.386
2 ?7 U2 _+ \. i9 ]3 j6 z, D2 ?.data$ M1 @( _, U# B2 [. M( T; ^
    SMBIOS_Sign db '_SM_'2 L/ }! y2 l2 f$ z
.code2 ~' y3 v6 E& g6 n6 c( ]: p
start:
4 |7 d+ {4 A$ s+ s1 w7 [    mov ax, seg SMBIOS_Sign
& p+ N' h. f4 e$ ~* I    mov es, ax' ~+ _" O1 x& N/ A5 ]- ~4 K
    mov ax, 0f000h) r+ w* V% W) ^6 t4 z5 O# [0 V
    mov ds, ax3 E# Z) O& d* X" ]% J, E
    mov si, 0& W& e9 E/ |" V% q" u' y
    mov cx, 04000h4 d6 S/ c/ V& k1 y. }) e9 T
    cld
3 e2 r8 x5 G/ Z1 |@@:) v5 }' [7 z0 F" ~. \( v
    lodsd) t. F/ g/ X; h' }* p" W9 Y
    dec cx' d: [7 l' R* d$ R! t4 F3 z) T
    jz  short @F& v/ o' t: @2 A% e) R
    cmp eax,dword ptr es:[SMBIOS_Sign]
) T- N$ k1 f* p' Q% s, `3 K; ]6 P    jnz short @B
; F8 F, x3 i! _: e$ B6 K+ ?@@:
7 i, l+ J# o" L9 j6 A, k- X    or  cx, cx
$ w/ X4 |5 f" d: D' Y$ x    jz  short @exit' v3 i) ]$ E- I
    add si, 14h
# v  p5 M" s, J! T/ w1 o5 N& ~    mov ax, ds:[si]9 I. Y% a+ \2 Z; j
    add ax, 09h& k3 y: B# q. N# O' v8 @) `
    mov di, ax
' Y4 w/ c# }: l$ |1 z7 w6 E    xor bx, bx
. o- g) u5 u6 e! z. E! E9 b    mov bl, ds:[di], @, q8 _( H- T! c! |2 t( G( N7 j
    inc bl
# T+ q8 y7 z2 j7 K+ y1 h    shl bx,60 [; j. \4 r+ o) _+ h7 X  d
@exit:
2 i; h7 p  V( r& |( @: b& N' Y" I/ v    mov ah,4ch
' W# z. v6 a, u: G: b. l4 X    int 21h
: J6 t( y" N$ y+ ?end start
7 j, Z0 @6 ~2 T& W/ i4 m5 lcseg ends
7 E: s  ^; J: g" ]6 F" D推测你的算法是:/ D. K) J' u  u) V% V
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2! }$ D* M3 Y- ^7 ?5 i; [" j
2.找到这个offset2+9的地方的值
* ~- S) h! @& l1 b2 x3 D6 p5 L3.此值加一,乘以64为BIOS Size,在bx中.
& x4 X3 Y; B6 ?/ ?! y& o. g不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
0 Z- v0 Z0 a2 y. I& u# E* n2 W2 S    ;此处输入数据段代码  
' O* M( W# w! E$ z# T3 v8 W, XDATAS ENDS
6 X5 p, w- K5 C3 i: }6 K% h" L  P# y, k
STACKS SEGMENT7 ^, f5 u; f( V9 s0 R2 r
    ;此处输入堆栈段代码
, `* i5 J" _. g& H$ zSTACKS ENDS# v. P5 ], m8 F" i7 W9 D

8 y( U1 c# u, {1 |& d; ^* VCODES SEGMENT
: C' \" q3 `* Z7 p& L9 f    ASSUME CS:CODES,DSATAS,SS:STACKS0 [. O' v; V) V$ H( g/ M/ s
.486
3 X  K' [( D( ^, ^+ NSTART:
' f: V7 M. [- s2 k; S! _0 m& E    MOV AX,0f000h
4 t: W! C1 |8 o, O9 }    MOV DS,AX
6 ]4 v) k- Y: f& m  S    ;此处输入代码段代码
# T5 {, X, g0 r9 W    mov si,0
) w4 D( C! B- f5 v) h+ W; |   last:
; B1 T  _1 m) e4 D" I& D    mov eax,[si]
' X' T7 v$ r" j! |% _* y  b; [    cmp eax,5f4d535fh
% R. Y' G) e9 M3 Z' D5 r    je over# U& X) _) Z" T
    add si,10h5 v% ]9 _! p1 U5 f
    jmp last: v: M% d8 T# |# h$ P
    . g' g5 B' ]1 b8 z
    over:
% U& |* ^: j/ ?5 D- n# f. Y+ Z    add si,18h
5 @& b& t) d0 R8 S    mov eax,[si]: `, }; V1 [; ]0 L- Z5 W3 o) [
    mov si,ax
* b( e! S$ Y* `8 v+ x    add si,9" y4 ]: g3 C. \3 D
    mov ax,[si]
1 H" @8 m; `5 u" [) B6 Q" |    add al,1
4 J- ]. p4 j% z    mov bl,64# _, N$ h6 v2 v) w( j4 d: y
    mul bl
9 }8 S' k4 u4 w: S" ?! A    mov bx,ax4 D9 G. [8 U) p% i
   7 x" U2 M/ d! e" l& t
    call display0 J, i5 }5 q" }3 N$ F6 [: f
    MOV AH,4CH
$ ^. Z' C1 p9 V2 j  k    INT 21H  % n/ V. [- R2 H1 V( ~4 m6 E
    - w4 @, Q+ s4 J- D
    display proc near  j, `/ E. k8 S1 r* o
   push ax, m) Q4 Q( u& m- [
   push bx
0 z8 E* p( B8 V, u5 @) v& H1 x4 }: l   push cx2 I& N  y" g  b2 U
   mov ch,49 d6 {5 R) M5 P( G
  rotate:mov cl,4
- Q; C1 ~  T; ]5 J2 w$ H% X   rol bx,cl' r1 w9 k& t( A. I9 m9 |* q! L
   mov al,bl) M% H4 `6 r: d& `" Y* @9 M
   and al,0fh$ R2 O! c+ L9 H( n2 r6 w
   add al,30h
7 g; K3 `. V5 d* w   cmp al,3ah' i3 v4 v' h3 n, P* O
   jl printit; C% E$ |9 n; B2 n, @& F' k: X' i
   add al,7h
. n% C! j: _) |1 G! I  printit:7 X6 O7 @& M, ]1 J3 b
  mov dl,al4 x/ e, o) m+ X& `/ s0 J, z- z' S
  mov ah,2% w! o  f- l" q/ W4 C
  int 21h7 S0 d- R- W( `( w( ~3 J
  dec ch
( N: e8 P8 q0 ~2 y) E  jnz rotate
( O; s0 O3 v6 }) `2 @  mov dl,20h
8 |' A7 A* b5 M6 q/ i  mov ah,2h6 z( I) Q, @% t9 |. s6 W7 G
  int 21h
5 Y9 i6 i* G1 q1 x  pop cx
5 [) Z. f1 ^' i& C: N, u1 B$ ?2 S  pop bx, ]: `$ l5 X3 y
  pop ax- V2 ^/ O/ A2 N" l6 Z3 `4 Y+ J
  ret4 m( V& T$ w9 O4 S# P: C# R
  display endp& m/ O$ J+ d0 o  [* f6 `
+ |2 ]7 `& D' ?% m- l
CODES ENDS& S# U* ?& z& g7 v# X
    END START
: G0 w# @& q* }% J7 G
! l2 i/ a* v! L) G运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
7 f7 Q( R( K5 _* ~6 uDATAS SEGMENT; p* X1 }0 u# I' K
    ;此处输入数据段代码  ; \$ s& L* N9 U
DATAS ENDS3 E! ^! s0 Q5 V( Y2 T' F) A. ?! ?
, a2 x; N% W9 K  P$ T) R( w
STACKS SEGMENT8 u- }; _% H4 `
    ;此处输入堆栈段代码
; ^; S0 v; J1 CSTACKS ENDS* W& q/ _# P: v
& X# w( ]* w) `6 t
CODES SEGMENT: c! W* S6 l7 W" @
    ASSUME CS:CODES,DSATAS,SS:STACKS/ T+ N5 s$ r4 g# U8 c
.486
! ^6 w; ?( x7 j' d" ~5 uSTART:
2 m) t  n1 ~8 ^9 W* V( F$ K: g    MOV AX,0f000h8 z$ e( {1 H: u4 U# Z  v
    MOV DS,AX ...
7 i1 D. `$ V- T) r5 w
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
: A. F( q3 j( T) ^& j+ y) S% k! t/ g' J; M: w' E4 j
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 05:36 , Processed in 0.094938 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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