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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
! r3 D& [& S3 H" Y9 M-s f000:0 ffff'SM'
+ U+ B2 _+ ]& ~- {F000:BFB1( f" [* o, g8 [, S/ G
-d f000:bfb0
/ B" W2 f/ J: ^! ]5 V# HF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
2 ?) |7 P9 R9 y! a6 a) }2 xF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1.../ L' `% y8 K; i! P
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
9 X: ?9 L% d- C& ?7 j$ [4 e6 WF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P........ F# j$ Q0 h2 |7 ]( H
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[....../ [2 q' k" Y8 O5 [0 F. b: r5 _/ e
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.& C7 ]# y5 L4 S" ?: ]- s; O
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V! k* V+ h+ i. X8 M* k9 B
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
2 K7 u4 A% q6 n$ G# ?, E-d f000:06f01 `4 i& o) Q4 i! L& K& S
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
1 z  @1 k, n9 a, B4 bF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
* h1 p% v! m8 s& r$ xF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
  D3 _8 L& |4 H* n7 ^! I) uF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2: v! u9 Y# c& [0 t
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u/ l5 g3 u. Q' e+ p+ L5 u) M
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...$ G/ Q8 e0 R( u3 K
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu! Z2 W5 Q6 O2 r/ w
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ2 R3 o) S7 a) L, l6 v. a5 G

/ K8 r- b! t+ Q
: r% @- C% k* m0 s3 f我要读出这里的06f9:073 b( ~1 D! y2 s1 c
然后得到一个(07+1)*64=512 这样来获取BIOS大小-; ]9 i8 @3 G* C. e! V
0 h. }$ L. N4 D, C+ \
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
) E4 Z1 e$ O8 o1 E( i1 D* n# Y# o4 U谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。  |  K. R  N' k8 t; l) ]0 K
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。8 R3 `# f1 t2 q) C5 {* \
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:0 q- T$ u6 W. P* E; I8 Y8 u  e
.model small
$ c# T) }& l7 x* T6 d1 H.3865 R3 I% S& C0 E
.data9 `, f% I1 p$ b
    SMBIOS_Sign db '_SM_'
) T/ q) }5 }' z& n.code
: v% j0 U3 u% d1 pstart:
8 p" d6 |/ N+ R# Y    mov ax, seg SMBIOS_Sign$ d% x7 S& q% P- p/ {$ C; G' J
    mov es, ax( a* k0 @. ~- {5 x0 L2 R+ {$ N
    mov ax, 0f000h
7 L$ o" r7 s9 D7 @" I# |  G    mov ds, ax
& ^% [. ~) u7 b6 S& q  ^    mov si, 0+ K. K; }# }* n, I
    mov cx, 04000h
' @) \9 r" Z, J/ u) E) F    cld+ ^& F, E6 |) i, m
@@:8 b& ^" H0 g( T: x9 p
    lodsd
4 ?2 M; K# q/ r; s1 r+ b0 w) j    dec cx) ^6 S/ T3 v# i% q
    jz  short @F+ J' H3 p3 i) E6 z; P
    cmp eax,dword ptr es:[SMBIOS_Sign]3 n& U& r4 V: T2 D* S
    jnz short @B9 B) ^: A! D% V0 \: _" d
@@:
9 r+ N  y' I0 `" g) c  _    or  cx, cx# T) Q' ^. {, V7 C" G1 X- l
    jz  short @exit1 u3 c& v7 J( @- n
    add si, 14h8 A; R, |# C  B- B
    mov ax, ds:[si]$ [( ~9 h4 A5 k: ~9 M% z
    add ax, 09h
8 q. s/ l* r+ d) H( Z+ D    mov di, ax
7 V( Z& W4 U  Q    xor bx, bx
) _2 l/ P9 N5 C- _5 ]    mov bl, ds:[di]/ |% C( Y  d0 m5 A- l
    inc bl+ }( Q! l. @5 x4 |- b  r
    shl bx,6; @5 V, O. ~( v
@exit:
* D+ _& X' a0 D, Q" i  Z! k2 U    mov ah,4ch
, G5 y( \' S  U    int 21h
$ K' z+ B* _7 l, r$ Q" m; |( @9 M3 Rend start
* |) O2 X" j  B( i6 Z9 dcseg ends
  s. x5 T( M# Y! k# b, @推测你的算法是:
4 B8 Z! q/ W0 {0 F1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
1 T0 X3 J3 T( H5 D2.找到这个offset2+9的地方的值/ ?' A. z& t9 z
3.此值加一,乘以64为BIOS Size,在bx中.
1 F4 n, q) |* S! c# t- y不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT0 G, P* U% x# G1 F2 k/ o, w
    ;此处输入数据段代码  - ^( y6 t3 V* e1 k' y+ T# U
DATAS ENDS, }* G' k8 S+ {  K" R9 v! Z  T9 G
  \- }+ a/ A. ]' K' }
STACKS SEGMENT* O' C  v! @( @
    ;此处输入堆栈段代码
8 ?2 q) C: o& b5 q) S% ZSTACKS ENDS
3 ?7 x7 V. U  J# W, a# H3 k0 i7 P3 A
( \) f7 ]8 ~3 i. y; mCODES SEGMENT3 }3 |6 f* w/ T
    ASSUME CS:CODES,DSATAS,SS:STACKS
6 K( e+ o, e; W" B% T" F9 Z.486& b8 A7 p9 C8 h  X- x- S
START:
& q+ ~+ e) ^7 v/ ?5 B    MOV AX,0f000h
# @4 w. ?- r; I& [) _0 A7 q    MOV DS,AX
& ]3 A- P- O; n9 S. v- t    ;此处输入代码段代码
4 S& d& i$ e# G! E$ q    mov si,0
3 `7 ?$ n) E, J5 ^, |1 |, P  h   last: , D( E2 t7 X; l6 ^" s9 [
    mov eax,[si]
1 W$ ]( t1 Z& D- k    cmp eax,5f4d535fh/ e, A" w1 M6 j0 J
    je over
. Y. J6 q- X: l" t4 w    add si,10h
" l! J- Z  c& p( z$ j6 r' D* M    jmp last
& E& W3 L, ]4 j/ A7 B   
3 E; A. s* M, u7 x1 r    over:! R" z) u6 E/ A! b
    add si,18h7 n/ @4 d9 o& u
    mov eax,[si]
& P: T) d! [3 i+ G2 q, L. t3 _    mov si,ax. S7 A! f! e. }
    add si,9
( N! {. I( O2 D5 g2 D, s9 O    mov ax,[si]
+ d* x# H1 H7 W2 W    add al,1
8 I6 x$ X6 H2 c# @# x, M) _    mov bl,64
: |2 _! m/ ^& c5 Q3 t9 h, o    mul bl* C# j# D1 g- O7 R! f1 h
    mov bx,ax
; ?$ b5 g9 `/ A9 U   " ?, l2 M: {/ ?! Q) M$ ~
    call display0 X/ {  r8 y5 L& |2 n( O5 _, J8 j7 w
    MOV AH,4CH
' K1 U' ~/ R0 r' O# k6 L    INT 21H  , Q. S: V9 u5 c1 V( P7 |5 ~
    ( L( s; C  Y6 ?
    display proc near) c& @/ X" e' j' [- b) D$ S9 d4 T; O
   push ax4 H8 }1 |+ B& f$ t
   push bx1 v! Y% b, n: ^
   push cx
5 o" t4 W; c% _/ b  m   mov ch,48 [, [" v1 d+ E8 A$ T# T- q( b
  rotate:mov cl,4
3 X: c4 E. s9 g   rol bx,cl
) C9 m5 b# L' d% N   mov al,bl
4 f& S7 E9 {' R0 p7 X   and al,0fh
7 Q" p! t5 M- w5 A; L/ f& h   add al,30h( l4 u  ?2 z- F. x; o8 d0 }
   cmp al,3ah- d7 g. I" D7 U. y4 N
   jl printit% m7 k% h0 E- v+ ]
   add al,7h
3 b5 _% J! T, S9 P8 T/ a  printit:  A% x' O* a& _1 a
  mov dl,al6 S& m% k) W7 L
  mov ah,2
