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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:* ?7 T+ M: I) W, R1 {" m8 X9 s* Y
-s f000:0 ffff'SM'
! k" M% x5 O0 n% JF000:BFB1
3 ?+ z4 G& s7 s1 C4 M* s-d f000:bfb0
0 H8 Q8 x% {. I$ }- i0 C5 i: J( e$ N2 NF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
, `1 s5 C: m5 P2 nF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...  }) g" E# j- S; d4 c
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................, U0 H, p% c# r. s- q2 @, A2 d
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
5 D$ c4 v4 e9 i5 B3 gF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......4 i) h! K# q5 t
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.2 b/ ^! s5 [( [7 p1 Q, [" P. R
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V6 Q% @# c1 x5 y0 ^3 s: W( J
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..! D9 P: ^2 }/ t7 m* W- J. W
-d f000:06f0
! Z2 O2 ^; `% a" c8 y: PF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................6 S" O. C' r8 c* s4 p4 e
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
  h' l' U. B9 h9 o, iF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.# l6 W# o0 l5 \0 r: f4 Y
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
- ^4 \# I5 X- Y- d/ _2 g% LF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u& R$ {$ S7 k7 {
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...) ^* {! s" j* \# ~
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
. h& \( s" o0 \) _6 g, Y. u0 T7 Q* O& TF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ0 M5 Y9 N$ A- D) ~6 ]

) j' |! N, ], q; E7 w8 U
: F) H. u/ N- v" ?, R; v; r我要读出这里的06f9:07. U' l1 A- Z. u: L3 z# G1 h# Q
然后得到一个(07+1)*64=512 这样来获取BIOS大小-! W5 @7 o( [" g/ @0 h4 R. X% _
: v  b+ O' n4 w+ n
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码7 ~* j9 {. l3 J4 i# ^
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
8 z4 P, g% m6 h4 R正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。* V1 C$ K7 v4 R9 R' }4 T
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:9 L! l$ P6 n8 J6 C
.model small+ C  `( q" L& h! g4 c1 i
.386
, j; N' z% f! O6 Z6 S& \$ [.data
5 D! T. v4 p) X2 X; `8 |7 j4 L    SMBIOS_Sign db '_SM_'
& o4 w0 I( m% X$ @1 J+ c.code  n( t$ K9 z* q* E
start:4 ?% B9 U1 I* W) T: Y9 [' j
    mov ax, seg SMBIOS_Sign
7 O( @/ E# t; x; i/ g/ C    mov es, ax
5 ?6 V' T2 _- V. _  B) p    mov ax, 0f000h. M$ Z& C+ V$ Y" K! ]% L, R
    mov ds, ax2 b; A: N4 f' C, ?( g
    mov si, 0  F" U0 r7 Q6 l- `
    mov cx, 04000h7 o6 I9 K( s# L. H3 r  I+ Z# L
    cld4 g: Y3 r4 v1 Q1 y
@@:
5 g" A2 S. f5 k3 j7 x    lodsd
8 Z2 w& J* e, W4 M    dec cx" _& [! L' y$ C' w: H
    jz  short @F" m" m! P4 g. s: Y' f7 g
    cmp eax,dword ptr es:[SMBIOS_Sign]
& ~1 f* U4 `/ s4 I3 G    jnz short @B
% I. n- q8 _3 C$ R7 K# P( q9 \5 Z@@:
2 ^  z, G4 B2 U- n: I/ T; h    or  cx, cx. j% w0 c! r9 e0 N1 Q
    jz  short @exit' ]6 e0 ^7 t- |
    add si, 14h* ^9 ?! N5 D* l
    mov ax, ds:[si]
9 R6 C; G6 q0 @4 E+ L- ?    add ax, 09h
  a3 }2 |% }2 {1 O    mov di, ax
4 k/ t3 t9 e' |! [    xor bx, bx* Y% [, J7 \$ t9 |; N" r6 G
    mov bl, ds:[di]* t2 b: r! h+ b) K" p/ t
    inc bl
# Q, y& s+ D8 M, z! ^    shl bx,6/ Q, [# v4 V( R5 m
@exit:
5 W& o3 T( t( H    mov ah,4ch
2 N1 G0 q2 P* P    int 21h
  V# f+ ^* `; t& e9 B, Q, lend start
- c/ i5 y) Q9 w/ Acseg ends
, y0 g% H  {  `0 a3 B3 v/ Z' S8 V推测你的算法是:
. l9 @5 Q; o4 e- I& ]. V' _1.找'_SM_',然后在其后offset 18h的地方为下一个offset2' ~$ \8 |5 u' }# C6 [
2.找到这个offset2+9的地方的值
1 N+ ~- h! b3 b( y# X# l  D3.此值加一,乘以64为BIOS Size,在bx中.
9 T0 J% Q9 o5 M! A) B+ S9 ]% v不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT7 d. g7 u. {' @; i, P7 l
    ;此处输入数据段代码  $ Y2 ?: w5 |, J9 Z0 G0 a2 V
DATAS ENDS* S3 Y6 m6 B1 r
( ?7 c. E* ]7 _0 C% V5 W8 t
STACKS SEGMENT- {6 o7 A7 _* M) |& {5 l5 i
    ;此处输入堆栈段代码$ u1 |. G) o0 p3 [) v+ `* J
STACKS ENDS. m. R$ Q9 s; O7 h1 N" _3 p

- j, _. y4 [# j; g- [CODES SEGMENT- ~8 l' {, d: O" K3 |- M; g
    ASSUME CS:CODES,DSATAS,SS:STACKS" D: i4 |: i: d7 [
.486, _7 I2 y" t8 |4 \7 \) L0 m
START:# t, H( A; q' G# L6 E/ G
    MOV AX,0f000h2 T: k) ~8 a) m
    MOV DS,AX6 [& ~* _- T8 ]4 B
    ;此处输入代码段代码" c( u; l9 W9 r* Y3 M2 ~- M; ^
    mov si,0
+ j2 j7 ]+ e5 w) N7 Q' W   last: ) `5 D! |' j" k8 {8 z7 L  n4 z0 O
    mov eax,[si], O4 T2 S! F9 S" p9 {/ @+ q
    cmp eax,5f4d535fh
) R, ]0 u& W4 Q0 t: c1 H( P) k    je over% g: e% b5 C  ^% B% V. y5 S
    add si,10h: P6 w0 T  y  t# ~
    jmp last. A) J$ @$ ^, r  W% d6 P% m
   
5 |+ N; {- f% l% D    over:
& D' M4 ?! ~1 y* S5 j! [$ g5 n& y) r    add si,18h
3 c0 O4 H/ p4 a$ L+ {: z    mov eax,[si]
! Q. x1 Z& H+ ?6 \7 l    mov si,ax6 k: G; F# _' m4 F- b' i/ K
    add si,9
9 o. }4 {# [% y0 C    mov ax,[si]
0 ]4 j$ N" `. l; ^  o( l    add al,1
' v1 W" @  H3 M- O1 I    mov bl,64
! L5 Q, p9 |9 ?. U* k    mul bl
7 d8 L+ O+ n( F. L2 ]: F    mov bx,ax
( ]1 t; P' f7 w& H6 Z- g   
- E5 w2 R9 L/ V+ J    call display
  z7 E+ ~1 T5 K+ s( T2 ^, u    MOV AH,4CH$ D! u& ~) x* Z, a" g+ V  x' L& |
    INT 21H  . m4 y8 f3 I% u3 e- U
    6 s8 F$ T  a5 p/ o. R5 K5 g
    display proc near5 i7 |1 M- q( S; W
   push ax
7 {9 F7 Q1 k8 p. w; E' M   push bx
: Z2 s2 x4 s; B' U# P   push cx
1 |) ?# O* e" e4 b0 J: J# i   mov ch,41 n. \/ U% t6 A: w2 q. ^
  rotate:mov cl,40 V8 C, D) q1 `* f$ I8 }' x% W
   rol bx,cl
- h5 ~4 N6 G7 Q' S, Z3 c0 T( D3 K& t( o   mov al,bl$ Y3 H5 v9 a8 H( \7 t
   and al,0fh0 {) l. ^7 u5 W3 T
   add al,30h
( D) G9 f' E6 p   cmp al,3ah
$ d" M3 |% D! G! B7 M. q   jl printit9 a' n: D- U3 d; t8 u0 \( D
   add al,7h
% G9 G+ C: \! q: `  printit:, l- B) k5 c+ i2 c3 Z5 v
  mov dl,al
4 ]/ z* z3 b" \  mov ah,2
- u% O, V* z3 f2 z3 }5 l. e0 ~  int 21h9 L& ~* W* W: P0 p
  dec ch
