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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
' @' H: e1 A' K6 W7 N. j-s f000:0 ffff'SM'
3 ?$ g' A: R7 g) w# ^( S2 J) ]F000:BFB1' p1 c6 M7 ?1 s; i
-d f000:bfb02 {5 c6 B+ C, i) y. J
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............$ x6 C5 t- X( M+ M) O
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...2 |* x/ y, z% l7 }3 I
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................% B5 R# b9 s( s+ x) X& k6 w# P
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......1 W! x+ p: q3 p
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
7 i8 p; R, k" C$ I3 w4 F2 b; DF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-., |& f- P7 W" k0 q$ r( ]' [
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V7 o# z% W4 `: G+ k
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..# h& U# Y5 U( t  }  v
-d f000:06f0
% n- X7 u& i2 r8 l5 {F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
2 r( `/ M1 F5 [: UF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American3 d0 @6 S3 f. {4 J
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.2 |% ]6 H6 i+ ^" I
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
2 p3 ^. L7 |, x* W' l2 v* h5 h+ A, V- MF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u: M9 F) i  ?1 B1 G: u- ^& ]
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...0 J( o% @) R/ a. ?+ v- ^
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu: G7 S1 X, p( j
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
6 b' F- k- n% }6 Q' Z/ s7 ^/ s$ e! w$ x1 ^

+ N0 T9 f" o$ v1 I  V7 f* P我要读出这里的06f9:07; d$ ?; ~- z. I/ Z2 |
然后得到一个(07+1)*64=512 这样来获取BIOS大小-6 ]& q% s# ^! M" f' h4 Z2 \

& a( b6 V" m9 r) C0 |用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
% h& S; R) S& P+ z' {, Z谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。2 m" ?# r/ s! V; w4 p
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。  t; M/ g, P) b
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
$ ^$ g; @7 p3 @; ~1 Z, Q.model small7 P% }" n5 ~7 [4 t. ^
.386
1 \) v4 g  B7 B. d: ]# d: i% N.data0 y8 o, }2 b! t9 h! d0 N% B
    SMBIOS_Sign db '_SM_'  T& i, X, K; Y0 Z% F
.code0 ^+ o- T9 M9 u& |- H/ C
start:5 [# G) ]. `+ X$ k" B/ S
    mov ax, seg SMBIOS_Sign
4 E& g+ ^: E6 C8 `' K" N& d/ ]4 [    mov es, ax; T( t3 n+ e/ ^' i& W$ \5 X
    mov ax, 0f000h( R. R* r  u" L
    mov ds, ax
5 k4 ~9 B( H) n1 H9 f' @4 q2 ~# Q) `    mov si, 06 d$ o3 F4 }( F$ a
    mov cx, 04000h
! b1 i  J* U  s" t, `    cld  \( o8 H! @4 {/ J
@@:; F# D1 h4 O1 C3 j
    lodsd% y, a$ E  D0 l" w* j
    dec cx/ \; ^+ P- L' e8 G4 p$ p
    jz  short @F2 `* ?: d: |, E" g# D% D
    cmp eax,dword ptr es:[SMBIOS_Sign]1 S0 A3 C* Y' p$ n' m! e
    jnz short @B( E) w( V2 _, K# v/ T! r
@@:
# T. G6 M1 D2 F7 o7 {    or  cx, cx
9 G! {0 p. q( m    jz  short @exit" B. O6 q0 R# ^# q( n8 H
    add si, 14h5 [5 a9 }2 X7 ^5 F
    mov ax, ds:[si]& L5 O( r+ I' `6 z! W7 C" `* C( ?2 v4 Y
    add ax, 09h
# A. i( ^6 I- i: M4 f  g- ~    mov di, ax
  \/ ]6 m  b" B    xor bx, bx+ t& v3 g: R5 A7 M$ Z2 t- F" Q
    mov bl, ds:[di]
/ n8 G5 i4 b( U; ^; p( ]* D    inc bl
% U7 B) J1 y" |7 S+ M2 S    shl bx,6; w1 ~; M8 z- |' ^; g
@exit:
  }; @- t; W. g, u6 z, b0 a    mov ah,4ch' r0 G% D- {, u8 e& D- @2 x
    int 21h% k3 H7 I3 M( b$ q
end start, [  R2 `! f* r
cseg ends
4 G2 v- _' |6 B- o( j% P7 L# x推测你的算法是:
; a# c1 o! A1 d+ r6 y1.找'_SM_',然后在其后offset 18h的地方为下一个offset2! \; U/ c; I, X6 K2 B5 U
2.找到这个offset2+9的地方的值
' ~7 d  y, I" d1 }5 V! a; I3.此值加一,乘以64为BIOS Size,在bx中.
  e& c  N& D+ ?, N3 G不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
" W- \. y2 E# J) C3 U$ n    ;此处输入数据段代码  
. M$ N* p: J# q0 mDATAS ENDS1 P4 g8 R# |1 ^( l2 Y/ v
6 u# Z6 o/ q; r' e7 p: d1 J
STACKS SEGMENT
* M; E" o& N) J$ Q  [3 O    ;此处输入堆栈段代码6 C/ }; Y; |% E. `/ @; u. T$ M
STACKS ENDS
" ~: z5 A5 y4 G9 n: n0 a  z* s) Q# G1 l) m/ _2 r
CODES SEGMENT
& R( z3 D1 @7 ^+ U    ASSUME CS:CODES,DSATAS,SS:STACKS
0 e6 m1 p+ A8 R6 o' l2 V. S- b) `.486
- L) G! v8 F+ n3 U. J) R2 v: I6 d" SSTART:
# x- y' r2 A, Q0 J    MOV AX,0f000h
5 I3 f! E  {, _1 d+ m    MOV DS,AX0 g6 [9 s1 P$ u+ u
    ;此处输入代码段代码
- I/ H/ T; E2 N  D5 y6 U+ D1 k0 t$ z) g    mov si,0
& j: [8 S1 Y9 G( {   last:
4 b! ~& z# M1 m# n+ E    mov eax,[si], \4 L% E9 L. l+ c0 @
    cmp eax,5f4d535fh# X3 ^; V, m$ N+ m# Y
    je over
4 r: X  a2 b: L% T) {* N    add si,10h" i% M6 _- N$ L8 B3 I! r0 [
    jmp last4 F! J+ b2 t2 y$ Z" m% B1 H% J8 |' R( f
   
) s. B# [% `' R' ]    over:0 B4 m7 |" M- a% Z& [$ a7 N% d- T4 ~8 E
    add si,18h
, }. E2 x; l; t$ A/ T- O1 ^* h$ m    mov eax,[si]& @8 m' B$ p1 Q9 a4 k. _" ^
    mov si,ax. h, }2 C  w) G; F8 Y' r
    add si,93 d5 j8 A# d1 @; Z/ k' a+ \8 R; L6 o
    mov ax,[si]
# Z* ?( g: ^3 L& `* u# V" J    add al,14 T" K. R6 Z) y2 ~
    mov bl,64# g) R% ^9 P- s
    mul bl
/ e& e/ g& q$ s- Y% j& ^    mov bx,ax
( ?. n0 G8 Z- f, b+ H   
* r9 P: h  e; z4 t. G( W: T    call display
; t, a2 G6 g! y    MOV AH,4CH
+ v9 G- [4 O: [7 B    INT 21H  * G$ q  z+ d) R9 D2 c- c2 W5 K# M
    6 z9 c& G3 ?  O% Q1 |# I- @
    display proc near9 U0 Y! s' ^* c, k" h1 n0 z, ]
   push ax# i# Y9 H2 r# x' \7 ?0 I
   push bx# t  v0 W: A; A* r
   push cx
/ w/ Y. W  H9 Z* T: t0 V   mov ch,4
4 M, _# R8 C( Z! y  r# L8 t5 a  rotate:mov cl,44 ]1 J, ]8 @- B* A& v8 \
   rol bx,cl
# \0 o. Y1 N, j! g+ V1 o   mov al,bl
9 F3 }8 u" ^9 f6 [6 a2 A/ @7 C   and al,0fh
. `. d8 u) }1 u' ]# m   add al,30h+ x  {9 ~! z/ ^) g3 f0 m, q* ^
   cmp al,3ah
, L6 \  ]; Z/ z$ ^   jl printit* ^) }4 e4 U+ u) O
   add al,7h
2 B' v# I) F+ o* U1 n  printit:3 t( V3 \$ d0 ^" k/ t8 }& w
  mov dl,al! D' ]: E1 p$ v& @& K
  mov ah,2
+ P+ U% b$ Z& d# f9 L5 C  int 21h
7 g) q2 ~1 S9 }  dec ch( F+ Y. E1 A  N  [
  jnz rotate& ^8 ?. w0 P2 ?# [8 }. h
  mov dl,20h9 ~5 M3 P' f, r
  mov ah,2h
& t( Y3 h1 t& v  int 21h
; f4 d/ \4 ~0 t1 U  pop cx
* \; ]- E$ ^' |3 g: t9 w. `9 z  pop bx
3 r" _9 W; P- G  ?0 }# H  pop ax  x- L4 f+ Z+ u1 q+ s0 M4 m
  ret
0 d' A2 L3 @3 w" t4 [  display endp
4 Z( Z1 h9 S' F: r0 G9 v& y# ]. {/ H. x  W: Q: t% c5 I
CODES ENDS
+ }) w: t2 H! K    END START$ Y2 E" }: K0 G7 c9 R8 }! \! [
$ k7 x* E* _' z. k, C: T9 u
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
0 j* U$ z. R- z0 t+ iDATAS SEGMENT1 J' M9 m& v8 v; W3 ]5 [" T
    ;此处输入数据段代码  # r7 U; }1 `/ e* G
DATAS ENDS* c0 J+ H$ i7 d8 Y: G
5 K7 C, ?# X: L# g# A6 a: m/ x
STACKS SEGMENT# B) m9 C( d, A" j
    ;此处输入堆栈段代码
* o- z7 t/ Q3 w$ Q4 PSTACKS ENDS' r: z7 F$ T" ^. f7 C

* x% n8 I4 H# F/ _CODES SEGMENT# Z2 |% r% J' Z+ ^+ |
    ASSUME CS:CODES,DSATAS,SS:STACKS: v- }( s4 H# g" u' Z
.486
2 j) b8 n# k" R( pSTART:
1 S1 A, g- ?2 E    MOV AX,0f000h9 j7 x  @$ w9 u& O& c2 N
    MOV DS,AX ...

& D) W* ~+ h1 d1 [* |- |) @3 y, W二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
7 y  l2 ^& _! h: w
! x# `" D4 v( i6 r还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 05:36 , Processed in 0.074263 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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