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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
+ z5 B2 b8 {6 E4 E9 K% m/ W  Z-s f000:0 ffff'SM'
- y3 o5 P( a0 F* ?# q1 m; w$ GF000:BFB1, X# r; E2 s; f3 I, ^% h/ U; l
-d f000:bfb0
; D3 v, H# X+ t9 K5 a- iF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
5 x/ I6 r3 j' T* B' W) L# @F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...# h" ]# J: b' f0 @3 b8 n
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
& n: `! s# Q: BF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
$ q8 ?0 E" ]) Y8 sF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
9 x0 @  |. G% ZF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.# \; \2 R% v, t8 C4 [; [
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V* y9 S3 k, H+ u3 C" w
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..1 n0 z/ b) ~# m/ W( {' l
-d f000:06f0/ R& K. T/ P6 t2 g
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
5 U; p! K% b# |+ `5 G0 yF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
3 C+ b( o* ~- d  c! YF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.- J/ H2 C, |' P6 B/ t
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2  O, c- Z# M+ y( d8 Q
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
& G+ a4 T& K" T1 Y, T$ ]' XF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
  r+ p' a/ U% ^/ o6 E' L; mF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu$ s, A$ Z* _* K$ z  A
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ% d1 v( B+ W6 N! w, D

( P$ M$ S5 R2 B# A1 j; t5 \/ h8 ~4 _
我要读出这里的06f9:075 U$ }2 C# i" Y, q5 P* M% b
然后得到一个(07+1)*64=512 这样来获取BIOS大小-# e. z# ?7 F9 h. k1 i; }; R1 ~
6 m. e# c. `; D8 u9 c1 L
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码% E4 a$ [$ z1 J
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。: ^, R3 V, {4 i8 x# o- R' E
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。' w" x5 H4 Q# p  a) X5 K' _. j
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
% j9 |3 G( ~3 W6 g.model small
, P8 u7 l+ r$ x) t$ s6 |.386
0 [/ ]6 ]2 D; ]/ C/ O4 z' K0 n" v  j.data8 N! ]+ c. `) t
    SMBIOS_Sign db '_SM_'
+ |& ]2 l6 u7 C  S; o' S8 k0 u.code
& \* S$ i0 v; S- u3 N; astart:
2 x+ ^, P! H( @( b    mov ax, seg SMBIOS_Sign; r- U2 h0 R9 |2 q+ b
    mov es, ax/ R% `" k6 Y6 ^; H2 Y+ T
    mov ax, 0f000h( W' ~5 t8 j0 ^5 ?) k3 A+ h1 G
    mov ds, ax& H8 a# x' `0 W6 `, G7 d
    mov si, 02 s+ F& H! h) f' }" T' s
    mov cx, 04000h2 A- T: |+ H& l
    cld, O( P! E- U2 v7 A7 H" T
@@:% Z3 E7 G( ?9 g- O' s) u
    lodsd
  d2 ~, |3 g% ^: f. E    dec cx5 r1 W8 v4 G6 x: B7 S5 V7 Z* ?6 L' z# M
    jz  short @F% T# [: D+ P( d' R2 o# F& E
    cmp eax,dword ptr es:[SMBIOS_Sign]
8 r% q- ]1 I! ~7 \& W    jnz short @B& M5 y# t  o9 y- x' w6 r
@@:3 p  n+ l6 n; b! r( K& E: P9 }; {
    or  cx, cx
# }! f8 P. Y+ Z% J; Y    jz  short @exit$ g/ M; U" `& a# ?' E/ S. f3 ^$ k9 [
    add si, 14h9 n3 S0 \( {& v! A! P8 n9 i
    mov ax, ds:[si]
' `  _0 a% d4 u! w8 s: {9 a    add ax, 09h
, `4 v+ W  C" B( J3 z    mov di, ax
" }& C# S- M3 L; i6 Q; {: P    xor bx, bx
/ {3 N7 B- N5 `! Y( R    mov bl, ds:[di]
; \) i; O$ i2 ]& y. M    inc bl5 t  z- w% Q. A+ Q, N# B
    shl bx,6! {* w5 p# i3 H0 R2 X
@exit:2 A+ J" E4 h# _
    mov ah,4ch
4 I, X; r; @" d( D+ x* a/ V    int 21h9 @- v) [' D0 k
end start2 Y( B7 M; `, d( N
cseg ends2 b+ R5 }6 r% k6 s0 P% [% D
推测你的算法是:  j0 z+ U  A. O0 y+ y2 K8 l
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2, w$ C6 A4 X" O3 F9 F
2.找到这个offset2+9的地方的值
0 X8 m( Z- W5 m, [9 l) L: d; U" T3.此值加一,乘以64为BIOS Size,在bx中.
1 ^2 m3 y8 m' C/ B, J2 K不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT3 n$ c7 M+ u  {. o% A. ?
    ;此处输入数据段代码  ' H. x* A7 P: i! j3 {6 n1 a
DATAS ENDS
& ^  B! k. l; M: ~' \1 v# j/ K9 t5 E( J1 x- j
STACKS SEGMENT1 E! N! I% T' y+ N+ A' M0 |: f( H
    ;此处输入堆栈段代码
4 j9 @- o, p* f* b/ _7 TSTACKS ENDS: a. ?: U5 b# W1 h2 B4 R6 {

% r! ^( W, ^3 yCODES SEGMENT+ I% l, E* b( g- z$ @* f7 d* v
    ASSUME CS:CODES,DSATAS,SS:STACKS7 ?  f  W; h/ M, Z1 c! f8 k
.486$ X2 W; O9 t* z% w4 Y7 J4 Y) {
START:" s7 |# [* H" u9 s
    MOV AX,0f000h1 M! S2 _# H) ~9 T3 v5 z5 M
    MOV DS,AX
: g/ {$ u+ b' y3 C' w" a    ;此处输入代码段代码
6 Y% @& ~' e+ ^1 |! G; ~    mov si,03 K; W8 G9 V$ [* d$ X
   last:
+ X: o0 Q5 `4 C. n' Z& m, a6 u    mov eax,[si]' |1 [3 P- f1 p* U- A+ C- Z
    cmp eax,5f4d535fh3 H( G) P: s: @% U& p. W4 B
    je over
1 R$ I. ]$ a9 t2 y) R5 f    add si,10h2 z0 s' }* \/ `, ~
    jmp last+ D' `; ]/ R* E& g/ m& Q% w" Y1 K) M: l
   
! B3 x; R2 _" l' S9 B' m8 n( `6 @    over:
+ s) x- w( U. S) \* p% l    add si,18h
; J+ l" ~8 o" N# G    mov eax,[si]
+ T+ o0 b9 W; b( J6 }    mov si,ax
) y) X: w# M" I8 H# h! T; N! w    add si,9
; {3 A5 e5 u. n+ U. l; ^    mov ax,[si]
! W2 v* x6 _: i& x    add al,1. C3 N% ~, t( _3 {9 [9 @' Q
    mov bl,64' C5 r: w6 `- M: F7 |( D
    mul bl9 {+ q& X0 s' D2 W
    mov bx,ax
1 a* O" C# ^7 l  T3 M" X6 L$ S, u   
6 b; U; y* n  l% i    call display: }; m( T2 V' y/ Q! k* P
    MOV AH,4CH
7 h! f; u( C9 b; [% z    INT 21H  # g) `3 H/ c  P; R
    8 l& \) G' z% n  t, @, i
    display proc near" N$ ]0 M- u( j% M3 n* u
   push ax
% P- k5 ?- @* V% P$ g& s  P   push bx
- t4 \( P* @1 Q6 f( K% P% m% _+ ?   push cx
  [; F4 ?% d6 x$ u+ P( ~1 ~   mov ch,4# [2 o1 e2 |& ]) f
  rotate:mov cl,4  S0 Z- K6 i/ y6 G% m7 ~
   rol bx,cl
' s9 L8 M+ \" T, ^6 m# l   mov al,bl
3 Y  {5 t4 b9 u   and al,0fh% S+ q2 ^$ @8 b2 ^% Y* r6 |. v
   add al,30h# j0 w* W' ^/ N: k& k) w, N: ^
   cmp al,3ah
1 w. z/ H- A4 f5 ?' w3 H   jl printit% N% y0 a6 r6 ^7 R4 N
   add al,7h- l  d0 [# P4 Q5 T, l; j% d
  printit:0 U, [) ~2 o% d
  mov dl,al+ P5 \/ C* n3 o% m. `( L
  mov ah,2
' Q# \1 B4 v2 E( N5 `6 t' T  int 21h
% S( V0 d, q2 I% n' u7 U6 M& L/ c  dec ch
. K0 V- a4 l. a$ e  jnz rotate
7 _( e+ S- y. y' x8 R  mov dl,20h
6 w0 o* P  {' W/ z, \  mov ah,2h
  V6 r2 ]. n( d  int 21h( O+ P$ U- V+ s' }
  pop cx9 U" {& m* @& n7 z: \0 J
  pop bx  X( w% V8 f: l: G) r$ i5 M7 g8 e  Q
  pop ax4 O6 ^5 t' v9 C6 w( s2 ~) q2 O
  ret
3 M# O' ^3 s+ {" A  display endp
1 t+ T  G5 C3 J2 x( e
5 D) }  m8 m% b  uCODES ENDS
, P& x. t, f3 P$ G" j    END START) L/ ?( g5 E) k+ s) V# k1 m: {; R3 A
2 {1 A" @6 L% V) E
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
5 Y& \& A0 v9 o2 _/ S9 ?$ \  ]DATAS SEGMENT
. N. ^9 U5 u# I6 O    ;此处输入数据段代码  
! A! }- x/ O% X( Z0 f: [6 P& ^1 ~DATAS ENDS) ^# U+ G  k" b6 G& k* t; t3 q

" H1 x8 N8 Y1 c6 b/ u" @. P! G5 ASTACKS SEGMENT: V6 d! j% l( ]- F, K' S- K' A
    ;此处输入堆栈段代码
7 {& `. K  Z. G5 e+ o* Z  z3 lSTACKS ENDS
7 W6 f' l4 B( c$ A( ]4 M
- l6 i- H$ a4 f5 SCODES SEGMENT
% P1 h; G: A8 A, q% C% r1 j+ I    ASSUME CS:CODES,DSATAS,SS:STACKS
1 i2 O# V" y, |) g" V" L# N; n.486+ b0 L% i5 K; @6 s' O, I3 s
START:* b4 ~- v! B5 o$ k6 W- A2 T$ ?& l
    MOV AX,0f000h( x, G8 p% X* i4 |" I; c
    MOV DS,AX ...

. u! i3 b0 F) `二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
- M0 \& |; _8 m1 S% n- k
2 E( ]0 i, M+ l- n$ J2 a5 T; b还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 08:37 , Processed in 0.873851 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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