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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
# b. m. r* H$ T& g  i-s f000:0 ffff'SM': C  }5 e6 d6 ]# p- Z
F000:BFB1
' P( Q  n  h3 s) b-d f000:bfb0
# b. z5 M& H2 R' j# v9 [F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
$ [) W& ?* n' [F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...% F# _; {, I- C  @( @$ Q
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................% r8 v- h2 k  Y. u# q8 ]8 E6 ^
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P......./ Q# b4 B7 R& ]# p3 V
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
3 T, j6 j0 M1 \9 Q" P& u9 eF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.. q/ D0 V. W  t% t0 p5 O
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
. M. j. \: s0 ~- i( uF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
, F! l% I. M' R$ R; c9 A. E" U7 U-d f000:06f0+ x" l- a: B( e+ Y1 L, a
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................7 x. H- T; W$ T; _" t5 _
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American) H( G" t, O' {* A
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.& L* W) i9 u7 N) C
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
1 x7 O1 e/ l( |4 M8 o$ w4 r- iF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
7 a& l$ M* \% }$ [8 K& z4 GF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
) O2 w$ V! P1 ?9 [3 EF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu3 c2 P; q9 Q8 _8 q
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
3 H  ]- J3 S/ p3 ~
7 Y/ H6 C+ x( k* M( }) d
* Q- X6 h9 m, G/ [我要读出这里的06f9:07
* s4 y# e% a/ e/ `. o 然后得到一个(07+1)*64=512 这样来获取BIOS大小-# M/ X# s& f! r1 T% m( |) z

6 r1 {& L8 N, Y/ z用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
  P- H8 P" [. g% {3 f4 H5 I1 j谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
) ]2 d) {9 u3 c& V* v: m/ c正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。4 ^9 s5 x! ], L- o% E
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
! b/ A  H9 n) }. Z/ V4 @; @.model small- Z* }/ j6 v" c: V" ^$ n6 g
.386# R" q2 v2 @! D
.data
5 p+ X. l0 f% V) l- k# C" R4 d    SMBIOS_Sign db '_SM_'2 w/ S9 n) Q' j, q: p6 j9 E
.code1 I! K7 ]8 D5 B; ~# U5 \
start:4 v6 ]- l0 c7 q- e* w
    mov ax, seg SMBIOS_Sign
