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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
6 _, K6 l/ b# \9 o-s f000:0 ffff'SM'. G% j( i0 S5 B
F000:BFB1
, b6 _! T5 }( [% |" n6 f- n$ t& ~-d f000:bfb0
* }+ L4 _& ^) A1 bF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............# f: E( }4 n& u& s$ V1 j/ U% W+ m- s
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
/ z# \# Q7 Z) P' J5 t( r& KF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
) P# X2 a6 n" ^2 W1 w( M. mF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
- u# ~& N- y/ C% iF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......% [' S0 B7 s- P' l; o  v3 e
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.. w, R, z7 Q  b% O" u1 O: r. P
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
! P! Q+ ?/ e- hF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^.., Z$ Y+ u9 \* t) g8 Y* _; S
-d f000:06f0
9 U; [: d* N9 X. D3 |. q' v+ tF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
4 X) C) P8 @: E& r0 o6 s2 P% S0 ZF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
, `! P" x  k/ d" {( a4 r5 IF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
8 j& M1 _" Y) ?7 z$ NF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
* A4 W! G% {- l' y0 V3 CF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u" A; I; x+ e7 t$ q8 d2 ^
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
5 t5 s2 ~; W% U! V7 P5 N0 V8 n  NF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
+ T0 |4 U/ E7 WF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ1 `1 E% d( E  R( G6 o- L- `
. h6 w. i! o; X; J1 o1 [
. _" m- R8 A4 ^* q' _
我要读出这里的06f9:07: l% L& U( z4 l3 r5 M+ g. b
然后得到一个(07+1)*64=512 这样来获取BIOS大小-; I3 Z: |, _0 |7 d7 s6 C
% x/ `' ^2 i+ E" a; O" ]
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
7 Z. E6 D5 C7 A" C$ ]" q: K( N谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。" t7 O  z1 _* }& q
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。  I. ]# f# ]8 j" F3 D! P
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:. d1 D( ~' I. u2 u! k4 X* A+ e4 l5 s
.model small
4 H9 L, h6 d* }3 ].386
' e8 ^9 L1 ?: w* E1 Q0 U( `4 _& [3 _.data) w, s' a- m* R+ Z/ ~
    SMBIOS_Sign db '_SM_'5 b1 `7 K; B2 `1 H! _
.code
4 l& _+ ]% {( ?start:
4 H2 _! W" c" K8 F# i5 ]4 v    mov ax, seg SMBIOS_Sign% `! g$ {: [- A, A( d8 w0 U
    mov es, ax
- ~3 _% i2 O) G8 t# w, \    mov ax, 0f000h
3 {) s( D! R2 F5 T7 Z% }    mov ds, ax% l* @# _/ C: s' z4 D
    mov si, 0, e( o+ \4 S" z
    mov cx, 04000h
2 x: c9 H( Z2 [. M$ L    cld1 x1 C' L3 t  Q  s: q4 s  Y
@@:, K* ?- E/ H" R- A- f8 i2 [1 O
    lodsd0 @. W! `8 _- G3 |7 ^/ b) U8 \
    dec cx
& P3 H1 g$ [% ^+ Y2 H5 l$ d6 E8 m    jz  short @F
1 ~( P+ |$ U" F$ o    cmp eax,dword ptr es:[SMBIOS_Sign]6 J5 b5 y: t! i) E- O) _  g+ @1 N; c, g
    jnz short @B* I' ?2 Y, j/ |
@@:1 b3 s% i" v, }( x
    or  cx, cx
; Q) D" p2 |+ o* G% J* @; H6 U    jz  short @exit
+ x; x+ T8 j2 U  Z. Q7 U    add si, 14h, \+ l3 S9 ], o# w, w
    mov ax, ds:[si]/ D! P1 v& T4 `# p. D  h" o' t4 L
    add ax, 09h
* }0 |. @# m2 k    mov di, ax
5 ?" M: X- m  x7 ^2 e# R- N) i    xor bx, bx
$ i& R+ [9 B& H) p' d1 j$ ]    mov bl, ds:[di]4 c$ s0 u7 H5 B. H: X
    inc bl7 L& q) X$ x2 t% V
    shl bx,6
3 S6 y; q# r0 U5 e; K@exit:2 c2 B+ g, X% X2 t; i* C
    mov ah,4ch
; a# l" l/ x0 j/ L3 b, y    int 21h% g1 W8 d% U9 _) r! t' |' [
end start
* }4 L# N6 j) m4 H- f3 Vcseg ends0 m8 [- P$ g( e, }. B
推测你的算法是:
$ n% B+ ]7 A, `2 U! N! z2 U1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
# ^- Y9 [' O4 T* t" A2.找到这个offset2+9的地方的值# F* d2 }5 U& s9 [' k
3.此值加一,乘以64为BIOS Size,在bx中.( J, h5 }0 u7 c. e% a/ @3 u9 @, W" r
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT* F3 ], A8 W1 L! O$ u
    ;此处输入数据段代码  3 @4 q& c" j$ I6 }0 X: _
DATAS ENDS
& T+ ?3 }' u) G  U, L$ p: Q$ S- j7 M  @- B; f0 O
STACKS SEGMENT3 [- U* n0 `/ w
    ;此处输入堆栈段代码' m; K% Q4 d4 [+ }
