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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
6 J% I6 L1 N6 M% D+ P-s f000:0 ffff'SM'
, x- f3 E( _: ~# N7 p0 l1 sF000:BFB10 o: ?! g4 t9 t! q. x. z( m
-d f000:bfb0
9 a& I6 m8 {* L/ [' x+ c# vF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............( a  ~6 S3 C( M( k. a
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...0 Q& ?) G9 ?0 w
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
: W- G4 d- H2 w8 n) H$ c+ Z+ dF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
# p: i1 K8 N  Q2 H* ]5 SF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......" w. C$ @, v" S4 i' V
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.% ^4 d, x, B" J0 |( I
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V% ~5 _4 s5 R* F) _0 i
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
3 n9 X) p4 t1 y5 D) p, L-d f000:06f0
. C! G9 ~* y* ~F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................+ ~! u6 U2 X7 |7 {( T( U  Q
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American$ j) N# K8 z9 f: F! Z5 [* n  `, @' n
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.0 i1 Y9 n5 u9 F( |+ x' B: E% h
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2% \8 V+ V) G) h  s; D3 Y
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u2 ]: @- M/ }% s' T. N7 J. J: Z5 ^
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
) c3 q2 ], d7 ], xF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
8 h4 s0 `8 d# B% p0 C. H) iF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
% g, g+ y$ c1 v  V6 o4 w! W9 r# e1 {9 E4 B4 }: t( M
& k! |# S: k$ F- `, n; u6 X
我要读出这里的06f9:07
0 \0 B+ k& e  K. D6 O! O1 Q 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
  A# w  f8 [5 ]  ^2 _+ N7 _  V7 W( q4 A* N- x1 ]9 y1 ]: C
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码) `1 E4 E! t$ y+ f
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。# q) d: J1 }0 q. `4 @/ M4 Q
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
3 H, C+ c9 ~1 C/ Z; c% J至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
* ?* @" k; g. T.model small. `2 E8 \: G  M' _- H2 |5 S' m  [
.3861 s' ^* j$ F/ b: @7 X  V
.data1 {9 K; i. E( p2 k; }( {2 m
    SMBIOS_Sign db '_SM_'
6 N" U" c3 N( n  K.code
; X7 |& n( f+ Wstart:; I/ l1 p0 R* d$ N( Q8 R2 L1 w' X( Y8 _: V
    mov ax, seg SMBIOS_Sign$ g+ z5 e* G: C) `. k( g7 e/ K
    mov es, ax
# u, ^/ F1 }3 m( ?  A, n# q    mov ax, 0f000h
/ G) s: Q7 M( J    mov ds, ax
) k1 E4 j6 B: e3 @) Q# m5 w1 U    mov si, 0" T! ^1 X! q7 [! ]0 Z
    mov cx, 04000h+ Z8 I3 \; v& x1 ]( W+ }
    cld$ }! x# ~! v# h$ e: _8 I4 d
@@:
% A# _+ Y: p1 b  Q8 w  |    lodsd
, F) V/ c$ K0 d% M/ Y; E: \    dec cx
/ F: h/ n' ]8 s! v# y    jz  short @F
3 G( @7 M' |' x  h    cmp eax,dword ptr es:[SMBIOS_Sign]6 [7 R" n: O( v# {9 l9 t! e& l
    jnz short @B# T* Y6 W7 P  \# h4 J
@@:# B* C  a- P* C! x4 [
    or  cx, cx
4 p! H( n' G2 D9 k4 H" b9 n    jz  short @exit
4 `9 v0 I! ^: y; {' |  O" ^    add si, 14h
5 S9 y! z- P- B& @1 a2 |    mov ax, ds:[si]  M9 i2 G! T( c: h" E" l( L' g0 }
    add ax, 09h
/ g9 N" E# p# i! z/ r# p# }    mov di, ax
+ B+ K+ o+ C% r! H  r; ^' k& B    xor bx, bx
1 D8 q$ W  N% z! l1 L    mov bl, ds:[di]7 _7 @& Z, B* _& q/ {
    inc bl
) _. D' X1 I( P# r% T5 N# S    shl bx,6- h2 E  l' s/ R2 p5 w: P
@exit:- F+ n+ J6 {8 S8 r# r( {
    mov ah,4ch  W9 V) o3 M; k0 D& k
    int 21h
* @! V0 j8 T5 ~1 f; x; Hend start% v  e7 U; O; k* U4 M, V& }
cseg ends4 u1 K1 U) ]. N" u8 i
推测你的算法是:
( p/ Y: O9 a1 D1 `# s; J% U; Y1.找'_SM_',然后在其后offset 18h的地方为下一个offset2' m3 }" g9 W- j, W: @3 X* r0 O
2.找到这个offset2+9的地方的值
" l% G% H' P7 I" s" k; o3.此值加一,乘以64为BIOS Size,在bx中.
# s4 v' L) g8 M1 c, S! k1 h不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
2 v# P8 X4 B( I1 `: M6 L9 ~    ;此处输入数据段代码  4 z) f+ R. P6 i. H
DATAS ENDS- [# f- `/ ^3 ]2 W! b0 q

$ R  i% R+ t( Y+ {7 p% D' s" bSTACKS SEGMENT& ~( X5 ~7 ]  M; K
    ;此处输入堆栈段代码
1 L& @* S0 _! W* ISTACKS ENDS" C( F2 w, u8 l$ \0 I8 _" Y: d
+ z( ~( Y6 q0 J9 L: Q% E( n& d- k
CODES SEGMENT4 a! V1 K4 w- Z% N! t: E
    ASSUME CS:CODES,DSATAS,SS:STACKS
& O2 Q0 @$ ]2 Q+ f9 d* \9 P+ [1 y" D. W.486
1 `( D! |* q7 y4 W+ b) M+ oSTART:" v2 s6 O3 f# j/ O9 H
    MOV AX,0f000h
% H) h& k7 f2 w' |    MOV DS,AX* J6 h" i, V2 b& A( k5 I. b
    ;此处输入代码段代码
6 C2 X% S" F+ s" h6 h/ L0 L    mov si,07 I- R- O$ ~) p1 t& N
   last:
4 I" B& a- v& }( P    mov eax,[si]
- X8 z2 `9 I6 _    cmp eax,5f4d535fh
/ \/ x( c7 D; L    je over
0 ?# X; M) M* q% G4 v    add si,10h
; o5 p3 |# N& l8 z( J    jmp last! S: D$ F5 c4 ?% y# Y; C
   
$ w+ K- N# C9 P# f' q7 c    over:
2 x/ j" w& E8 l# ]7 L    add si,18h
) w/ [$ C, ?6 E4 n& z# T3 c) M5 P    mov eax,[si]- b8 [5 p! ]) e0 c, x
    mov si,ax- j$ c8 @1 i, `2 J+ F0 z. G5 U
    add si,9
/ P) T* K& ]  l# n    mov ax,[si]$ B" X) U; w& S% t3 Q' c
    add al,1
! n& w# `2 h6 j2 p3 t, h    mov bl,641 T3 @0 S6 k7 v. e( B, F8 E8 ~9 l" v, k
    mul bl
  f5 o- f1 |5 a3 H) e4 g    mov bx,ax4 e# y. ~- t" |
   0 _+ R4 }- X4 N
    call display; _* s! Q( C7 Z) Q
    MOV AH,4CH
6 H, K. [: g6 c, i# d" O) O9 Q9 I7 G* e    INT 21H  / P) l/ g- s0 |( _
    * e6 Z; a, W0 K. r3 x& w. {& n
    display proc near
* R' X! }0 N9 _; ~: f. q   push ax
, W! \# A* o$ k4 J   push bx
# @7 [  ^0 {4 D) D   push cx9 \, A! J4 n. D0 v. Z" c2 Q
   mov ch,4' |" R% E/ c/ |; @) T4 o2 V
  rotate:mov cl,4
2 W3 n9 G% n6 D/ _" X   rol bx,cl
7 D; V7 `8 B( I6 y7 U& Y$ A, v   mov al,bl. c0 h# @; k5 u
   and al,0fh
+ W  K7 k1 a) m. _7 t4 c   add al,30h& H, M* b" \: a% S9 A# R" ^
   cmp al,3ah$ J; }& J1 M. `. _: H9 k8 i
   jl printit
' @! r4 y& C* L, m; x# }0 X' x: N   add al,7h+ q. V  Q/ k$ R9 e- q6 |
  printit:( T: y: @6 f% y
  mov dl,al
  |9 v) ^4 ^7 F1 o1 S8 y( W$ S, g. F  mov ah,27 P- z4 \* C0 G" V+ T7 Y2 Y
  int 21h6 }1 H! j+ b6 m- E
  dec ch( f) m* D3 _* y) }8 w1 z
  jnz rotate
3 d3 N- V  ?2 l( g, a: u  mov dl,20h
7 c4 g9 u2 x7 H5 h  mov ah,2h* H' V0 p0 f6 K- y, u0 x# S+ M
  int 21h
  Y9 o- D( S# C1 ^" o  pop cx4 c5 e8 m. K. d- N7 v1 C
  pop bx
* C1 k7 J- |4 w, g( \  pop ax1 }/ t/ M5 K% H% M
  ret
- a4 f" g, h0 ^8 ^  display endp7 H& P7 ^$ K; c4 X% q4 O
" ^' _7 V' z" E% X3 |3 Z
CODES ENDS
, k4 r% m, \- H$ I+ Z% H    END START0 W) [" \/ \) h5 T0 Q9 |' W
9 K; k5 ^; g: \: z7 t) p4 f8 O+ L% T
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun$ F. S# t* U5 P- N$ Y, n$ b+ K
DATAS SEGMENT0 a! W3 V" K+ K# A
    ;此处输入数据段代码  8 A: d4 a: j  s) @) r+ _) \9 U
DATAS ENDS
4 T5 E3 q6 S/ }" `/ L& ]
, x+ Y; g8 a9 a4 E- S4 ~; {+ l/ ?STACKS SEGMENT
5 l* j% l4 F- a6 H    ;此处输入堆栈段代码& B9 L+ @5 x  Z: J
STACKS ENDS" P- M0 [& M, B( B; w5 Y
$ z1 K( B# D7 K
CODES SEGMENT, q$ e9 \9 i8 \6 O: h) [' A
    ASSUME CS:CODES,DSATAS,SS:STACKS
: p; \" ~( ~6 K; e7 v.486  i1 I; K' d9 u" T
START:/ \5 U2 Z) ^3 o1 o
    MOV AX,0f000h$ ^0 `# b9 Q& R  C6 ]
    MOV DS,AX ...

4 a. m, w- m, B0 N: Y二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
6 j3 O% d$ o8 d( N' D% }3 T$ H* R7 Q' q% k& ?0 R+ R  V3 `
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-31 09:44 , Processed in 0.024985 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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