# n& n% R/ M* ]2 F  jnz rotate
; S" }8 t5 O, r; Y  mov dl,20h" m$ u/ K8 w2 h, L, j6 j
  mov ah,2h
1 A) p& _' s8 j% W* R- K  int 21h
3 ?% o% r1 h3 x: j7 S  pop cx+ e$ V# g! w6 J/ S* Q1 ^
  pop bx
: M6 C# w: \6 v. @( z% {  pop ax7 E( u  t( `- g2 @
  ret4 ]4 s2 p* ], b, r+ [3 ^9 E& g
  display endp
$ a' d9 }  [6 D2 U4 u. J# u
; B. G* h3 e: U# Z9 D  ^CODES ENDS% g6 p0 b6 u; L3 e
    END START
7 ~: M/ u  h6 N! a- l0 [  h
. Q# J/ \5 t8 f( M, J+ {运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
* `9 G. J8 `6 q8 B, ~: E+ |DATAS SEGMENT5 p2 B1 Z) K# a* p
    ;此处输入数据段代码  . g5 k- [0 A% T- D0 n3 J1 l( O, v
DATAS ENDS
* _# p2 N/ x0 A/ s& ~8 s- C3 n/ D7 O! `! D. ?- x4 A0 u
STACKS SEGMENT' N3 l5 d- Z$ ~* V2 P& g3 _
    ;此处输入堆栈段代码% r2 X! w/ q# |* g4 n
STACKS ENDS
8 h) X* |: b1 ^2 R) M) v8 R+ P' X9 p7 [/ _4 S+ G
CODES SEGMENT
* e: E- g+ g0 f    ASSUME CS:CODES,DSATAS,SS:STACKS- v$ b% n7 W3 _' O  u
.4863 S8 o- l1 n! _+ ?. R# q3 g: m
START:
4 B5 N  K1 w& K    MOV AX,0f000h6 k8 s5 b6 A: I6 v% `
    MOV DS,AX ...
3 ]- n  H; W: [* S- z
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。; b" N0 e0 p( g, V" C' o. I4 s
; q2 ~& U! M- w# K1 z  b) }
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 08:52 , Processed in 0.023946 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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