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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:7 n; |/ W5 ?9 Y5 u
-s f000:0 ffff'SM'
8 y" A4 g( ^- f* \1 l* V1 HF000:BFB1
+ @% }; ^, b7 a-d f000:bfb03 X3 E! y; w% }
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............3 V2 P, t: c3 N# ?
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...5 Z" q: O+ n8 h" ]/ Z
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
) I: p: d2 H( e/ F* `F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......8 O$ ]/ w  W9 U) `# z6 b4 ^9 a9 x/ W
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
5 E; A( \' q: _0 Z4 @0 WF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.7 W# i& O0 B) x
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V" b! v" u' H4 X% b
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
$ Q. r8 e% n+ z0 T! n% [, e-d f000:06f0: v0 a: Y' X8 s" r
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................  `' O( s7 B, D+ b9 b: H
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American7 e' ~+ m5 Q" ?5 B; v) [2 f
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
0 C* R/ Z+ i1 Q% iF000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
6 a& n1 o) P2 o; {- rF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u6 v# S0 B9 f* M- r+ v2 a( E8 h
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
! y8 s" K( I- |4 CF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
6 y0 z3 t9 ]1 u5 w5 E! x6 T, wF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ. E, k- ~* ~/ i2 k

* s' Y5 S2 p; Z& ]2 M$ R' {% U; f5 j% [$ L& c( W- F% A, o' _
我要读出这里的06f9:07
" J5 v. J% |! p1 @, {' [6 W7 h( K2 f- r 然后得到一个(07+1)*64=512 这样来获取BIOS大小-: A: N& `* i+ X5 C7 T2 O3 J0 o

" }3 c, w/ Z! S; y用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
/ _8 v: ~1 x0 F0 A; b谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
# ?" y( ]' F/ i  h; @4 J$ }正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。' w- Q* x8 ^% x% t) K+ U
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:4 O& f) }+ \0 s
.model small3 ?; T4 x! t+ L: a% P
.386
; J% u  i% g* g' j( [2 k.data
* f5 [$ ?5 N# b0 Y    SMBIOS_Sign db '_SM_'
) ~- M: k& c" y- G$ l) y9 ~- h.code3 F" Q1 Y- ]7 c! }
start:
2 u0 p3 o# \& J1 H$ z9 f% n    mov ax, seg SMBIOS_Sign* c9 C2 H& Z9 w! S/ L( ?# P6 e
    mov es, ax0 E1 Y% ~  l5 v7 e! A6 q2 }
    mov ax, 0f000h
) L# y0 u8 c2 ?: f' N    mov ds, ax) y; J  H, C8 K) |( {, k1 c
    mov si, 0
$ e8 X1 r0 \) s9 e" q. r) F    mov cx, 04000h
  `$ c* \4 K$ A, I; t  U    cld
3 g4 c- p' f# O4 f$ N& d. H( g@@:: A1 m" g; M8 Y
    lodsd
4 x+ f- L: c5 Y. p* i6 E/ {" J    dec cx
$ l4 q, h2 f9 k5 X# \    jz  short @F! ~. G6 I: }# p4 @, H3 f3 ^7 n
    cmp eax,dword ptr es:[SMBIOS_Sign]- g$ A' K+ E% O* U/ r
    jnz short @B' M" A- T5 k# d/ `- U. g/ g' }
@@:" f2 l# ~- L3 Q" j" \
    or  cx, cx1 C5 C1 K7 K  j! L1 @. J" I* ^! m. O
    jz  short @exit& P  y+ o0 b) `* }, Y
    add si, 14h& u/ g  @1 H3 L  v
    mov ax, ds:[si]
% t! c3 `6 P9 v- o    add ax, 09h) |* s7 d1 }/ H5 ?9 j
    mov di, ax
0 ~  u: h+ C: c' ^6 ^    xor bx, bx
" {5 N5 H# k% F* |$ S/ v    mov bl, ds:[di]
# W. x0 n6 N8 R- X0 I    inc bl7 Q+ g& v* e0 I& w* S1 @$ P
    shl bx,66 Y) q- z: {- l
@exit:
# f* B# Y7 S9 `    mov ah,4ch+ I! z5 ~$ H" s7 s6 Y  `4 e
    int 21h& [5 Y( o- f" K& o
end start
9 h) I/ R9 C& R8 Hcseg ends- m2 n! k5 ^2 b& C' \
推测你的算法是:
# n! y2 d5 |4 Q8 h1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
8 u9 x! v; F+ k2 r) v# Z2.找到这个offset2+9的地方的值% [% ]6 u4 T1 m* L: W) K
3.此值加一,乘以64为BIOS Size,在bx中.. T  W. d2 S$ O  S5 d1 U* D' h) f0 E7 d
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT$ v# ^9 v' X( v/ c4 g  A
    ;此处输入数据段代码  
5 G. P% T. r2 t6 N* |DATAS ENDS
' x) V- d3 Q; y# Q7 j. a* D# K- c2 ?
STACKS SEGMENT
' c! M# D, y* A7 o* @; C( p6 V    ;此处输入堆栈段代码
4 h) y$ d2 L; g* o) MSTACKS ENDS9 c4 W6 g) Z# M8 E5 M3 V

