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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:$ ?# Q& ~$ F9 l1 w+ G
-s f000:0 ffff'SM'% X& M. ~& S- ?  {
F000:BFB1+ E% f! Q4 ?  q+ N
-d f000:bfb05 ^6 q% E$ p+ g% P( r  [8 C
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
/ Y( z7 b9 p9 B8 x  V3 eF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...+ V0 s$ ^6 P  }# v. [
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
1 ~, m# W: ^" @0 z) F' XF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......( Y4 H( a8 l" b6 A( j, s4 F
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......5 i) `2 A  m" {( V: s
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.1 a7 W% Y3 H6 M8 H
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V8 E! R' d  z& c& c8 J
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..4 ^3 V+ \4 j2 T* v1 k# O1 E" H
-d f000:06f0
) j1 D$ j5 s) [F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................4 C6 s: q% ]* z. n# j" _
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American; }! A/ g4 M2 T! T( R2 H% H
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
+ E- \) k4 _, a# {0 lF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2( G; D; i3 E, p- e
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u; n- }2 s; J2 @/ Y7 Z
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
$ A2 V( V5 L' M+ J2 s2 K" jF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
" R; ^. z7 y5 E) D5 n0 g( v, m" vF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ8 D+ l, r: x" S
) v5 f$ t1 H( r. F3 A- W

2 d* S3 N/ x4 t; w8 h) H我要读出这里的06f9:07
7 I+ d3 c6 k& p, u5 c 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
8 z- g5 T. a" C9 H4 Q5 Z+ P
5 r' e: A. G; Z+ ~' u; w用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码- k) t6 }* ~0 L9 ~
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
" X* t& e) M1 Z/ e" H, B+ y9 d正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。) c( I1 `6 o1 U$ [- y5 P5 {
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:& M, B0 I8 r% R+ D6 Y) }$ c
.model small
2 V8 ?; K8 f- o; X& P.3868 r+ D' S5 \9 q" v* E- P
.data* w* s6 F- r# A; r6 a" d
    SMBIOS_Sign db '_SM_'
# i9 U3 X" z9 m9 P  M0 K.code
5 }) C- H$ {% Y% Cstart:
: C! z0 Q: F0 i. r9 D' t' v    mov ax, seg SMBIOS_Sign* e* \* y/ W: a9 f( u* h1 f4 g
    mov es, ax
  `' u4 h; M# [/ c( z8 n) E    mov ax, 0f000h! j0 d6 F$ r  b% B
    mov ds, ax
7 q8 {. D9 u+ k& n4 m    mov si, 01 L' w& ^0 @9 `' A' r8 t
    mov cx, 04000h0 O  V) W: Z4 y. h4 M$ ^0 T  V
    cld; C0 s% p! j4 m
@@:, z" ]0 c" A7 C4 ?0 D
    lodsd. {' A& ^* y! K1 U/ p9 q* w
    dec cx
8 b* n0 d1 e( V    jz  short @F2 w" |  b5 w: @- w" x3 G) C1 f
    cmp eax,dword ptr es:[SMBIOS_Sign]5 {' O/ W1 j. `) ]+ d1 D; h" h8 r
    jnz short @B) ~5 r4 S( p+ O0 k7 n( {2 ~  Z
@@:
: s1 A4 i4 T* ]* B    or  cx, cx
) O5 Z+ G* b  M6 Y8 w    jz  short @exit
& j. O# j+ r& O3 U% f8 m' T  C    add si, 14h5 l6 u1 P0 D( s: R
    mov ax, ds:[si]3 B. q. d- B: v+ r+ s( ^. ^
    add ax, 09h* x9 i, X: I5 W$ U! G- d+ a
    mov di, ax( q% A3 \/ |0 N( _
    xor bx, bx
5 U$ J- R* w7 ]6 B2 S- i+ b3 {, y) [    mov bl, ds:[di]" d/ i0 k- @. z
    inc bl: ]; h: Q7 F0 ~1 L5 l
    shl bx,68 a' g9 J9 B$ A$ r- ]
@exit:
) H9 A$ _9 G& F: s    mov ah,4ch
& E2 I5 a* D7 ]: I& m: q    int 21h
+ R, K% U5 Y1 E/ E3 _end start5 j: B  k2 k# g) }! l
cseg ends
& w1 H1 w% J: B* i' m( K/ q( x推测你的算法是:
/ p: w/ ~! e0 U: m) ?8 X1 u% m1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
3 o) W! u* X% D2.找到这个offset2+9的地方的值( t! j% D% l. X3 e8 s2 p
3.此值加一,乘以64为BIOS Size,在bx中.
/ |' p1 a8 i9 {1 c; p不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT# r0 u! X! Y, \* C9 S
    ;此处输入数据段代码  
' ?& j1 |* p* y" \DATAS ENDS  e5 R( d! m' P! I: Q5 e+ J8 n" T
+ G! U- n/ K2 J7 ]4 \" y3 }; ?5 s
STACKS SEGMENT
) t7 c: j# b* [  \0 Y# e+ o    ;此处输入堆栈段代码
+ A  o, M4 D: B5 V0 |8 L  oSTACKS ENDS3 l. B, {1 D- s$ A* k$ b
6 }9 A( r4 u- ^: I$ P
CODES SEGMENT! T3 Q9 N0 n, F
    ASSUME CS:CODES,DSATAS,SS:STACKS
* u! M: ~; H% e) ?" v4 B.486* A" `3 O4 Z% C/ B7 H
START:. ~( _5 G- \/ f. i% ]1 B8 ^
    MOV AX,0f000h. W( n! h6 g! l1 p% G/ a+ m# N8 Y7 h
    MOV DS,AX0 @2 \  Y  _( P! ^2 ]/ F# M0 k
    ;此处输入代码段代码- S" G* D9 W; r+ ?( w( ^  e
    mov si,0
. v6 I9 l3 M- y+ @! f   last: - a% h& x% l0 S; G6 A8 @" J; e; G
    mov eax,[si]* v  O, x; M6 ?! t' F! _/ i" a! n
    cmp eax,5f4d535fh
/ x+ z; N" ~* u. N* x) C1 K    je over! Y# s. P' B) @
    add si,10h
# K9 U- k; b6 i2 o1 X% ?    jmp last1 U& |  [$ t1 S2 v$ }/ l) W  r
   
9 Q& Z$ v9 @) q# d    over:: j3 u2 S' C6 G  G' }( j* F
    add si,18h
8 u1 [4 C$ \8 @" l  a+ O- X  r    mov eax,[si]
: X, w$ s8 ]2 q/ r5 S7 U: F    mov si,ax0 M/ B* b, p0 ~' g) U
    add si,90 ?3 k9 W' @$ ?& |" ~2 b8 E) x1 h$ q% k
    mov ax,[si]
6 N) x  k8 p  r    add al,1
' S" Z: c( U! K  {    mov bl,643 S7 V  D- \7 x0 X$ k8 S( p6 \
    mul bl
6 M0 R  T* U6 n- |; @  {  y    mov bx,ax/ W. ]: P+ t; x/ W
   
; K# A- ]# A) l6 R/ J# V) B* a0 J4 Y    call display
/ ~% I  D0 K5 W* V2 z7 z" z$ V* ^    MOV AH,4CH
% v4 [' U* u0 b; X; W& f    INT 21H  1 |6 {/ ]6 {/ F2 }
    ' b+ v$ i' [( u- C3 j! ?
    display proc near8 e: y; s1 P4 Z5 x9 p& z
   push ax6 _( G, R/ `% }- X2 d0 [
   push bx6 I5 T5 b# |3 j. s
   push cx
/ S* C  Y( w3 C# ~0 X3 w   mov ch,4; R. L7 g$ s6 [9 h0 g3 T7 @* P
  rotate:mov cl,4
1 b1 s% `0 Z) f+ s& W( n   rol bx,cl( j$ U' `& V$ M5 j4 i' G7 \
   mov al,bl: D3 M) N0 [! f" F2 c
   and al,0fh
3 k& |. t) g" `" ]0 V. s. {   add al,30h
0 R- g  i, j$ v! y- {% X  ]   cmp al,3ah8 `' h1 u7 n2 A9 O
   jl printit- P" z. H9 z9 ?% p, _
   add al,7h
; K/ Y& L+ h/ j& J! d6 x2 [3 n  printit:
, S  x! V2 i) H2 O8 Z, u) K  mov dl,al
. i( G' r7 t/ m, |% A6 ?# O5 L; b  mov ah,24 @1 q- g: A0 \& T. {
  int 21h
1 A4 |% @2 a" p4 z5 n  dec ch
( ~3 G, [' o" L( p5 T7 ^% H4 }  jnz rotate3 ?# N, ?7 g- Y$ ^! i( v1 u- o
  mov dl,20h- ]1 w3 F$ v; h2 S' P
  mov ah,2h8 M8 L% E" Q. b/ {4 q. M
  int 21h2 i" E/ x9 l$ @# E7 }$ ]6 k
  pop cx
1 x/ g4 T- i! r  pop bx# d1 d. C$ e' w, a3 ?( ^  N
  pop ax
+ x' O7 ^' N" ]' Z* `9 T  ret
! p- V3 M5 R8 G# b  display endp( a! ]/ ~- ]* E, L5 I; ^2 k3 u

- k. [' d: `* ~6 H7 M  SCODES ENDS
# m( t" v+ g: S1 d! S/ j% @2 ^9 }& ~5 H    END START
3 I; c* }+ c9 a0 x6 F" G& ?9 F
! F+ O7 ]1 Z  {" _8 a2 `: S% A9 N运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
/ I+ L' t* T$ V2 @5 L* s6 nDATAS SEGMENT, [- a; U: Z  o
    ;此处输入数据段代码  
. L2 N" q% g2 ]DATAS ENDS6 R2 A- ?  @# x3 ]' @6 u9 e

8 `$ }9 i. H* n) Z: `5 f& _& f7 HSTACKS SEGMENT7 f: B# `' B8 ^+ x0 Y
    ;此处输入堆栈段代码& d5 Y. f4 I& ^9 o* [) f: H
STACKS ENDS* _+ R5 N/ i; @2 T

8 C+ p& L' m7 jCODES SEGMENT* s4 `# Z# e+ M! A
    ASSUME CS:CODES,DSATAS,SS:STACKS
& X% a+ }% G  S  f9 @4 _# P.486
7 s; Z0 Q/ i3 z: N1 L9 i1 DSTART:
( L5 o5 }* \& Z7 J2 _; w    MOV AX,0f000h  u. d0 |" z& I
    MOV DS,AX ...

" j7 {4 A9 ?/ j' b二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。( i  N4 h. V# D. b9 ]
1 g2 Z" H9 x5 `! ]
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 20:05 , Processed in 0.761776 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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