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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:- [8 F2 r  a, L6 X- U% u
-s f000:0 ffff'SM'" U+ _+ x& ]0 k0 }+ C# Z
F000:BFB1- @0 e: g! h7 z+ a1 r' _+ F
-d f000:bfb0# y' s+ U% `, }5 r
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
+ |1 j3 _- Y) U" NF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...& R; x; F/ F0 {9 G' g
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
# D4 l; q  o# P6 R" }F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......: j7 P' w( D6 \% @# s; k
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......7 Q7 ]. \, J* A" }* i2 L' M
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.% I) V) b" O7 P0 H/ M
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
6 x1 [8 b# J1 I" h( y4 G. I/ [F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
% B6 |' m' B  \2 S-d f000:06f0. u6 c# E! b2 q" v' X" i; j
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
: N/ ~- U6 R8 y) U: H6 nF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American  p, k6 Y3 d& m: ~7 C! S9 U& `# \
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.0 {& }; x  {8 w
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2( |; R: e1 d2 ^5 a, n% \
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
. n* D3 I, L3 I3 m3 ?F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8..., X1 ~9 ~0 Z, ^3 S, T
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu; l  x0 o  q% P) b8 J
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
2 U: |3 I/ l4 d# b$ x5 X
' Z' @2 N9 w0 U. q
/ i; Y/ e' r5 D3 S, O1 U我要读出这里的06f9:07
$ q4 g/ S. ^1 d0 s, q5 Q: X) l 然后得到一个(07+1)*64=512 这样来获取BIOS大小-: E1 z4 W0 w; h
- J' X1 l: v6 j6 H0 F' I
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码% g0 e/ X" }4 }
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。- d! u0 `$ X8 s! n
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。5 k) p; p5 K! m/ o: v  t
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:: O" U  l7 F. n# `' G
.model small% E$ c. v; Q8 O( m2 ]1 w% |6 T/ ]: J
.386
# a4 q1 |  K  x: i0 [2 t1 z! k.data2 B" R$ x1 h% [- ^" B" W$ f2 n; p
    SMBIOS_Sign db '_SM_'& M2 g0 L3 p' ]
.code2 M: M3 \* R" u" Z
start:
7 @& P9 t$ I7 N! J    mov ax, seg SMBIOS_Sign, Q9 [5 j! A( l2 [
    mov es, ax
' D# Q4 j8 l' P% S    mov ax, 0f000h# t9 S' |& s2 C. {7 ?% C
    mov ds, ax% Z6 G! L7 x3 r) j, e
    mov si, 0
, j% |) u" H+ F    mov cx, 04000h
. O% ~; h: F6 M) r8 `% E7 j6 u$ W    cld& Y" i9 }3 i" Q$ P, W' L% A
@@:+ e- }/ x. y! o( L6 ^( c
    lodsd3 s6 L" g6 L7 ]
    dec cx( [: z% W, u* B1 f
    jz  short @F) K2 g) H. k, P0 b4 t- W0 r, f
    cmp eax,dword ptr es:[SMBIOS_Sign]
, S. ^9 ]0 f6 j5 ^, C& o    jnz short @B9 K8 @2 z8 q9 j2 q, p3 U/ Q
@@:0 ^* K6 p+ Q  W4 P( R5 ^
    or  cx, cx
5 S- h3 ^& j0 s2 D' F0 f    jz  short @exit
  j% B( Q9 M9 B6 I9 M5 y    add si, 14h
' y! l2 b- }$ h- f% ?    mov ax, ds:[si]
  h! z8 y3 L) `3 e# Q    add ax, 09h3 }5 ?* q: e, b2 b
    mov di, ax
