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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:8 K. N/ |$ N: V9 {: O- j5 j
-s f000:0 ffff'SM'
$ S+ e) y- ^0 |. J$ [- a4 nF000:BFB16 f- |' \. h8 q; [1 d3 I
-d f000:bfb0
& j/ n' ^  e4 T7 g# {F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
5 y, E$ @7 v9 w5 K/ C$ gF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
# L1 O! R1 [1 H/ g0 a% v6 S4 b5 Q: d. CF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................. G' L; m  d# T' J8 I
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......: U7 Y' |; ~/ _3 m' ^" |/ U
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
0 e( r% a" ?$ H( p4 e, E. @F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.1 d5 J5 }9 t8 W, R& J
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
6 X# v/ ]" |, n8 cF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
5 F$ q4 ~) ~. S. J! Q5 b-d f000:06f0' V. w( o9 h9 m/ m" s; S$ f
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
/ {- B" K! a5 E" l6 \- Y7 u8 mF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American& p: P, M/ r. N4 g2 r
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.! R, M  }1 l4 C5 L/ ~
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2: V% V, U, M/ O4 k- |: H
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u' _$ G9 y# d- P8 `
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...& z" l3 C% U, s$ n) n8 }
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
1 T0 j, _3 g% q: x- W1 hF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ- U) D. u9 r) E- H4 s+ H

$ G# H( H3 e0 W6 U2 u; G+ r& n
, a$ G" [" j. V: b6 F# B我要读出这里的06f9:07
1 r4 J+ n' h9 O8 |: H5 B5 S0 v 然后得到一个(07+1)*64=512 这样来获取BIOS大小-; L7 Y6 c- V3 \5 V0 w) A. K8 S9 J
! `8 Y( N" [$ P
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码; ^* P; {4 R2 }- Y: U+ n7 u5 B
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。0 _" ?3 C7 X# h
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。3 M# u+ n; e0 c" ]' @2 g
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
  i) d/ C% m" f3 z7 p  C1 j6 G.model small
0 g! H$ h- B. K+ L.386
" K) N# E( ?  N' j.data% d  H4 I$ Q" f, t  [! j+ t$ Q& }
    SMBIOS_Sign db '_SM_'
: V% }9 g. X& U( m3 S, b, y! r.code
2 y7 E0 a9 b8 s6 g; s8 Cstart:9 P0 E4 e" G' f% O
    mov ax, seg SMBIOS_Sign
' [* ]% k5 r$ Y3 R) x5 j% L    mov es, ax
3 P1 h, S! w. Y& I/ f* F    mov ax, 0f000h) i! Q3 Z% x+ S0 z: C
    mov ds, ax
! x2 N4 |9 M6 e* W. b    mov si, 0
5 x, ^' j, F$ X# L    mov cx, 04000h+ {" t# e! w, E3 z) _3 ^/ m7 u
    cld3 u0 O8 G) \( a1 z! _, e
@@:/ q9 @# D! Z. O/ k, V
    lodsd
* [( A6 g- }( b6 z( q    dec cx
, _) f  H& a/ C, S# c    jz  short @F
1 b: E2 \7 k+ _% X! X8 j/ L/ Y    cmp eax,dword ptr es:[SMBIOS_Sign]
" L; R$ e2 a( j8 C; [: o    jnz short @B
& ]' x- A+ b1 @* a  ]: h' v; J@@:7 ^3 ?: K& o( }& y$ A% p  e
    or  cx, cx
+ W; ~8 k& w; F" i0 R    jz  short @exit
) v' T' L  _! q( |  K% C    add si, 14h
- ]5 B* C5 \& k5 [5 c    mov ax, ds:[si]
; d1 X; r; c& W/ i$ t    add ax, 09h1 R# V' m2 @6 T! Q+ [  Q& u  W
    mov di, ax
, g& E, _" V6 {/ V- i7 x    xor bx, bx
: u- ?$ x& h$ U6 U6 S3 y    mov bl, ds:[di]! A8 @$ D) s1 c( W3 f
    inc bl
! n2 o/ _" |* S    shl bx,6' w( y0 H. L% \) e0 n7 Z  o8 W
@exit:$ a) R* W  j2 t7 g3 }3 a
    mov ah,4ch
2 B/ ]5 v: e  I4 i; q    int 21h8 j  ^) g/ O3 V
end start
" C: H# A, P: zcseg ends% k3 \# I6 y4 e( G+ v
推测你的算法是:
7 e# E- N( G1 L! f8 y1.找'_SM_',然后在其后offset 18h的地方为下一个offset26 ~9 j; @& e8 _5 e" a+ |
2.找到这个offset2+9的地方的值
' S+ |  {! J# E# |7 C7 M: R2 B. z3.此值加一,乘以64为BIOS Size,在bx中.
1 q; M3 C& m+ ~( s- I* j不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
5 c" _! F& u! y/ U  l    ;此处输入数据段代码  $ P- @; z5 l$ l, D1 D" D
DATAS ENDS
. I$ `! m& d+ ?; L3 }
2 E4 S  Z1 o5 O8 pSTACKS SEGMENT3 K2 o6 O: O0 }3 p2 `4 Z9 o
    ;此处输入堆栈段代码% ^: s* P8 o4 @' s+ k: p! a
STACKS ENDS
$ B4 ?/ G; N1 d" {) R
2 e# P1 P0 h4 {) P, Q6 DCODES SEGMENT
5 ?9 q; M  k. y# C+ \1 l; G8 [0 _    ASSUME CS:CODES,DSATAS,SS:STACKS$ t3 a; z; {( v  v  Z& q
.486
" C1 k: q9 s! A5 s% d& vSTART:' f- ~2 s  K" C
    MOV AX,0f000h2 _! C) V& r; p( R0 |" \' R& N
    MOV DS,AX3 F9 |7 V" a+ O) [5 Y
    ;此处输入代码段代码
/ I6 I( }) V! n9 H5 c* m7 I    mov si,0
9 ~: m# F' }  A( e5 r; [   last:
# O5 V' v, ?7 f7 ~& q8 V    mov eax,[si]
4 q# u; C: K& n8 v7 l7 A0 w/ f    cmp eax,5f4d535fh# J, Q* w7 g* G2 e
    je over
1 l1 ~; A( p5 W8 J$ R    add si,10h  i2 U( N+ e& Y* O+ q: O$ q7 j' r5 x! s
    jmp last+ V+ P- A( H0 e. ]; u2 n7 ~+ i
   
4 w( w. x/ c4 T: a: ^# ?    over:6 W8 ^0 a3 g. ~
    add si,18h
* B/ A- f( o5 o" n    mov eax,[si]
! i! S! R6 F+ z2 q+ K$ e4 k: Y6 m    mov si,ax
0 h) p1 v7 }6 U6 O; {    add si,9$ I! i0 s  ~, Q2 O
    mov ax,[si]
1 r; l$ u# c" L# [& @3 [. P    add al,1
+ w) s9 D* Z1 O0 C7 W% C    mov bl,64
1 @3 @  j' ]5 H. z* W4 _    mul bl
: n1 F1 r+ B9 R  B    mov bx,ax5 o: \5 f) q1 w3 f" D4 G% r0 M
   
$ _& R+ ^, Z! d: J; p: O/ {3 }    call display
- \- d0 Y+ N! K    MOV AH,4CH
; m9 N* D! E& A; X4 Q    INT 21H  1 t7 f$ X7 Q1 L1 z$ s
    3 C3 U$ v5 t" u8 g
    display proc near
* t# X2 ?+ X+ ^' F   push ax7 e0 g1 E! }$ ^: H
   push bx* U  y0 {. ?6 m4 K: d
   push cx0 J. M# o' x0 W9 b  E
   mov ch,4
7 J( \  N% `7 {+ G! |  rotate:mov cl,4
, b/ m3 D% X7 U; ^! T% m   rol bx,cl
' \' n' b/ ?3 b. H+ r4 N7 ~   mov al,bl
& `: F  U$ S0 c: R3 g+ G   and al,0fh
. ^) G) c& X5 q  w6 P5 S3 s5 s   add al,30h
+ j% I% n$ P+ h   cmp al,3ah/ Y7 \0 I. b; q
   jl printit
% Y' Y3 o/ A1 _4 d   add al,7h4 f  L8 {0 Y" D9 W
  printit:8 t2 E- e" a& X# Y, Z! m
  mov dl,al- D" }$ U% u% I
  mov ah,2$ O7 q5 c$ ^/ D- Z8 k+ \; C# \
  int 21h3 R8 z# H# z0 N
  dec ch
, i3 ~. B8 C3 W" Q: R8 w3 D  jnz rotate& W) w4 e7 I) r* M3 e7 C
  mov dl,20h
- `. D" u4 q# A1 ^1 I$ d" H  mov ah,2h/ v5 w) o3 O( K% Y
  int 21h+ g9 B. K' J3 s  J" ^
  pop cx4 l5 e6 r+ W/ B! T8 S
  pop bx% @7 \1 `& H+ r9 `: b
  pop ax
! K$ u; A  j0 j/ r2 }8 T, @) I  D  ret; k% v, n! ~" V& U$ |
  display endp
