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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:/ K0 [9 j+ y; b- L
-s f000:0 ffff'SM'' q  e5 i* h. X' Q, E. ]
F000:BFB1
& }  a2 a% V3 Y4 w-d f000:bfb0  j2 P& P" a5 ^) Y* a' u. [& N
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............0 C+ F$ K4 M: @0 P* w: G2 w7 l7 T
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1.... q" e$ n4 X: r9 d1 |% ]; C
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
: R3 V  X" ]3 }# _! V+ a% ]- zF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
% ]0 ^5 `' Z9 H5 VF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......5 u3 S$ ]3 s' G
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
9 g! f) e1 j, ]4 d% b) h! j2 mF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V$ J# l( _- V' w5 ^2 w7 ~0 L+ _& r
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
  W4 Z1 z* y# ]9 `( H-d f000:06f06 n  }7 T9 \7 ^* ]' J7 K' l, S; ?
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
/ G$ N& T; H  ]4 I% UF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American1 `* x+ e$ e. c8 A$ |
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
  h& T( p4 c1 M( f/ Q! v! ]F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2+ I" X& R% G; m' P) B
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u1 d/ B3 L. a0 \6 W3 @; e1 ~6 Y
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
1 M/ }% i1 V% P( c* K# j$ nF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu) a' s, o5 {" Z+ ^) x1 D
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
) @, U) Z) l' C7 P# l" U* o  w7 \0 L* {! Q* f
- U% S7 f/ t! v) m9 }& k6 E0 q
我要读出这里的06f9:07) H2 T  A$ c3 X. ^
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
. g9 T" r" ~: g: u/ G  u# U6 [( a0 ?# f' w9 E# n8 i; a7 i$ _/ Z0 ]6 u) S/ i
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码! e2 P6 M/ Q! D1 ]9 C2 t& G
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
6 b! V: d" `$ b正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
9 c+ J8 \8 G, S7 O至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
* t, j( b0 @/ e& N" B% y& }6 N# v.model small
" @, z" a( `4 }! D0 y8 b) e' ~" Y" z$ [/ g.386/ {  x7 s8 q  P( z
.data3 _0 z4 I- a* N# ^# D& q' l5 ?  @  A7 w
    SMBIOS_Sign db '_SM_'
3 V0 H0 ?$ I9 {4 x( M# I# S; @.code
0 m0 y1 e( j3 B$ b4 kstart:
5 R9 F& U+ K5 b5 P( o    mov ax, seg SMBIOS_Sign
( e2 }  n' \) W    mov es, ax
% ~3 e2 C6 G& S: {: `5 v    mov ax, 0f000h
" d% U$ `5 R" c7 j# _9 e6 N* q    mov ds, ax
+ p  z6 u# c( |4 u8 Z) y    mov si, 0) V+ }4 g  W: ~: j$ f0 w: G
    mov cx, 04000h
, b* j2 u, E8 q: v+ u; Y# q6 c    cld
) g, `" O1 Z4 U- t@@:1 W$ d( A& h' x8 O! s' ?
    lodsd
0 A" w. H0 L* Q( \) A    dec cx
$ I$ p3 E4 n; C    jz  short @F
9 {# s  S1 }. Y4 c" w1 r3 D    cmp eax,dword ptr es:[SMBIOS_Sign]
9 }9 b3 \9 K/ E9 z. Q( {    jnz short @B
: S2 }9 j+ _; s( i( Y/ L" L/ F' _@@:
& J* T4 r7 O- g. o5 g    or  cx, cx
0 f& T8 R* A" [" e& v0 @    jz  short @exit- I0 \. T1 H. i" V# Z$ |
    add si, 14h
8 Y$ I3 x3 N' J9 c9 e: b8 O" ^* b- j    mov ax, ds:[si]
+ f  r% o, ?$ W/ l1 L, b5 r    add ax, 09h
2 v' z! K% @1 N% [- Z" y  ?& x    mov di, ax( Q# }! b% a! W* V! ^3 u
    xor bx, bx/ c; H! I4 f1 L* n, s+ `
    mov bl, ds:[di]& v: @* j8 E2 V3 j; q
    inc bl
6 E: M" z+ A& c) X" h' R- x    shl bx,6$ {* |6 R5 N$ ~2 h$ c  {
@exit:0 y, H. F/ z! X. a
    mov ah,4ch
4 b; I7 I% _& I) M! L2 ^) m    int 21h
! c4 h4 i7 s: b/ Aend start
5 G! P, I! Q/ N* wcseg ends
8 K: Q9 T5 w: V/ P8 F推测你的算法是:
% Y; N1 \) I: v! o$ m5 s% j1.找'_SM_',然后在其后offset 18h的地方为下一个offset29 P' i& x" V: \" p
2.找到这个offset2+9的地方的值* X  b9 X# D5 y% q0 w8 S$ `( R8 r0 @2 B
3.此值加一,乘以64为BIOS Size,在bx中.( t* \( N  s2 i  z- i  Z/ q; Y% S
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT) M  g/ J& z5 J5 |
    ;此处输入数据段代码  
$ R3 x! K' C# T+ `  ?DATAS ENDS5 u5 @+ {) ?) k4 u2 g$ r
2 {( H! c2 O$ O1 @" X0 c6 L
STACKS SEGMENT
* Y0 h8 ]( W9 e: F& P    ;此处输入堆栈段代码+ G# w; d2 j- J5 e) n
STACKS ENDS
0 X) @/ @" H& k0 X9 M
8 g- g/ v4 ]1 Y0 X/ O) DCODES SEGMENT
9 {( _  H* ^0 z# m- L4 I7 B8 O    ASSUME CS:CODES,DSATAS,SS:STACKS8 z; ~2 |$ G3 Q+ s3 ]
.4866 U9 T) f. `# b! [
START:
. a" ~  o& J2 ]' D  O    MOV AX,0f000h
. u$ N3 [! ]; D    MOV DS,AX
* q3 a' }! D8 U6 A    ;此处输入代码段代码
* C1 G% {" _/ d4 C; F9 |    mov si,0
3 ^+ ^) |! C3 y# }2 D   last:
6 n: y$ f/ y5 R. W, S6 e    mov eax,[si]3 T, {9 `9 B! p5 X7 H
    cmp eax,5f4d535fh
7 g1 K! R5 W0 S3 B7 L, W    je over$ R5 H" F+ D; ]3 X
    add si,10h3 H9 [4 E! i$ Q, u" h, o- x5 o' s
    jmp last/ y1 K4 t( ^8 y9 f
    % Q) _- x" \% F* e# A
    over:# y4 v# F8 L3 Z3 _6 Q' d6 s  k# V
    add si,18h: b8 u( h, I& }3 n8 ]1 [
    mov eax,[si]
- K- ~4 U' w2 ~    mov si,ax
$ i0 s/ O& Y/ E6 c! I1 T; S0 r- V    add si,91 m, I1 Y+ |* U* ^
    mov ax,[si]) `0 q5 O+ t# z+ r( E
    add al,1
7 v) N' u& L1 c- S$ d# U0 v    mov bl,64
6 n  e5 {8 Q+ R5 g    mul bl; D5 D7 U8 C* }. B+ h& ^
    mov bx,ax5 t0 k7 r/ l$ X( V6 H
   
/ c, _+ F6 c9 {4 h5 W! J    call display) ?; `: }5 x+ R, r8 m* _# p
    MOV AH,4CH; r/ x% v2 l. a9 S) |' _3 S( ]
    INT 21H  
  Z9 p- `% m7 w1 p   
7 {) @3 v6 _" S& d4 l    display proc near
5 n( _, P, |  S6 I( L9 j   push ax, {2 W$ E# w3 E  K/ C3 R* [
   push bx
( [% e0 M# }* j- v; U6 D   push cx/ W/ ]6 s2 _8 O) Z0 f" p
   mov ch,42 ]! y  p/ e$ g1 D: x
  rotate:mov cl,4; n9 T4 {- ~$ w, j4 J1 Y
   rol bx,cl
# w! x$ g1 |% ~# t2 `2 ]2 K   mov al,bl0 {& C. [* L, H4 q3 }7 D6 Y
   and al,0fh/ t& `4 n. u3 L3 O, P8 F
   add al,30h9 m4 H" L2 [2 ~0 n+ ?
   cmp al,3ah4 [  @2 d! i6 u; S; Q- [) P
   jl printit. @6 Z1 Q* [: w8 W# `, h- ~$ O0 u5 A) I
   add al,7h
