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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
% g4 c3 M. c5 `9 V( F  x8 l1 \-s f000:0 ffff'SM'- V' D8 E& {- y& |+ _* s
F000:BFB1- I# w5 x' |9 |! P" u$ {* |% M; s  G
-d f000:bfb0
0 a* M5 H& m9 t1 `F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............: e+ p/ A$ r$ o9 G6 |
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
, u' ~; S) `+ Q0 e. aF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
6 T  A8 c  Q( JF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......* l' R) |; w, R3 _% Q
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......) w9 Q% b+ w. `* ?; s
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
1 r/ K3 a, z$ iF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
8 ~6 ]3 B& r! J9 ^$ Q. lF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..% N: _& I# M- e/ j
-d f000:06f07 V! }& W5 b( [6 f6 y) u6 i
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................, H& V  Y, V8 W( D5 }3 X2 R( l' c
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
$ a) ~( Q" U) i& v0 lF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.. J$ e' l3 y- M  h  e
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/27 Y+ C. H3 W  `7 j7 R$ }: u8 Q
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u' Q  ~3 X* M* `! s/ H* c! U$ P) C
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
- o3 u! S2 |* f, ~7 hF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
/ A* {! r' z' i9 gF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
% A) l% N) m: C/ \* P
) a+ }$ T+ R0 e0 `4 ]/ f4 E4 b" @5 w9 H8 i5 e- h& m
我要读出这里的06f9:07  }8 y  x) }$ a
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
7 v# p9 k6 i6 F% k& V; a# q4 m( ?- g' x7 d% D" J" g- v7 Z
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
( l$ A4 A3 |% n& b( h谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。5 _! Y1 f- C+ Z  E1 n8 g1 y
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。$ o1 _% q! s5 c) f) }
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:" I8 y7 V8 V9 l2 f
.model small
1 |  D5 T) H2 n$ t+ d, i- o, R.386
1 i1 d) Y' t, w.data
% ~# }; g+ y& ^& j5 Z: h/ r    SMBIOS_Sign db '_SM_'6 v5 a4 G8 g% U0 p* V! X
.code
/ P. I% q5 I5 y+ J0 g5 P$ xstart:
% J1 [7 h- q8 M) e    mov ax, seg SMBIOS_Sign
' ^: Y; ^0 t- L( B( j    mov es, ax% B) y0 s8 K- L" X! t
    mov ax, 0f000h
( x* w; Q2 z0 f& G; ]    mov ds, ax
4 I& M# c8 l1 Q) J& ^3 K* `; `    mov si, 0
( ~7 B, g; R: p. ~    mov cx, 04000h0 n0 S+ u; f- g# m) l4 h- Z
    cld: T7 Z( Q6 g2 n; T; H0 E* m. n
@@:
* h7 V- t/ ~- ^2 Q/ ?8 j    lodsd( s4 ]3 l5 G' N3 u& |
    dec cx( a) a1 p! d  g1 Q
    jz  short @F4 R# I" C' @+ l! u# h6 R
    cmp eax,dword ptr es:[SMBIOS_Sign]
/ Z1 a7 v- y0 w/ w' u; r  U# ?* S    jnz short @B; \/ Q# v/ p- t% E4 A" Z
@@:7 T, S3 W7 l5 @
    or  cx, cx
8 r3 Z0 R0 O. a3 D9 \1 B6 Y8 m" S    jz  short @exit
- W8 p  R) t8 x2 @    add si, 14h
, e$ Y, p& v- w( Z& R    mov ax, ds:[si]
0 Y: I+ T( ^& h2 s+ I    add ax, 09h
- h+ T( c* Y' X6 p% s( Z3 b% q    mov di, ax, T: r+ M! }3 d$ a
    xor bx, bx
7 F) m% g' P1 j2 s9 x) K    mov bl, ds:[di]7 J% C8 ]  Q$ R, V9 m; e
    inc bl* \0 a$ }# v% L2 {1 D9 Q( j
    shl bx,6
7 w  j; Z/ w5 @9 p: K1 |! {1 h@exit:
* w: R* m3 ^( S7 ]) p% V, B    mov ah,4ch2 r  |8 v6 D( A  q2 e
    int 21h7 H  w  `! `+ @$ O5 C3 S
end start, B6 B5 q5 K* c- a5 g; p
cseg ends, C6 d0 J2 a% p# ^6 o7 {: [
推测你的算法是:, u# n. ~* i2 `0 P2 F: q- ]  Y1 E, j
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
4 q1 ?$ o) w5 K4 v- _8 g2.找到这个offset2+9的地方的值
- v- w$ u1 @- i: h1 C3.此值加一,乘以64为BIOS Size,在bx中.9 c* J: o  z. J
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
8 K( M. H- q$ L8 X$ \* S# k    ;此处输入数据段代码  
8 i* j. g7 b/ ]0 [DATAS ENDS$ |, l" A, q- R8 Z0 G0 @# }
- P  A% H( K4 y  R
STACKS SEGMENT
) ?, q8 ^/ v! D4 _7 w    ;此处输入堆栈段代码
0 {$ m# b/ ?2 b0 J: jSTACKS ENDS
, W  a! F$ a, {( ~
' N$ Y8 E* q+ {* G5 rCODES SEGMENT
# ?0 b: T( K9 \; X    ASSUME CS:CODES,DSATAS,SS:STACKS$ _! W! I3 T0 ]' R+ n  K, m) n
.4868 F1 W0 ^! \/ z- y
START:
6 S5 w: j7 S" a$ L+ D6 s$ ~1 g    MOV AX,0f000h3 k' C" l* c6 V; e- B! B
    MOV DS,AX
( \, ]) ?0 u$ [; B+ K3 A5 d    ;此处输入代码段代码) ?2 D' E4 e) b. q
    mov si,0
, a- X1 g* K+ d5 Y  H3 x/ g. p   last:
. O, U. m" h6 M2 V    mov eax,[si]/ T! r  t! P3 o, |+ d
    cmp eax,5f4d535fh
) p9 ~! U: Z! K2 ]$ Z    je over# Y, \4 o$ c2 G: A. ?6 _7 }3 ^/ a
    add si,10h
- ]: Q. U) j2 T& I1 J( O( C    jmp last
! m- @& Z' Z, V5 Z+ x5 f: G    * N9 l7 W0 _% n/ I6 I5 e4 g+ k
    over:  W1 F5 W) N, m; ^! f% z& O
    add si,18h
0 o5 ]9 D- X$ R: A# }0 F  I! y" H    mov eax,[si]& ?" P, b' N2 P# R
    mov si,ax$ v& _: A% {1 C. f: a8 r: w
    add si,98 e* ^4 v- X( ?' c, D# z6 K
    mov ax,[si]
  @8 w+ N0 h8 \7 |) {    add al,1
1 R: D; Z: y1 n: m/ N; f1 M( d    mov bl,64: d- ~' J; i# l- g
    mul bl
2 U* Q5 I2 I; G1 {, o$ [    mov bx,ax
7 e) l8 O( y& G. t1 a+ r3 L2 _   $ C; O$ J0 S" C* i- F( Z# S9 F
    call display5 Y' q/ V- s) F: J# `( A
    MOV AH,4CH
" f0 i3 ?7 J: _    INT 21H  ; A( o2 y  T. w
   
9 s3 P+ s6 o5 T1 n! w    display proc near
) x( y5 k  g% c) s   push ax
9 I8 z) o; s9 ~* S/ l1 }/ c! x   push bx& t% z/ u& W5 L4 M' @8 e! x+ `
   push cx, k5 j! a1 c& @2 b
   mov ch,44 S0 M) S+ v+ h6 t! G; r+ I$ `; f3 W
  rotate:mov cl,4% @; X' I4 R7 z, o$ K$ _' u# ~
   rol bx,cl
- J+ c8 x8 _0 h. T% X# f# X   mov al,bl
( L; W# m( e; t) N: b. @$ y9 }- Z   and al,0fh
! r: }' k  x" A; x# d   add al,30h
0 a; ]. t2 i( K! M. J/ G+ W   cmp al,3ah
0 V1 F* Z- J0 F- r/ v5 j; k   jl printit
6 v9 _& ]/ C- z) T, K( h/ W5 B5 u   add al,7h5 `2 [7 U" i$ J5 L
  printit:
/ A8 P& l: Z& @  mov dl,al
8 b4 y, @( ^" F/ I9 A- \3 v  mov ah,2
$ H* w) t" r  L3 j' H) B  int 21h
* s/ C) q% {# s4 B5 A8 N  dec ch  f5 U7 ]2 `; j& T' V0 L
  jnz rotate+ ]& n3 ^2 K+ c- T& `
  mov dl,20h$ l* C* O2 W$ n( U* V
  mov ah,2h1 c1 r' t1 Y6 J" e5 ^0 b3 z
  int 21h& j0 P, H. M) m7 ~
  pop cx
. H% ], q; t" n, y- w2 u  ~( W  pop bx
) \+ {9 ^' @  }7 c  m0 g; b  pop ax
2 B4 O( y( f/ z4 F) p! p  ret
! y. w9 s9 ]; C8 e/ E* |  display endp% ?8 T3 J& Q4 e% W7 `+ ~* K8 _- O
5 B8 s9 r: L1 K: h8 X( \
CODES ENDS" ?9 F2 |7 t3 c$ x8 F! Y
    END START
2 w" U1 w' x' }" @- s3 _0 B- I( ?7 C  K# j4 v1 Y# ]
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
" u* U6 E+ X# @/ l, P3 dDATAS SEGMENT: T# A/ o+ k8 I4 t0 S& b
    ;此处输入数据段代码  8 e1 C) j$ ~, x. t1 H! p
DATAS ENDS# N0 P9 F' ^$ `, H

8 W, F; O8 g9 V  P: J4 }( _STACKS SEGMENT' p1 W. A5 c4 l
    ;此处输入堆栈段代码
) E7 a/ C  h4 i1 N* n& b- d, [STACKS ENDS5 n: b5 i% r' f: G  N
' a1 v, Z3 u! G! F7 m% Q* O
CODES SEGMENT
+ M  i- w- s# _1 u; p    ASSUME CS:CODES,DSATAS,SS:STACKS
1 T- ]. x0 }. ], B$ R& t) Z9 h.486: U, A/ F: o. L6 B! A
START:
5 [; H$ J9 e( r6 N9 f% U, I1 U9 ?    MOV AX,0f000h
; A( m% G; }! l# `/ Q1 K/ h    MOV DS,AX ...

% n0 n2 }: D2 b0 M6 r二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。5 D' B  ?5 Q' a1 x+ y2 v

' d0 m( e7 ]- A: N3 l# |还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 06:45 , Processed in 0.185184 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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