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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:: K2 `* n. o8 X# |* {6 q+ B9 P
-s f000:0 ffff'SM'3 G6 e; q& d2 ~% h
F000:BFB1
- X7 k. r) |" {( v-d f000:bfb09 m& y, H4 E9 T  a2 y% }9 X
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............1 Z, D7 s" a: h' N
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
# y' i& ]2 g( W6 q- @% BF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
8 s% [$ n3 b  x* R' \$ @+ D! qF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
5 V  ~' N" V# S) OF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......+ P* |* n6 F0 x3 D: ^
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.. ]0 ^- c  z2 {' T
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V" R" H4 H' z- Y! `/ r
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..) _6 t( ]: B! M7 |4 |2 c4 o
-d f000:06f0
' d: K8 K. J' C3 V. M4 t6 @F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
. W1 N6 _( b1 v4 }  U7 v2 e7 ~F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American% Z0 o3 {1 ~$ p* Y) q
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.* C- o- ^/ {& B  v" b
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/28 M' p% _3 q3 B- W( |- f
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
* s: A( O$ {9 ~4 l% j  Q, U9 z& iF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
0 n, @+ D3 `; |/ C/ h7 sF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu7 l3 [) V; N" k
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
+ g( M1 ?5 t/ V7 G* D8 C( s% J) g3 {# W4 E
, @- r+ b6 Q$ l9 p2 Q: D8 y
我要读出这里的06f9:07
4 A% K# F7 Y5 A) A 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
% w1 D& s! }/ |0 x8 B2 b
8 u6 ?2 d! g3 [' a用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
, q8 ^9 Q' x7 o4 d谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
7 A) k2 `+ C+ o9 o. c, Y$ v$ P正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
* d! X! V7 f( _1 a  |0 ^至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:" w/ n2 _% W) q6 r! w/ P/ H
.model small2 D$ U6 b- n1 a4 v  h4 q
.386
% ]) R; v- o$ k8 U.data
1 x! v! a! B5 U5 X    SMBIOS_Sign db '_SM_'
4 N. g! Q8 h( R; L.code
# {/ N& W0 G$ f# L* E- Z* [$ ], ustart:
" B4 T6 x" c7 W  Q6 ]. }' b    mov ax, seg SMBIOS_Sign
$ j, [9 W! A6 i, H+ O  s; k- @2 s, b    mov es, ax9 r/ L1 Z) g+ ?: F. t* B' |
    mov ax, 0f000h' I0 c2 v9 ~" A9 u: K
    mov ds, ax
8 ]$ w' C$ z$ t( H0 E+ q' @+ M3 w    mov si, 0
% S0 K' |4 u- Y* D% g- k2 Q    mov cx, 04000h) S- X- o( t- v1 Y& x2 s- n; ^- x8 F7 a
    cld9 v$ |# C% S! d: x: C4 i4 b+ r
@@:& ?, o# n" u2 D  D
    lodsd6 f9 ]9 u" z* z. Y5 R& A
    dec cx- j. }2 @: j$ X1 J
    jz  short @F3 j; K, o. T# U
    cmp eax,dword ptr es:[SMBIOS_Sign]3 H  {( Z% i  A! d) u, R
    jnz short @B0 }' D  _6 X7 I9 V3 g
@@:
  t6 q$ b+ {$ @5 }    or  cx, cx. v5 W6 r" I1 p, _7 a) @2 c; P
    jz  short @exit, L9 e7 H+ j+ |, `4 r* m  v  s
    add si, 14h
7 E: n, F. Y! c. j+ Y; ~    mov ax, ds:[si]) O2 |) J1 R9 \# S2 t! [! B# |+ s, _. n
    add ax, 09h
. P# p' z3 j9 h9 a2 X- ?    mov di, ax* I" d1 X1 t& W% n" O3 ?
    xor bx, bx
7 n. g1 V2 d8 F6 @, y. \    mov bl, ds:[di]
+ O3 S, l& ^' |$ M! p    inc bl
2 u$ s8 k$ p2 L6 ]7 y/ \. Q    shl bx,66 }% P1 c& w* I
@exit:
+ L! K" d& o/ p; S6 C. G    mov ah,4ch
7 a4 K( \2 M# D& G; K) m    int 21h+ z. s* N" {/ [9 W! a
end start
4 t& I) O. t* N4 `% u* E* @& d4 Qcseg ends6 k" n  G. I0 f9 u! y6 Q3 b
推测你的算法是:+ _- I$ s0 k% r& J$ e
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2( r. E) h2 `  L$ F# @7 t
2.找到这个offset2+9的地方的值1 f: y" |+ |* V' t: K
3.此值加一,乘以64为BIOS Size,在bx中." U3 K* B! E7 L2 I0 s$ b
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT! p. w8 @" C4 z5 B
    ;此处输入数据段代码  
& |- R. u9 D/ M8 J& w- mDATAS ENDS
; e7 r& ?; \) N, c0 ?
% Y: g6 g; W8 c+ C' f/ J5 fSTACKS SEGMENT0 K# ^  f- {  h) B% l3 u1 g$ d
    ;此处输入堆栈段代码
9 M+ ]. k, }" S& YSTACKS ENDS
2 ^, H) I1 N+ W4 @$ K$ R
$ W6 r  |4 {* ACODES SEGMENT
* D5 f' _% E8 L8 n" H1 K! ?: w, ~    ASSUME CS:CODES,DSATAS,SS:STACKS$ N+ Z% N5 X/ g6 E! a+ E9 R
.486; Z! V9 N+ @3 ?3 a3 ^* ]
START:
5 Y0 w2 K+ H+ W7 H% N5 v4 K    MOV AX,0f000h
4 p" q) [& R3 Q! e( l: V: F    MOV DS,AX
2 v" Q) T7 l$ f# L7 o; U. X* E  }    ;此处输入代码段代码+ U$ E/ H; E6 g
    mov si,0; r* V; [3 L- f( w
   last:
6 N+ k; y* L) R: H. a) _, }- p/ w! L    mov eax,[si]( r, f& o- R! N; F+ [" y
    cmp eax,5f4d535fh
( v' w7 w# F& T) i    je over
) T+ @2 E4 U2 o: b    add si,10h6 Y) {- `- P: F
    jmp last