$ A7 y! u6 T- N2 `  printit:
2 a# P2 k2 u* |  s3 _1 u2 Z' Y  mov dl,al
( n% h& \( X6 J) I  mov ah,2/ l* `% v$ M/ U, Z% N! @$ x5 Y
  int 21h
+ t3 a# n/ i; |  dec ch% x  h* K/ c5 [* [& l6 K
  jnz rotate' [) ]2 F0 X  f  z# f
  mov dl,20h, ~6 C/ S; ^2 g% z5 W8 M- [
  mov ah,2h
9 K/ l1 Y4 i2 m6 }8 I9 g  int 21h
! e/ o; S9 V% M0 z0 P  pop cx9 d7 ]+ Q5 S# Y" L
  pop bx
4 ?2 j$ T  L: g  pop ax" _! d& y& D; x# `+ {  w4 \
  ret
6 w! H; ~0 U5 v# w; ^; o% N+ G: U  display endp
0 V0 i% e% v( ~: t. v; x% m. Y6 U9 Q& C" Z. j$ A6 y
CODES ENDS) @3 N+ A5 f6 y5 C* ?8 |+ F# F
    END START9 a4 s' t( k" b; i- F+ f/ ?
+ b+ c7 J/ V8 \$ i; S( V
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun% b  H* ?8 Y. E. m
DATAS SEGMENT1 L; R, n: p9 ?" g( v* g
    ;此处输入数据段代码  
! P8 ^+ R; b5 E  ~0 Q( LDATAS ENDS
+ U# b+ _2 ^6 x0 A0 O1 S
4 W( R" G0 M$ z5 O7 [. c& W0 qSTACKS SEGMENT4 s1 d' _4 _1 L" n% T* i
    ;此处输入堆栈段代码
4 o0 z- I9 b# O! v- ISTACKS ENDS
% T9 `+ W) m/ q3 F+ U) `
! I# a$ T% g  O/ UCODES SEGMENT
  [' c6 j9 [/ V# N    ASSUME CS:CODES,DSATAS,SS:STACKS
. B! p" s( X  [3 C9 A.486) s$ a" p7 A/ U  v1 p9 ^( T; n
START:
* k+ h# I6 F# P/ R# e( i) Y    MOV AX,0f000h
# q3 y* Z  d( u2 Y1 {! s  X5 E    MOV DS,AX ...

7 F, l! S0 u" W: @6 P二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
0 R6 \2 g8 J" g$ Z; k7 I' M  s4 t6 j$ h& S4 d9 a
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:05 , Processed in 0.067711 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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