$ Y" b2 N5 a5 L) x    mov es, ax
4 c3 e+ h' q, F& r' {    mov ax, 0f000h
8 I' I$ \7 z2 M8 P2 ^! T4 K    mov ds, ax
, c" C* J2 s% i! H% c- ~  ]    mov si, 07 [3 z4 M0 `2 L2 }4 y6 W
    mov cx, 04000h
4 @, L% V0 V9 E  `; e3 p* o    cld, A" M% [% m3 ?: I4 z2 j, O9 v
@@:. f& p7 a5 i! ?- q1 }# ?' l
    lodsd. {0 ^0 E3 K! N# J. m' H3 N6 X
    dec cx: m& h3 I1 u# X% Y/ [- I" r
    jz  short @F5 `$ E- B0 S  i
    cmp eax,dword ptr es:[SMBIOS_Sign]
. K9 G- J# E) O( o    jnz short @B% O' [, ~* O9 c/ w( B1 s5 e. F
@@:7 X* [7 h1 p# K  g
    or  cx, cx5 q6 \3 S4 Z& E5 G! {
    jz  short @exit  I8 m2 ~% w% W  N/ c; c1 V
    add si, 14h
+ \( h0 n  }2 p; C! f1 S6 o& T9 y) X    mov ax, ds:[si]- k5 f( P. u& A. \7 V* C+ W: ^& T1 d; j# k
    add ax, 09h: T& O* L) W4 {: A; J7 t
    mov di, ax
" ~9 a2 {! Q9 \( E6 k, g: [  d' A# m1 ?    xor bx, bx0 X: k0 F; w, v. G0 ~/ s' @
    mov bl, ds:[di]( l' o1 l. c* d5 E7 Y$ e! G) p( F
    inc bl
: k1 U, J  h* g5 e# S% B8 b    shl bx,6
4 u+ m8 ~# B0 x3 l! ^; F@exit:
$ _* q! g2 N* E    mov ah,4ch- G3 s" u. X( s5 X
    int 21h
4 k( }( p$ q. e- d0 Y% send start; ^. _+ C' l! o( M. d* v
cseg ends
' e7 L% w; a; {; X推测你的算法是:
9 F# j! }1 }1 X+ D1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
) ]- ~; g8 \. @2.找到这个offset2+9的地方的值
6 U5 n. h; s* J, R( H3.此值加一,乘以64为BIOS Size,在bx中.
% f0 {: i/ }+ Y0 W不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
; M5 B6 y$ ^8 g% X& D( Q    ;此处输入数据段代码  
& t  g) b! z3 @/ s6 wDATAS ENDS5 }$ Q# a' i, g* w0 A& T

0 G. t: W7 I8 u' \/ u$ ASTACKS SEGMENT
2 x$ C+ _! J6 U& E8 P( c- ]    ;此处输入堆栈段代码/ d' P7 S; u4 G
STACKS ENDS8 ~: C0 ~" h, @9 w' @' {

" T- W9 n& Y1 p! ]8 yCODES SEGMENT
/ d+ p% y) ~; j9 U    ASSUME CS:CODES,DSATAS,SS:STACKS6 g+ `& n- V4 G2 Z
.486
3 T) s/ v, ?) a" KSTART:
! h9 M) l9 X2 L+ |" U    MOV AX,0f000h
! J6 ^3 ]  W* y; e2 ]4 R# A    MOV DS,AX
9 }* w0 ]- W; B    ;此处输入代码段代码6 Z: w1 a; @5 F8 y+ Q* ?
    mov si,0
+ f7 I9 F! L6 J. G$ e   last:
8 p2 u3 X4 E$ p" r$ \    mov eax,[si]  @1 s* ~5 q! {# ?3 q
    cmp eax,5f4d535fh
* D& i( Q- A, Y0 a    je over/ A8 H7 c; a. H! U% F
    add si,10h
+ s- M! f2 G$ v# {    jmp last
$ {% _/ w3 g; T$ s8 S3 b    $ T+ x& }* X3 D
    over:
: W; z( {. V. a3 E* \$ ~    add si,18h
) c5 b8 n9 I$ |    mov eax,[si]
0 @3 Y& Y9 ^* C9 Z3 ~2 _* ^9 J- Y    mov si,ax/ u( e3 \5 t& E2 n1 x7 M5 q
    add si,9
" u0 d2 @$ F7 `9 x    mov ax,[si]* H3 u- W" J2 m! w9 E$ T! y9 G
    add al,1
2 R9 A% Q$ N, ~* w" [! h    mov bl,64
, U. @* m# S0 T$ |    mul bl
6 |% u1 t1 I1 s) O& {$ @+ G, N    mov bx,ax2 X7 C# C: h0 J/ u6 A' `
   
. J2 N4 L+ U  M$ R- R    call display( E6 `3 |6 [0 m- O! d
    MOV AH,4CH
9 k. J3 L- v5 q! _0 y    INT 21H  * ^7 o6 y- f: I4 R* l* W5 b0 i) Z
    9 u) ]! f# X! K5 F) q/ t( j
    display proc near
, \) a; Z: K# h8 j- x   push ax6 x8 S' v* w( Z9 M! R
   push bx
/ v' b; c/ R5 Z( _* C! L3 r0 f. ?6 a   push cx7 b  M4 ^* }8 Q1 Q$ c! x' S/ O
   mov ch,4
. }# f1 M9 s& i9 m" [  rotate:mov cl,44 R9 ?0 L5 M1 U+ m
   rol bx,cl; V* b( n) s+ E5 a$ Y: f4 v
   mov al,bl
: r+ j- Q$ b6 |: O% r7 L   and al,0fh
5 M) O' S# M! v9 g5 g* Y* K6 r   add al,30h
1 L+ q" x" n5 t   cmp al,3ah
, |- {2 M4 G/ {8 U% }   jl printit# i, y4 n! S9 v1 J; [
   add al,7h. ~: j4 U# d3 h$ C
  printit:
  {( u$ h* K9 c, v  mov dl,al
$ b4 J3 B3 @# N/ [% r* @  mov ah,2
* D5 @0 `& B) N3 g# b; Y; k4 a  int 21h
8 e+ O# x* g" b  Y" |) @2 }. y  dec ch
8 h& f+ L/ J' x6 d% `, I  jnz rotate
6 T: J! ]& J5 H  mov dl,20h
/ j$ k  `4 c) B  mov ah,2h: g$ ^( N4 S! a
  int 21h) C. D* U7 G* z* \2 Q2 @% ^* N
  pop cx
/ f  B7 u' |) a/ }* Y( F  pop bx
+ o. B9 Z- O$ m1 ^# c& j0 [1 s- e  pop ax  C. l9 d! M' C8 W4 ]& u- p
  ret) H5 K+ t( A3 p" I! ~2 K
  display endp, B& p% Z! y. {  o' ?& k! H+ L
# V# l6 j  }+ N) E
CODES ENDS# y) v1 ]6 m  A% I2 V; [
    END START
: n& V9 A$ k8 J. Q4 k0 o2 J' E
, g4 u+ M- ?" u: k* ]7 j运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
( g/ Q, j3 ?9 L/ J  p( qDATAS SEGMENT
, X3 d! Z( j: Q( }; p9 g    ;此处输入数据段代码  0 r% S4 I7 k! q6 [. p
DATAS ENDS
, M4 I+ b; P7 ~! X8 Z# @
/ K, D2 A. _/ a/ e) f9 iSTACKS SEGMENT
; {0 Q0 y1 q4 Q/ H5 p3 P    ;此处输入堆栈段代码
  t0 l) e9 _! j+ [- B) k& XSTACKS ENDS8 }$ i6 a1 g1 k" t# \
6 _+ p- G' d& k" [5 a5 F
CODES SEGMENT# ?$ x& j6 J1 v6 J1 d* X  i0 o
    ASSUME CS:CODES,DSATAS,SS:STACKS
; Y- `1 @1 g$ G; D7 J" T' G.486
, L, k/ Q- A4 Y. ESTART:
9 T9 K0 _1 {# Q' l# h0 X    MOV AX,0f000h
0 O0 s% k. Z' b' w" X, d2 R    MOV DS,AX ...
! e: b9 W' @1 a. g4 i2 l
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。; M) o: b) Z1 _3 Q( ?: G" N3 q

4 s# g$ c  q2 L9 t! Y% m+ L" {5 J! m还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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