& A$ |  I( g$ x% d' cCODES SEGMENT
( I% B5 Y1 t% f! @    ASSUME CS:CODES,DSATAS,SS:STACKS: Q0 o* F, o( B# u  ]2 `: _
.486* b' F: G( \1 A9 ~8 |2 |5 t; V7 }
START:7 [  n9 x  w" C, ?
    MOV AX,0f000h
$ W1 @, C/ P6 M% s  C8 h. t0 q" R    MOV DS,AX
* G) T# ~/ Z% j* M    ;此处输入代码段代码& O+ w  @; }, F4 N
    mov si,09 |" D/ O) P! {/ B5 D7 X  U9 }, }
   last:
3 Z! d! y9 f/ _) h: U: Z* p    mov eax,[si]
) t$ o  j: s' x1 q$ G8 n: D    cmp eax,5f4d535fh
/ u5 {/ |6 g( A! ?    je over
- z0 e; B: E3 p, {4 T1 y    add si,10h
5 O2 s8 y4 B% m6 b9 R, N" D    jmp last3 U9 \) e+ m6 W- Q
   
8 _7 S$ _2 v- i: o    over:+ |  P9 o* R: }$ u
    add si,18h9 v$ ~! _4 Q/ X! C* X  a! }- I
    mov eax,[si]
- H0 \) g. c9 D% ^8 @( ^. S    mov si,ax
1 e$ r8 G! n+ H4 U% \8 ]    add si,9
! J* ^% C# ^( E    mov ax,[si]; o& d' Q5 C8 D9 S6 y  o
    add al,14 u! C, F' x2 X4 M' n, o2 W! I
    mov bl,640 k# u8 T, h0 j0 R4 A5 o$ v2 ?
    mul bl
2 x- g6 ]: U9 q, [- i, E) q3 {    mov bx,ax
4 j, I" \" M: e  D  c. F% b% p   1 j8 U; H' v0 Z' ~( D. j
    call display0 j, \* \' _: G4 [4 H7 T2 n* X
    MOV AH,4CH' R! x) C( Y, a9 F- q8 h3 y
    INT 21H  : Q+ b& Q% w8 C* X2 ?8 ^
   
/ d% M  `; m, f0 h+ N! W( d    display proc near1 m7 S/ I$ a  Z. J; _: g
   push ax* A5 g1 i  ^1 R" Z( ]' r
   push bx
/ y6 b# R! L" L3 q- |/ n1 d   push cx/ k2 D6 G! h0 ~/ A5 P' a$ l
   mov ch,45 M: |4 h7 M$ J* T5 I, p' ?
  rotate:mov cl,4
+ g4 G4 T7 k2 j8 b4 I; v   rol bx,cl  {# h: w, h# w/ _6 k) n# {
   mov al,bl% x' n( c' ?( G' g4 a7 X
   and al,0fh& ~6 E. G3 A2 Q, u
   add al,30h* }, N# c" I7 `( C4 w5 k% S. ^
   cmp al,3ah0 d# p- R/ d4 Z
   jl printit; P+ H* v6 l! w
   add al,7h/ N' k' C9 _( K! Q# m' H
  printit:: X4 L3 s" ?$ N
  mov dl,al. w) e- Z  `, p$ ?& y6 G3 \
  mov ah,21 D  ^5 a% ~. W# Y8 O* z
  int 21h8 i; D  _( R2 o0 P: k
  dec ch
% c" A- K5 i/ c* f9 h  jnz rotate' r; j' ~5 C  s5 r* C9 [
  mov dl,20h
! m0 b3 F: P- P( T  mov ah,2h
0 G; P; L" f7 v& o7 }# O  int 21h
) y% L$ r8 V4 Q: T. X- Z. e  pop cx4 A2 F% L! m' n
  pop bx
7 Y* |7 E  M5 z) T  pop ax$ V. k, a4 Y& D7 x# B& x& B* j) s7 G
  ret
4 g+ X$ ]8 j8 T, g/ `3 d  display endp+ Q& s5 u0 T6 t, @* L
  ?- U% v5 @% O
CODES ENDS
- x! r4 U! f( V+ ?5 |    END START
, T& L: `" e: e+ e( Y
4 f8 F0 n" u: b1 O运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
9 k3 i5 ~7 ?  Z+ u4 zDATAS SEGMENT% P2 A# F! }3 [2 Q$ {& g, a* `2 i
    ;此处输入数据段代码  # k  J1 Z9 B( u9 S: O3 Y; T
DATAS ENDS% v% R* B$ s$ Y6 C) s
: n1 x$ x0 n  ^8 [1 W
STACKS SEGMENT2 V% w4 Y# ]2 P- L! K" G. C. E5 s; Z) R
    ;此处输入堆栈段代码  Q% v  w# N# L7 F8 S# u; x
STACKS ENDS- c1 N, Y8 ]( P+ Y0 O
& V. s7 B  w8 Q7 t
CODES SEGMENT) a7 [8 G9 p( L; C& b* |
    ASSUME CS:CODES,DSATAS,SS:STACKS
1 J( E' u% l5 F! q( `+ g" v.4864 f, l7 w0 N7 ~9 ~5 q5 s$ c0 i
START:
6 K' ]  i2 v3 q    MOV AX,0f000h
, A# T0 W' ~6 w$ R    MOV DS,AX ...

/ A0 ?- o0 u" R; q. _二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。4 O: E7 u% Q4 e& K  |% u

- @* Y; j, \9 t4 j还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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