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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
: q" E% {. R( G3 z8 }# Z-s f000:0 ffff'SM'
4 V: [  |9 l8 O6 d, ^F000:BFB1% F# k, T! E- P6 f& V0 P
-d f000:bfb0; O& a+ ?8 \3 c9 G7 r' `+ n  h
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............0 f5 h0 A( d2 @% C' K+ X+ e- [* b
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
, q5 x3 A/ G4 @  b& KF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................) [7 Y+ i: |9 r5 V* i
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
1 S/ M# k( y, W8 K- L/ v+ R( _8 g. F% _F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......' m$ Y" A6 Z% E8 D' X
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.# m0 f2 {) o/ c8 k- k1 n" f
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
( }- m6 @# M! J3 q% t. G7 ]F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
2 A5 W/ w4 l' J7 k" W4 O' _-d f000:06f0) c8 ?$ L( N: e% Z1 A' T6 h
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................) o7 [: p: H; h! J/ ]/ ?5 q
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American3 T- O0 F* [+ r$ ~+ z+ A$ g4 E
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
% ~) R% j. C. {F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
1 C. G* h. h5 ^F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
0 O  k9 k0 G+ y; O" x: zF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...8 r/ C) _6 r1 t; ^8 Y1 y
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
$ k  Y& t1 b2 Q! j6 G, r  q$ L) [F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
! b% W% D( [# r5 m1 A4 Z: h9 n
( n, c6 X9 B' `" K- N/ U
4 t: t: B/ x6 k& i. Y! h我要读出这里的06f9:07
8 X5 H" [" E7 G. t. ]# _% T 然后得到一个(07+1)*64=512 这样来获取BIOS大小-% n1 J% W" P4 ]
% @9 ^3 A9 M. Z2 t2 T/ O/ O( u1 @" O
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码/ c5 ~! Y. [2 e3 i8 A
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。( q0 }" }' J) e5 C% l
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。! S! M6 \' l' u  h2 N1 m" h/ l
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:% [0 j, k4 j# x
.model small% T6 n% H2 M7 j6 f' ]4 f6 W
.386
# ^) E. [6 M$ G! S% @.data% h3 X0 Z. @: Q5 ?/ y1 b  a4 S! j
    SMBIOS_Sign db '_SM_'
3 h4 o4 h9 c. c$ o; q; g.code( m! u( m# U; X
start:
. w0 {  ?3 H8 v) z8 d: z    mov ax, seg SMBIOS_Sign
. f8 l4 X0 U& f5 v% g" T; [    mov es, ax+ S9 a% F7 ^. T" n  L
    mov ax, 0f000h
( M  r. P3 G* D) D    mov ds, ax
8 j; j, k7 e3 J& G    mov si, 0$ F/ Q8 Q" f. P
    mov cx, 04000h
$ g1 O4 Y2 _9 u$ k    cld: w6 T$ M1 b$ z) k) [
@@:
( H8 w! u; o5 Y8 C. \    lodsd/ z5 j4 L( |9 ?4 t' M6 P
    dec cx- T, B1 \, B8 |6 `# ^# q
    jz  short @F- `6 a3 Z9 e* n( C- l, {$ y
    cmp eax,dword ptr es:[SMBIOS_Sign]( h* j% k3 O! `; g7 q6 U7 O+ S
    jnz short @B
9 i2 X& c" g9 O* ^! E& E% b# r@@:
8 e  X! \: y6 ~/ Q    or  cx, cx, S' c  p" L  a
    jz  short @exit' O: m+ z# k. U" m. h9 F
    add si, 14h
2 j2 @) C! d3 o% u3 f    mov ax, ds:[si]
6 u/ D" p7 b4 T    add ax, 09h7 K8 g0 ?7 _" t* l+ P
    mov di, ax
7 F" n, R, e3 v    xor bx, bx
  B$ V6 N( b" w    mov bl, ds:[di]
9 J! M0 @: G3 Y: ^    inc bl
3 y% X  S, }+ z+ {    shl bx,6
" H. J# i1 S9 {' c+ v6 V@exit:
& V. r+ G1 O. |1 x1 s9 Z    mov ah,4ch0 s2 `2 @0 {4 H9 m0 K
    int 21h8 I& W) v: G5 c  L" J) ]4 S# @. o
end start
; I' X* n& a) r; f+ @( pcseg ends6 c, B; x( e$ a7 c( i5 X7 k5 y
推测你的算法是:  r# M% W; z7 e" W" {! X& y
1.找'_SM_',然后在其后offset 18h的地方为下一个offset24 W9 r4 Y/ y8 |; n4 Q
2.找到这个offset2+9的地方的值* j9 v6 F5 P  R
3.此值加一,乘以64为BIOS Size,在bx中.' a; t- T; U. H8 _, v1 A/ d8 M- ~
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT% a0 X# c) f! D9 @, H6 Y1 K8 X
    ;此处输入数据段代码  
7 ]3 ?0 u0 U2 T5 FDATAS ENDS
* [' w% J7 }) P+ ?8 w; _- u; b
5 \2 D& G3 h! O: xSTACKS SEGMENT3 d) R7 m& W+ h
    ;此处输入堆栈段代码3 W$ ?& s; b0 b- Z  S) y
STACKS ENDS
' u  x# @% `; Y- S6 x" U( D$ G: D# @3 x, G8 R
CODES SEGMENT
% h# o- m7 ]$ B* Y: E    ASSUME CS:CODES,DSATAS,SS:STACKS
1 q) H/ M+ i, K* Q$ O; J6 W.486( ?+ c1 X$ J2 R# ^* Y. b8 m
START:0 G$ O4 I* S3 v% `
    MOV AX,0f000h+ z8 N, U# h, H/ ^' y
    MOV DS,AX- k$ P1 @1 z' i  k& ]: T6 M
    ;此处输入代码段代码
3 U) Q1 I' k8 v; x+ h$ B1 f    mov si,0/ [. G8 t/ F  D9 `* a3 ]& h. O
   last: 6 P0 U3 a* ?6 h/ c1 b% ^* D- Z
    mov eax,[si]
  r' Z- @6 E+ V  l    cmp eax,5f4d535fh  M: O6 u) e+ C* k, E& [+ q, Z
    je over% G0 g1 C- i0 l: x. C- y
    add si,10h; X$ \- j$ G$ |
    jmp last& t; @3 b" \( F5 d! }9 k- _
    " H' P3 c( J# u( _; e: {
    over:
' @2 U4 W' l' x) E, Y: e    add si,18h
" _- @% v( N% J& C, p% o    mov eax,[si]
: e! j: a/ B" N2 |    mov si,ax. S& `/ i, J8 ~0 T; d
    add si,9
" Q1 g0 q& e- A4 D. Y. ?1 R" K    mov ax,[si]7 U" u& l& U' j* ]: [
    add al,15 f  w, o9 p/ c  T: A
    mov bl,64
4 ], \; w' U& }" v    mul bl( p( J2 i; l. X5 ~6 I  i) m
    mov bx,ax
+ ]- r, v" W5 F2 \: {   4 j3 @  O: D' h0 w& m
    call display+ u) t5 f) P6 C& x  m
    MOV AH,4CH
" u) p1 C# p9 J( L    INT 21H  6 a. d$ W- O# X( w' O$ A
   
9 |. W+ l: u. a4 Y  i* K* K9 F6 L/ K    display proc near3 |9 l- R8 [# J
   push ax
, i! r% g3 G( @5 L   push bx( ~8 J7 U4 N! Z' p
   push cx
' E* f2 W; U) l# e& ^# ~7 X   mov ch,4; d- y8 X% `9 D7 k" I' }
  rotate:mov cl,4
" C0 D; |0 b' Z$ r  h! {- m   rol bx,cl" W4 K, o& Z% @9 B. m3 M9 ?- }
   mov al,bl
; k) i" ?5 B0 `, l& `! l' D   and al,0fh) G2 D2 w9 p9 }) {
   add al,30h
1 n" C! V& M% g: ^' Q   cmp al,3ah. t' m) C0 ?1 i, ?
   jl printit
5 ?. V# v! \: s, n   add al,7h  H. c" z2 V6 v( _* M' ~6 p3 F
  printit:
' C8 S8 f* O6 W: f9 p1 W  h$ @6 J2 ]  mov dl,al! T* ^9 L  n) c* \5 K$ j& l
  mov ah,2
  J8 `( C! F# E! c+ e$ `  int 21h
( L0 v. U4 c6 V  dec ch# g. Y2 J' B# Q( f
  jnz rotate# O/ k/ P: z6 F8 E. p4 l
  mov dl,20h  y0 ?" y& u( R  g
  mov ah,2h
) Q! g0 h  m, b, V7 ^  int 21h; Z( Q- `, |9 J* W5 u
  pop cx
9 f6 M* [. A$ C% W# o5 c) e# o& t  pop bx% U$ u" p( t4 J1 A7 N2 [
  pop ax
2 B3 p1 ]* N; d- S0 C+ d9 E1 ?" |) g  ret
& I2 Q: g6 d, X4 k  display endp! m4 j3 V3 s* N

) p1 r+ R2 \/ `" |% Z" \CODES ENDS2 p, q; M- p3 x( U
    END START- }' i4 G2 K0 I! z0 r' P& r

& ^5 E* b; D8 Z: w1 z* T3 A运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
6 w8 S$ r/ e' sDATAS SEGMENT
, J& H5 P& b9 q- G9 v& `    ;此处输入数据段代码  1 @8 L- i1 c" a1 [
DATAS ENDS: n* W+ B* a! p# i0 I6 t
3 ^  v: y4 k1 V8 e, d
STACKS SEGMENT  j2 K  A- c2 _* |3 C, ~
    ;此处输入堆栈段代码
2 z+ h3 q+ O9 }/ R. N  HSTACKS ENDS
  B; [# {: ]& E# Y
# {" O* x# o% b; Q% \CODES SEGMENT
' ?, ]8 w$ [& f7 G& \) S1 K8 Y/ J    ASSUME CS:CODES,DSATAS,SS:STACKS
# K0 N2 R6 |* q: z: j. D( x.486
, C* n* p# W. `6 r* ^! V6 l" z; jSTART:
; v, K) k+ f& B+ k$ H0 i. V/ z    MOV AX,0f000h
4 r) I0 }9 t2 |; [% T& {    MOV DS,AX ...
$ D8 J, y' B0 z' A0 j( N4 S
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。3 U) q% f  r2 J7 t# ^
# @: t! v! ^9 L) y
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 16:20 , Processed in 0.024704 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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