/ i" @' c& x3 e  h/ E  w    xor bx, bx
3 e& a& F1 x9 o7 y: [. Z4 k3 S* _    mov bl, ds:[di]1 B1 D0 J0 h: Q
    inc bl
# C3 p1 O1 N7 \5 V9 g: N    shl bx,67 J" e2 o4 m0 w, c( j  ~
@exit:3 ~. ?8 [! O$ z* A
    mov ah,4ch
  T/ i" X$ _5 z% h5 v' f" e    int 21h2 @2 r# c& Y6 u/ A5 n
end start
, Z, y8 j5 q% k+ [' U! [cseg ends
% y. j$ k. |; `# V6 v推测你的算法是:
) e0 h5 a% [: V5 C- V1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
& K3 p3 W0 f& v9 C2.找到这个offset2+9的地方的值6 r+ X2 l1 J/ B6 B: }7 y! D
3.此值加一,乘以64为BIOS Size,在bx中.
' P& P6 H4 Z2 d9 l2 q) r$ A不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
. b' c0 ?0 ~* g- p) F/ r; ?5 r9 K    ;此处输入数据段代码  
: ~3 W, z  H" M/ BDATAS ENDS
: v6 ?5 T$ P9 C, e3 y, q2 B) R( K
+ N- f7 ^  E4 z6 F7 U, M2 s6 }; lSTACKS SEGMENT" ]) O9 ^0 j# o; C
    ;此处输入堆栈段代码
8 C5 f+ _7 w, _" N2 }) BSTACKS ENDS! c/ ~: G5 f; F" H5 j* q" v

) o, a* q# q% i" ^* U1 `CODES SEGMENT
% w( J) G3 _/ ^$ F2 L; _; D) S! q    ASSUME CS:CODES,DSATAS,SS:STACKS3 d5 A5 _* R8 O0 P9 Q
.486
& `. n* m$ V* b" QSTART:/ o; R* A% D7 \6 {- t
    MOV AX,0f000h
% o" y* |3 i  h" {+ G    MOV DS,AX
6 O, l2 R! H- b8 g* m9 V* W& z5 e    ;此处输入代码段代码( J! M' h9 L' m
    mov si,0
* a6 t5 l9 R& \* T; {4 m! e( ]   last: . T- s- H+ p; f2 v: x
    mov eax,[si]
% n- L; U) ~1 M+ u+ a) M3 {    cmp eax,5f4d535fh
% Y" F: u) l  V" k    je over) @! Y, C; p9 {: ]- c0 c  T- p; @
    add si,10h( R2 }# y: J/ s$ q
    jmp last/ U  a/ \) T$ y' S
   
) r' v2 |, C) Z; O4 {    over:
' b/ H& W) w. o5 ?% |) C+ H6 B    add si,18h; x, B- n/ }2 X# r$ C  \7 `
    mov eax,[si]
( Y% Z# o- s7 ?5 B    mov si,ax
" b( a1 f& ]* B! F/ ~' P3 g/ o    add si,9# D7 M$ m7 V& H
    mov ax,[si]0 g% ?$ V" T$ y1 [$ l# V+ i
    add al,1
+ {3 A' ~1 ~" F    mov bl,644 P/ k  X) a% R& s$ [$ f
    mul bl
& Q1 j; o; u2 y: t- `& B$ t0 l    mov bx,ax
7 f3 W+ N, [. m( w' h! `   : I1 k6 z9 \  K, X: z# N1 @. S' v
    call display
- x9 F8 d0 A" F8 F    MOV AH,4CH9 [# x+ ]" U* ]2 E% I0 n7 T' A
    INT 21H  + I( J8 v0 f& I/ {# o+ ]
    1 p9 a. w: v8 O( d. H+ }' _
    display proc near
: g+ @3 @6 d8 s   push ax9 @& s$ _; q# }
   push bx
0 }: l8 J3 Z) J   push cx
2 ?. X- G0 M9 v! y) |; j( a! z' Z   mov ch,4
8 C' H$ \/ k: a  rotate:mov cl,4
2 L/ E* {/ D  e3 I+ F# i   rol bx,cl$ T4 l4 a8 X. x* b& S& V* Z
   mov al,bl4 P  d( F4 G- q! ~, E7 X
   and al,0fh
3 Y0 I; J$ X" c) V6 E   add al,30h' v) I- {/ B" c, h2 h" |5 _
   cmp al,3ah
8 u6 H' Y& o7 t   jl printit
( ~7 }2 a( W0 c& M   add al,7h: P2 o5 ~, E! K# R; M
  printit:- N; K1 V$ r+ \0 M7 E. {  n
  mov dl,al
/ t( v9 G1 |5 a: V, D' j- {  mov ah,2# g) C* h- |6 P! v$ x
  int 21h$ Y! ~' j5 `4 G1 X: B# p- ~# \* ~
  dec ch# N5 B  h# R) j
  jnz rotate3 g; U0 j9 U) o0 s5 y3 h
  mov dl,20h3 l: s# i# |8 u4 g: j" _9 D
  mov ah,2h8 ?% w  f% n* C7 _
  int 21h7 o6 w& E5 d1 Z& K
  pop cx
# s: R( @. z' s) j* O- y  pop bx
% N2 V7 y/ |+ s7 i3 m. ]' I  pop ax. y, J$ K! m$ c3 N/ G& L
  ret& I+ V* T0 i% V7 h& @
  display endp. @) A* F) B4 x. W; i
1 F/ h. T) ^. w' h8 i* P0 j8 k
CODES ENDS
+ S' u# a7 N6 w" ?    END START; [" _9 U0 Z- H, {# \/ k  O
( _' _' d! C" N
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
: G& z8 k6 V& ODATAS SEGMENT
3 l5 F, V% x1 P; o4 v% `    ;此处输入数据段代码  
8 s) y* w% q% b$ Z7 [2 \0 _, c+ Z4 y' WDATAS ENDS  T! Q) L6 k: N2 g$ {

/ _6 n" c- n/ d! P/ I" E" O/ c, o" g, w, FSTACKS SEGMENT
3 {( u. P* ]) }) c" n    ;此处输入堆栈段代码
6 P7 [& w/ I" `9 u6 ESTACKS ENDS
0 e: d# T) t/ S" Q* z7 f; T" o6 o+ m0 D: P; N, F: Q* K6 K
CODES SEGMENT0 p/ v; P9 U( F+ Q7 x: g- h0 w6 W/ r
    ASSUME CS:CODES,DSATAS,SS:STACKS% k% G+ |1 V! a: l7 ?. x
.486* O' ?, d$ g) s9 h! W' R' J  m" w
START:
1 u4 t7 x  i* z, }9 h# f0 R6 V( }    MOV AX,0f000h
- ], q& w1 y4 l* p& Q    MOV DS,AX ...
7 x. z  \: k9 O( E$ x% K' {
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。, j- n; ^7 |( r$ w- I1 J

' q. o" @/ }, U/ R" s5 r还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 13:58 , Processed in 0.058387 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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