. |5 h1 w  e1 n; U) d( [   
% s; s! _7 Q# b/ W# s1 ~+ r    over:+ @( q8 a2 \9 P) q6 y" |
    add si,18h6 p* E/ `" h5 R( {% D$ C# A
    mov eax,[si]* X4 Y! M! Y* `8 S5 {* L2 \$ F$ p& ]& U
    mov si,ax
  O+ y2 P3 w, h9 i: U# c    add si,99 a4 n5 R. n* Z8 G
    mov ax,[si]
  x$ s, C, `' r+ @6 R- z    add al,1# Z* X/ ~3 `! i. C
    mov bl,64
+ C0 ~1 y; N3 \4 s    mul bl2 M- t9 b7 z2 m' r. {/ W, U
    mov bx,ax
: e" T# \& e. k0 u7 `3 Z   ) @+ N- \1 X  d$ b+ ?
    call display- M# {1 Z7 F/ M& I2 J' Q
    MOV AH,4CH3 |* d4 Q2 G: U: G+ i
    INT 21H  4 K) |: z1 i. y
   
# E0 Y% p! y; n$ f% n! E) R    display proc near
  V; [) d) U+ f  l2 z# W   push ax+ q+ v/ J2 Z6 i# q  N# d( o  Z
   push bx: h) N; {! r6 z
   push cx! I( i' s6 N& Q# c
   mov ch,4
# A; X$ F# a& W# T, p5 H) @& k  rotate:mov cl,4
% |' C! N) t7 n- ^1 Q   rol bx,cl
- G1 u5 M$ S/ M- s' i9 |) t5 ]4 Z# H   mov al,bl
( k( j! T1 w2 X/ \   and al,0fh- ^2 L( b3 W  \
   add al,30h4 ~) Y8 @; \' @" ^9 E4 S! z
   cmp al,3ah6 n) W' E/ c2 c$ _' _4 F  |
   jl printit
* a. f; U5 [6 ]& e# P0 m   add al,7h. j' X7 z, R; \' i7 K' a
  printit:
9 G, l: A( W4 p' b# L: J4 T8 b  |$ @  mov dl,al' S+ V/ _6 Z+ i
  mov ah,2
6 L9 s5 I4 a* I  int 21h% R# C! E" ^+ I' B; @+ b* ]
  dec ch
  O  t. l+ o  o0 V- a! h: z  jnz rotate- z, ]' E, |4 c3 A- m* Z
  mov dl,20h4 i; w; M8 ]4 y: Y4 m" @$ R" R
  mov ah,2h
/ F% n( e0 |+ H! z  int 21h
4 r: Z* e9 `& I9 ]9 m3 D  pop cx
7 a' {; ^& b; X4 u5 A  pop bx& Q! L  S: H3 L. l; S' r* Y
  pop ax
5 p, E0 e1 u% i+ a  n% Q  ret
- c- j% l! y6 L7 T& q7 [$ o  display endp% W  y9 S) g1 P
7 ], s5 [' ~$ v! t6 c* s
CODES ENDS
0 @' C4 |  S- I    END START
; ]5 T+ y4 }) \0 X" x
3 N: c+ J1 A, K: @0 c运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
  n( r$ I, T4 _% J$ ]1 y1 ]/ E1 LDATAS SEGMENT) E+ K  f9 S6 e2 n
    ;此处输入数据段代码  
+ [5 G' Z/ f5 |! v/ EDATAS ENDS/ E4 e5 N/ _! E

) z9 [2 E1 N, @. \7 V! r/ cSTACKS SEGMENT3 N8 }; c+ k$ H' G3 ^
    ;此处输入堆栈段代码: Q( v& `6 U' m0 S5 F5 ?
STACKS ENDS
6 E; D; \! x& n& N8 v
# v1 C( b0 k/ gCODES SEGMENT
4 y2 X" e2 r* s! A& |4 R  D) i    ASSUME CS:CODES,DSATAS,SS:STACKS5 B1 W3 K8 h, u# F
.486
( ], @! J8 z7 L% O1 I4 h. T! ?9 dSTART:
2 k6 H$ f2 A: o1 X4 s  ], _    MOV AX,0f000h) ~0 P/ [1 r( H* i
    MOV DS,AX ...

1 x- P6 y/ R9 }* i5 e0 _% K' e二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。# C, M3 R7 |% M9 y+ L+ m$ I/ D# A
- w7 Y$ B2 `+ ]$ m
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 21:01 , Processed in 0.161306 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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