STACKS ENDS4 f) S6 B1 a+ _3 J7 L0 g4 O) h" `
/ y/ x" D9 U$ I1 P/ C
CODES SEGMENT
6 b+ y% ?. f) H% t* c" ]5 A    ASSUME CS:CODES,DSATAS,SS:STACKS
) S8 l  U( ]& b! z.4867 e# F8 X. P0 D9 Q
START:
" A: i5 s4 b* v% Q4 p# @    MOV AX,0f000h
( q& G* T8 [* n3 m: G% Q  {& H9 ]    MOV DS,AX: q" P- }. d+ q6 X5 k5 H- Q
    ;此处输入代码段代码
" J0 c" b& F7 e6 Z    mov si,0+ T0 F! w6 m1 x) ^) S- g) d
   last: / ]1 G5 ]& Q9 b1 k$ r4 A3 V, _
    mov eax,[si]
* G) }0 D9 a/ l( o4 e    cmp eax,5f4d535fh
) T. U- S, v! W+ o* ^0 ?    je over
6 F- L. M/ Q- X) N    add si,10h0 M7 W' T8 W$ l' }0 A  B3 {- V
    jmp last$ x6 [" l& Q; X3 w/ x) k* @
    / c! L3 Y0 w4 B5 T
    over:! b$ R  }9 M4 g# X" i" x
    add si,18h
% h  U+ v( m7 }    mov eax,[si]
  D- H% b% F3 v/ n. m    mov si,ax
7 f/ C6 t+ h& @' D) M/ ]    add si,9
: i( d' Z& C5 a% n    mov ax,[si]
5 ^, h' c  q3 h, m( k) V: O4 l    add al,1  |+ \$ e0 E3 O+ W' A2 L0 _/ ?& ]7 p
    mov bl,64
: e& i  B2 q# K) e/ _7 s( s    mul bl" A5 {$ G: ]/ g4 I
    mov bx,ax
5 D; K9 K& I# P( w& A! D$ _   
) R% U3 C/ i# v    call display
1 j" `7 U9 g- A, o3 \1 X- ~) B    MOV AH,4CH: G9 V8 K% p0 ~# z5 i: L
    INT 21H  
5 t( t; n- m! d6 m9 u& O$ s    1 u! e, `% T- Z7 }4 y: b
    display proc near
8 E8 G+ @. h0 n' y   push ax
8 B0 P- T& e- e   push bx
! k- O- o* ]+ H' s   push cx% y/ d8 i0 j4 ?+ v1 I* S" y6 |
   mov ch,4" ?' [5 ~' A8 S$ K0 Y
  rotate:mov cl,4  s* j  p; f# Q5 V, ~7 Q/ V
   rol bx,cl
' e% e* f7 J( s% \6 D   mov al,bl
' y3 Z8 C  s2 _) ]/ \+ d% R   and al,0fh2 n+ i9 t! m+ R+ b, Y1 O* [# N5 |
   add al,30h
" A, {9 H7 C' |8 V   cmp al,3ah  z( i4 C( I' M: k& p* N
   jl printit
# j: W0 [; k- b/ w: c   add al,7h/ J4 Z5 i6 d: [' f! e
  printit:* q4 G% j9 [6 c2 |: Y
  mov dl,al
2 E1 [! s, L6 j7 t9 H6 s! r3 O; e  mov ah,2" V* w* j$ U. V2 X1 p4 Y
  int 21h
& l7 J: X* q% u3 _) n9 g  dec ch7 `& v  S  U) ]+ x7 m# F7 f3 A, W
  jnz rotate
" i- ]/ Z* j5 W' G+ M& h! v  mov dl,20h) ?+ t+ n) f4 ^% g
  mov ah,2h
2 T# `+ X* [/ g% h9 M  int 21h( U/ \) r$ q& k' |1 z4 c4 D$ a/ L
  pop cx
/ a) U, B! o' F$ k  pop bx
7 a. G2 ?( I7 s& R  pop ax
# i; Z3 W4 o* F1 G3 s, f  ret1 N. L1 f8 E& h" t1 n8 o; x
  display endp  A, m# {* ]' @+ h
0 x0 n9 C' O0 B2 M2 f, b7 Y
CODES ENDS
5 b) }, X! `# p2 o    END START5 q9 O# _7 y0 ]$ ]

0 L2 x7 t4 _3 W( y6 i5 b0 x: r运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun$ \" }2 o4 w. Q$ t# P* h( G  Q/ S
DATAS SEGMENT8 }0 f4 l0 M  s
    ;此处输入数据段代码  " j' b/ X) ]& q, f2 l  @* o
DATAS ENDS; Z. o# s; T/ l9 Z- u4 i! v: \0 x: m
- u$ B: Q2 z3 m5 v
STACKS SEGMENT" G! P7 }% f( D9 G5 [" \
    ;此处输入堆栈段代码
' S2 v8 Q1 P  @STACKS ENDS
. p, r: ?' n. d5 M6 X: J
9 l5 g+ K5 \6 W$ g& W' @7 N; _. UCODES SEGMENT; h# }. t' K: ~, ^2 Q
    ASSUME CS:CODES,DSATAS,SS:STACKS% F6 y8 r' X# D7 k/ s: X
.486) X# ]* T8 i- D# y* H2 v7 L, b0 \
START:
& F8 I, ~+ a" p/ y( D3 y    MOV AX,0f000h9 W, ?- Y& C0 z( Q  a' k( g8 Y
    MOV DS,AX ...
7 {4 i. P  T; \
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。' q, X! n4 v* z8 a: u# q

0 Y  @$ `! L0 m' G8 R7 E还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 17:48 , Processed in 0.098960 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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