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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:/ N  r# T( n, D( G% V; I3 ?& j9 L: A
-s f000:0 ffff'SM'
7 d% I. ~" X. g- T8 \& y' P  iF000:BFB1
7 N. F5 M+ g+ t# z" U) q-d f000:bfb0
# u8 y: Q; _/ f3 @F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............7 F% m4 n" ?  ~* W# p6 c( S/ e
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...# U" R: ]5 L6 V5 p" [
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................1 y% [. @( X( U9 X# U4 R
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
8 z) C! z. U* ]& i2 @6 ~' xF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......: t4 O3 J# S4 u
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.' b8 v+ d8 Z. b2 [- s+ Y
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V+ Z. J  z$ V$ L: O9 |
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
/ _2 w+ K! \! Y, Z7 m$ h2 S" N' w-d f000:06f0% n1 Z# N# L6 j
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................7 j8 `9 v7 o% o0 o0 n8 ]
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
! t! {# C( [( @F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
- O2 T1 o  H4 b0 ?+ ]/ OF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2" d4 `' ?, R/ q: G7 w
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u' ?. c4 l- x6 ?( S3 I# u3 W6 C" }
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...# ~( V6 W1 |$ a
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu% m1 r0 i$ ^  a1 e$ K- k  L* I
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ7 `' K0 v7 j. U) n

3 ^$ c0 w8 a1 y( `$ t9 M2 H9 I: K1 h  r+ a6 J9 x! m
我要读出这里的06f9:070 v& t& `6 ?/ }7 j9 K
然后得到一个(07+1)*64=512 这样来获取BIOS大小-% g# X" D; S7 z% |
; |' i4 U7 f* ~1 P$ N7 k/ t
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
6 V1 L8 o3 ]" y: H' j  o; q0 R8 q谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
" K) t2 o; \! {1 k0 i5 q正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。/ \$ i* y8 I; k: H# Y1 {& B
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:# M' e/ |1 i$ w
.model small7 o( G$ {- E/ q5 U# A
.3861 [. E1 ]! {; O. |1 ^
.data
1 z* d3 q6 C& _# s. O, _( B: A    SMBIOS_Sign db '_SM_'' ~: y+ r' C; |2 d3 f8 {2 ~
.code& y) g1 s6 E9 ^7 b
start:
1 y$ \5 G' I2 N# c( K, U; d8 S    mov ax, seg SMBIOS_Sign
, P6 p* S3 _/ Z: A' }    mov es, ax$ ^" _8 |/ K6 y3 e; p
    mov ax, 0f000h$ {% g0 h4 i2 P
    mov ds, ax( k3 d" m) Q( ~7 T3 a  Z! N
    mov si, 0- ^5 i9 E0 R0 [/ P# S, J& K7 i
    mov cx, 04000h
7 A8 C9 G) @+ d7 o( `  w  a- o$ {    cld
; k2 j% \& f' n8 n@@:7 T+ ?8 g" h% O5 `
    lodsd5 }( f8 W, k" d2 |& X5 K
    dec cx# F' o2 d' _& @
    jz  short @F
6 {" p1 V2 Y; S! I) V# u    cmp eax,dword ptr es:[SMBIOS_Sign]0 e$ U; q$ M  n
    jnz short @B. `. N/ L+ }$ R
@@:! S& o8 m% L* N+ e0 k0 [
    or  cx, cx3 v2 Q5 W1 E( j
    jz  short @exit
, p9 p. p$ ~9 Z    add si, 14h
9 e7 `3 T" b6 e2 Z8 h4 G2 ]/ L    mov ax, ds:[si]- U+ @' x8 [( l6 Q
    add ax, 09h
( O! Q" [) C& u# |& y3 B    mov di, ax
* f" d" [! ~' F: t0 O    xor bx, bx4 r( l& V/ y* E: d
    mov bl, ds:[di]% P) D8 [7 @1 w5 \% A2 C6 E& ^4 c" _
    inc bl
3 @! ?8 K5 V# E5 g% T" C. S9 p# e    shl bx,67 ]- b) G) d3 [+ h: i3 k; p0 P; w2 L
@exit:
! [) r$ B. p& r" Z) K' L    mov ah,4ch" c" |) J: V3 {3 _
    int 21h$ h  s- R0 y3 r& V; q
end start' ]! D/ u) x7 A: _& A
cseg ends3 l$ c8 d2 x. ^1 {5 b
推测你的算法是:
2 o5 A/ Y- Y' M! H4 [) `5 c) y1.找'_SM_',然后在其后offset 18h的地方为下一个offset27 v* Q8 O: ]/ a( {8 _6 s
2.找到这个offset2+9的地方的值0 W( @" \' X: R! ?
3.此值加一,乘以64为BIOS Size,在bx中.
  s! J' U- @/ b. {- k2 @4 f4 Z1 e不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT1 l/ e3 ~/ @* ~5 x/ |) ^
    ;此处输入数据段代码  
  W2 \8 b# u- D2 [+ K. h; mDATAS ENDS
2 A; X: B0 P0 S/ g
' W. z% `% s% JSTACKS SEGMENT
7 g; _' b( J, J* C; u    ;此处输入堆栈段代码
5 ^6 n2 r' c+ z: sSTACKS ENDS
% S- w9 r; `6 [/ O: M) M# n4 X- P/ K. b( @0 [6 q( U
CODES SEGMENT8 O0 V: l* t* P. h1 a
    ASSUME CS:CODES,DSATAS,SS:STACKS0 S! ^8 g8 X8 p- u
.486$ N% h4 }* B6 t# d
START:6 R1 K+ [. J$ }$ S$ o* M% ]4 |. C
    MOV AX,0f000h
, w! l/ M# j$ R3 S    MOV DS,AX
# x- ]9 g  `4 B7 q+ i    ;此处输入代码段代码
3 C1 E7 O: v8 r3 M7 `2 _    mov si,07 R; b( X; N7 ]8 p( e% g0 s
   last: 2 P( P1 R. z% h3 D7 J
    mov eax,[si]
0 a- T1 y) j, U& A- r' A. ?    cmp eax,5f4d535fh
* N: ~# s0 j6 q4 _- W; p6 G  V( }    je over* _4 G5 a% A' k. V. [1 x& t
    add si,10h4 {2 A6 i5 {! b
    jmp last
& p! l: o& O% l; _# D   
- f6 ~: e5 {% K. f9 Y" j    over:8 b) R0 A1 I/ r
    add si,18h9 W( ^  j7 p. h) K) T' ~2 O7 w* J
    mov eax,[si], e5 U. O: G9 ]* B
    mov si,ax1 L  j4 ], z6 r! r3 S& t+ Y% V
    add si,9
1 A$ E1 u" z- \5 B5 y, o; V    mov ax,[si]
% M* m0 ~& ?; i4 ]    add al,1
  Z! e$ U4 K& D4 C, G    mov bl,64
; r- f6 L% F3 t' C& w9 v    mul bl
5 G, S1 w7 I6 c: j" c% D" ~    mov bx,ax
$ g/ I( A( l+ E, J% X1 W  U   
5 O1 b5 R, a9 x( K" \    call display: m- U  Z9 |) F# o
    MOV AH,4CH
" T" {- I% Z- m! b3 A    INT 21H  
, ^  C1 E3 u: Z7 k" ]3 ^   
9 T4 A" W( C* N& r' [5 L    display proc near5 s  H& Y: R2 o. G: @0 {4 P+ X
   push ax+ ^0 _3 J+ T/ M7 I2 [
   push bx( P3 I4 G: j2 _8 S$ z7 X% ~
   push cx
) j" h9 N5 f2 J; N$ h4 Y( ?   mov ch,4
5 D( T1 ?! y9 M0 C- c" b  rotate:mov cl,4
+ D2 r8 f" W# d   rol bx,cl
  o; q/ O& L: W" a" z2 @+ H   mov al,bl. l8 {3 g* d; A$ {
   and al,0fh0 J( O/ S5 l* [9 v9 f* K$ z
   add al,30h
2 D; J4 C8 F9 O5 ?   cmp al,3ah
; b( ^0 ]" `( `5 j   jl printit
% a% R1 P! [; E+ N1 ?   add al,7h' Q4 R9 _) j' I5 p: u7 l
  printit:& r3 W6 O$ _3 ]  R
  mov dl,al$ Q& |4 @3 ]" N5 K
  mov ah,2& J+ w* B: u7 ^( d2 `. }9 B
  int 21h; u  b, W, w) A& s  M: m
  dec ch
  E, r; M) u, V3 x$ Q  jnz rotate
* Y" A& J9 r+ n, F) \  mov dl,20h0 A' F- n/ n5 \# X- e
  mov ah,2h
1 N1 Y- p" P) h7 _, V: M1 C( v  int 21h
9 J+ z2 ?" A' Y3 Y5 h9 q  pop cx4 m" O/ k! r9 Q8 W* h$ ^" b$ l
  pop bx! @1 K/ a( X6 h- ]3 J* y
  pop ax
' t/ s# p! ~2 }2 L3 |$ }! {  ret
' a2 ^3 }- U7 D  display endp. o! g0 C4 ~' U- Y. u2 f# b: F' {$ ?2 d' B
3 k6 V1 B$ o9 V2 R8 o. `7 U
CODES ENDS
7 V" K& G* ~9 {  E2 C+ q    END START% A9 b, ^3 V9 O6 j7 u# ]0 C9 D0 Q

4 Q3 c- c2 Z" L# s& Y4 r运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
$ `+ O* n3 x1 ?) E, x& qDATAS SEGMENT9 W2 K+ i1 q  r+ W4 L6 o0 `
    ;此处输入数据段代码  
' ~' m+ c$ d/ c  b* F( E- V- B5 G1 zDATAS ENDS1 }9 X6 j% s0 ?9 l' b2 J1 G

4 u, t0 G' l- d4 @" q1 b+ z# x8 BSTACKS SEGMENT0 X; U8 R! W" U8 \  Q! A
    ;此处输入堆栈段代码0 [7 h- d! u5 f0 c( U: K4 c
STACKS ENDS& f$ y/ F8 F% f! m0 Y; |, C9 ~1 q

  u7 Q0 `0 R& o# K# ?1 I; VCODES SEGMENT4 p0 l2 J0 o7 k8 o6 Z( _
    ASSUME CS:CODES,DSATAS,SS:STACKS5 G7 F+ h! M2 \0 l$ v
.4860 J6 @  v2 p0 m
START:
; Y+ K4 X. J4 C3 d& F7 s2 V9 t    MOV AX,0f000h* c2 e1 K, V3 Y  o5 N7 R$ Q2 z
    MOV DS,AX ...
4 E! |; ~6 `; ]5 h) J2 R
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。: _8 \* K# d- ]8 V& f2 U  q$ A3 A) C
% R! {3 ~4 q# r* z
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:20 , Processed in 0.078621 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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