* N4 ~0 T$ G- g) M' d4 {: B
; ?8 b: ?/ w7 u9 v5 kCODES ENDS/ r* K0 A' \& e* E/ Z
    END START1 G# e; R, x# R( L( q! L+ ^- [

  M  y, V& O. x6 y  b运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
6 P; i9 d& M" N; h9 t- w4 G$ VDATAS SEGMENT
) ^' @, r# P. d8 |    ;此处输入数据段代码  - \8 p( L# M/ V' i0 d- m$ v
DATAS ENDS
) E' m2 b: p0 L  g  v( K% Z- T
2 n6 H- _  {+ L* t; }- VSTACKS SEGMENT
: i. W+ K7 _/ G' Q3 [$ T/ y    ;此处输入堆栈段代码0 S' B# X' W1 P$ ]: W
STACKS ENDS( ~# q+ V, p$ E3 }& t+ ^

# ~* s" R+ x+ `. O" ACODES SEGMENT* m- n0 @9 x. y3 F5 w8 D
    ASSUME CS:CODES,DSATAS,SS:STACKS
/ `  i# Q2 T( h: \+ |.486# k( f5 r7 K: D4 I3 v5 W
START:% I" _8 e+ t: x" n6 O. C
    MOV AX,0f000h
* q& a) Z# {( y7 u9 K    MOV DS,AX ...

- [+ l' r8 v. y# `0 F/ E! u- H二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。% T6 J  J6 ^* _

- ?. ?* N' p) [- v8 a( `还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-15 16:24 , Processed in 0.407013 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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