( ]$ a- `. {! X2 _1 @8 `  int 21h2 z) {7 z' B! D# P; D
  dec ch; ~; R1 Q6 U2 h$ X. A
  jnz rotate
7 L* v8 u' T9 G3 H  R. P/ M  mov dl,20h
/ r7 d4 b/ q8 L' ?- s/ |* U2 ?; h  mov ah,2h, B' g2 o; M- \* o& E3 b
  int 21h' i7 a2 j9 e* N* b
  pop cx- k* L- R, l! E+ T& W
  pop bx0 z- M% T* [7 Q9 [
  pop ax
: p! e: a) S# C( V! G( _  ret# j' d- W5 r( _2 y' b
  display endp
. ]. {3 v1 Y6 X& ?7 z% l( v- [: Z; N
CODES ENDS8 F% t- N2 O! q# H
    END START
) g. k4 r  b6 i$ d8 Y, r* I) M
0 \5 V! S2 i( v, \+ w  R) f8 Q7 l运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun6 k# R& f6 ^: [; R( t9 N$ J5 i8 h
DATAS SEGMENT' e' _0 o, {5 A& H
    ;此处输入数据段代码  
9 {$ r* L# j9 KDATAS ENDS0 `# s# P' ~+ X% v/ J

& ^" T+ b! ^6 q; X5 NSTACKS SEGMENT
, |! E' O) q( v$ M4 i2 j    ;此处输入堆栈段代码
5 L4 E: ~8 u) l  ^* h: ~8 B/ RSTACKS ENDS
$ ~4 v" D% N% ^; i9 \$ b( ~* \+ a0 k0 ~* G$ H4 D& b. i" [! Y
CODES SEGMENT
( l2 ?. t6 b$ i9 P    ASSUME CS:CODES,DSATAS,SS:STACKS
8 s$ F. g4 Q  ~( E$ O% J" ?.486  J/ \. O) C  Q& h  b  T* d
START:
2 x% [. C. {  K    MOV AX,0f000h- `# D  E, _# `% n8 Y9 Z
    MOV DS,AX ...

+ \$ [9 V$ x7 K" ?0 h8 {" U# e二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
) \; r7 q/ f; I( T/ d; \
" |( [, b6 D% j9 D' j还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:14 , Processed in 0.232105 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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