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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
3 S# R, D( G1 q+ z3 @9 [-s f000:0 ffff'SM'
) [# l/ F' E) b/ nF000:BFB1; w) ?+ j% F' q* n+ N
-d f000:bfb0
8 W" C7 u: t! d, AF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
  V2 A/ B: y( T/ Z5 nF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...( l/ J! v# j5 K6 m5 O$ Z( o+ o
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................2 I) M0 W' F) y. }
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
, L; `* |- b# O0 p1 hF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......! t- V0 L) a! v2 Z# L
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
: F" V6 v1 n4 ^! B3 J6 Z0 l9 fF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V5 J' E5 ~! M% {8 v
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..5 ]0 R# x: v' C: i  M: S+ L; B' d
-d f000:06f0
/ b( b/ N6 `: y! c$ h6 ^( IF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
3 f' L$ h3 b' a& bF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
. k1 @& n1 }8 w4 IF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.- L/ I3 n$ }0 j
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
' v' e* r5 m) s8 \1 f1 cF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
- i+ r" c+ O# v, b+ D! R, jF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
( [$ M" [1 t+ {# ?6 xF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu6 Q+ V  W1 A0 y) H5 l+ v+ Y5 L  B
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
) m8 u/ {( ^9 i$ g; j+ m( [+ n9 S6 Y  j8 U8 Y

. ?7 d, B( A1 O6 ^0 I3 ^我要读出这里的06f9:07
1 {/ ^2 \4 g4 C8 N8 F; D 然后得到一个(07+1)*64=512 这样来获取BIOS大小-/ `3 `/ p$ a/ g) n/ \
; D* h: H8 D. k: }
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码/ Z" n9 l; o0 Z1 B
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
& x( A$ c- Q6 u" r$ [+ u- j正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。7 l$ f/ i+ g. b% ~9 \3 M
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:5 _. |* X% p) l# z, b0 [# M
.model small
! n1 V; {. c8 ~1 b5 U+ U.386
" {$ Q0 w5 i: J; m- O.data5 C) s! D2 _" w( j* A( a% B
    SMBIOS_Sign db '_SM_'. A. J8 Q9 {0 v8 P  J
.code
% y, X! p( O7 E! Hstart:
8 V( X, b% T+ i7 V/ T    mov ax, seg SMBIOS_Sign
- h4 ]8 L; Q6 [! t    mov es, ax, |- u. T" k1 R7 d0 W* A
    mov ax, 0f000h
7 k. @$ ]* I5 @) _0 x    mov ds, ax: s4 u( Z/ c) L6 Y) ~
    mov si, 0
4 _% Y8 ^4 Q8 `# N# P    mov cx, 04000h! G! k$ a$ t9 V9 A  O. B6 |
    cld
7 {1 H! V5 P9 V% P@@:
6 e/ @- X7 \7 K1 W! k, z    lodsd
5 J# X+ X2 o$ l: D) G    dec cx4 L# _9 F) a' m2 q- c
    jz  short @F0 S0 Q5 l3 [  N* i2 n8 x2 H* w$ Y# G
    cmp eax,dword ptr es:[SMBIOS_Sign]
( M3 l* V  Q! r* g% r* m' g/ N! s2 B    jnz short @B+ J% ?. b( d. ^/ U/ S# U: L! B! u
@@:( F1 Z0 \$ Q4 h
    or  cx, cx. J, q% y! K: y4 Y2 {
    jz  short @exit
- P/ X' N* h* W' v" K4 W" Y    add si, 14h
; m6 I  R4 M/ e3 ?4 ]    mov ax, ds:[si]
1 r# v4 q; f6 S- w, W: Z, `    add ax, 09h
9 K9 w3 Y' E4 P! _" D7 \% y% B3 [    mov di, ax
. I: W5 H" A* a* ]2 x    xor bx, bx
; k( G* v! A/ R! r    mov bl, ds:[di]% ?8 R; \* N3 \0 A: G1 [# J
    inc bl5 ?% |$ N9 G/ O  E
    shl bx,6
1 ?# Y' M, O3 W% C$ S4 T0 a@exit:4 q# ^4 \4 }8 F5 G# [
    mov ah,4ch- j! a/ x1 R# F$ F# @* K3 G0 p4 i
    int 21h/ V  l+ t+ h, Q' t  Z
end start
3 `+ s* [# C& V$ y* T$ Lcseg ends& }( k, P  t% |5 b2 S, {5 E
推测你的算法是:
7 v8 K9 I; F, H" d  A- G1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
: Y" Z4 N6 ?* p& l$ Y( u4 f2.找到这个offset2+9的地方的值
  A. _- M8 [. h4 o6 v3.此值加一,乘以64为BIOS Size,在bx中.
+ j& [+ `% x4 {不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT; _9 R0 {9 M+ X" t! E1 Y) M/ A# w
    ;此处输入数据段代码  6 X& ~* c5 v. ?6 ~7 n- s
DATAS ENDS0 z, r. y  [' O; L+ @# |
. Z- F3 V; q0 v; }# T
STACKS SEGMENT
9 Z1 E# ~, Y; o3 z/ J2 {! I    ;此处输入堆栈段代码
" ?' w% `  E; [! K( HSTACKS ENDS
: v$ o3 }3 n' @) O( N: A
% P/ T; R9 C( ~CODES SEGMENT' m/ |3 p- U* H
    ASSUME CS:CODES,DSATAS,SS:STACKS$ r1 I: `7 ^$ N' f1 S1 I& ?- ]0 V
.486
8 p  b% t* W+ f7 J% c6 u0 I7 ~START:
1 j+ _- a1 Y! P    MOV AX,0f000h
( y, H0 E4 Y6 g( c7 \    MOV DS,AX3 S0 w, G1 c( H! s' o' B! H
    ;此处输入代码段代码
; {5 ]; X+ U6 P5 T    mov si,08 H+ @5 J  I1 |+ Z
   last:
5 Q, c* ~8 K* g) Y    mov eax,[si]( i( S; _9 z4 Q' l; K
    cmp eax,5f4d535fh8 M( ~9 i5 R2 r9 v# z8 L' f
    je over5 C; `1 A% Y0 B' D
    add si,10h
: E3 h# v9 L( M4 s- |) }0 n- S0 k" ~    jmp last
, j$ f/ _$ `  z" A7 V' J2 z8 t1 B* h    ) j* b1 ?) T' u' t& N
    over:2 d, t6 z2 r  R+ x4 f
    add si,18h6 r' F4 y; R$ i$ M* l" }1 n: n3 R
    mov eax,[si]
* q$ z( Y% Q4 L    mov si,ax, w0 E' T& X7 K% x
    add si,90 r" X  E3 [- j/ o" ]  H! m4 _
    mov ax,[si]
( ^1 q. L' q( @' `    add al,1
, w# H2 }/ F  _    mov bl,64
( k, R9 G% L+ c! E3 o: ?& t    mul bl
( J# m; e4 Q1 G; M    mov bx,ax6 T1 W! j3 d8 _  z+ p- m
   
. [- y2 P; s& x  a/ @5 H# P! g# J" c$ R    call display8 p+ M  _( k9 r; j3 w. ]1 ]8 T  J
    MOV AH,4CH+ @* n4 E& {' g" `* P8 |
    INT 21H  . `* s6 P7 ~4 y& j7 w0 v* h, i
    0 I4 o1 e% e/ w& a& Q- D1 L. J
    display proc near9 ^: |7 {2 M% w
   push ax5 q) \) _! q2 K3 o
   push bx1 F, t0 a* V9 ~- J- b% I
   push cx
, N* G* o  X& q/ @   mov ch,4
* u( H4 Y5 w4 p) J# u3 s9 a+ X  rotate:mov cl,4# o% B5 w/ p8 A' A4 J- {2 C
   rol bx,cl, m, e  }) ]- w
   mov al,bl
3 }$ e2 ~% m5 C$ H0 v* U0 X. {   and al,0fh
: F. C, k& N3 m7 A, [7 T2 Q  K   add al,30h3 k: R/ p  n$ n( C; b
   cmp al,3ah" ]; ~8 D; D/ c- K
   jl printit: i! U- R& B* B* H$ V3 Y! u5 e
   add al,7h9 _1 L/ |7 u8 K# s! u, E  C
  printit:
6 v# c+ Y5 O$ Q' @. A$ z  mov dl,al7 O( N; }. n/ p' q
  mov ah,2
/ ]& k0 b) D( o& i: w& L1 L- E7 }  int 21h
" B$ X" E8 A. t# a  o* T  dec ch
- h, g3 v* a# D, n6 O  jnz rotate  m% H; Y* V' r* J# A5 A: r
  mov dl,20h9 r" r% |& q* r- d1 M; |' k
  mov ah,2h
0 T0 `3 ^  ^  z  int 21h% _. O: h, P+ s7 Q( M+ R+ I0 t' @
  pop cx" }, d! a! O( n, n1 R! o3 w, A
  pop bx. n8 b* X. H$ m( m# M
  pop ax
4 y7 o' y: R' O, D( w  ret( V% E1 V0 o9 r6 `4 v# d
  display endp' A/ G9 J+ Y, d
1 \$ S5 W5 }- ?
CODES ENDS" d) @2 \5 Y  W/ }. i" ~$ \
    END START0 W" ?$ O6 y) c6 I) M
6 }! _3 `" H2 p# D$ J
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
. a3 H# a# ~9 n: b# aDATAS SEGMENT
2 ?; l- B2 R9 [: w" Q3 y: V    ;此处输入数据段代码  . c$ |6 W5 z2 D3 w
DATAS ENDS2 f5 @+ ]( }" F) `3 k4 P9 s! W
" i$ l, t, x. B0 N5 i& _! s& u
STACKS SEGMENT
5 i$ M3 n, g  c7 `% X. `    ;此处输入堆栈段代码
4 A# f4 ?2 Y) d" A. {STACKS ENDS
% |5 B6 x: Q/ V( V! U" ^3 B; F9 G2 v% C% |. j0 w8 f8 y) Q/ o
CODES SEGMENT. z8 b2 J; K! \" r( R, z8 L
    ASSUME CS:CODES,DSATAS,SS:STACKS
' Z+ a' F% G1 a2 ~.486
' F+ Z& D1 w4 Q, `$ XSTART:# ~8 [2 m* ?2 s. x9 n5 Q# N
    MOV AX,0f000h5 |( B9 z+ l  Q
    MOV DS,AX ...
7 t- n8 X8 ]1 a8 [* s% G
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。# x! B( r; r; O- M, ]: `, o8 R2 Q# P

7 ~" I+ N& g: M还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-4 00:24 , Processed in 0.134676 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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