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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
2 D! @4 E. u6 `9 \) P/ x* F-s f000:0 ffff'SM'
( g$ \0 j, a. w% I$ `. l9 R2 m0 {F000:BFB1
! r8 d0 p* j- E-d f000:bfb0
& U5 G  T$ n: o# y3 m; [F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
$ c& e' h; o. p1 BF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1.... \) D1 j* R& l6 e4 z+ Y* l2 e
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
/ G+ G- d6 L: fF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......2 o5 n# U6 a& l  L
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......: D6 f; S5 S& |
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
; I/ ?1 a4 r" \- ^) ]. `2 g" _F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V- {8 `7 `$ G. e3 Y
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..8 h# E/ Q9 D1 W
-d f000:06f0
' y, b, n; o" CF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................" A* r6 Q6 ]( K+ Z, C/ e7 Z
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American3 u7 z. A  R5 {( D% @+ ~# y6 x
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.- g  _5 Z2 f# \) f* M; G
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2# R- r' W# \! b: h
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u& K6 z# J' [) @# T( p- S
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...+ J- H# i6 P. x& s& d- ^- h  L
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu( k/ l; _1 S' o* x5 |5 W
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ% T) B! t+ t# n1 _- t* H
* [$ D' J7 {% Q; p9 N" \0 y1 Q' G
4 y- ]3 h; u* ?0 w
我要读出这里的06f9:07
  x$ l  z2 Y4 f 然后得到一个(07+1)*64=512 这样来获取BIOS大小-# j1 M  ]: d5 ^: b" m
& ^" S8 a: o3 V# n! C
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码  Q) h. Q0 \& B2 L0 w: X$ g3 n  H
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
: v0 ?+ B* v6 W1 e正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
& g3 h5 h" e4 N9 r0 v& {& @至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:! P! [! C# e" A! I# W9 n4 y' B+ H
.model small9 U1 ~! b- G% }0 |6 r
.386$ ]- V0 s) y& {
.data
" W7 E3 ]  D7 h    SMBIOS_Sign db '_SM_'4 d0 d3 O; G  J" [: ?1 b9 G
.code
  |' w. S% F& j$ F2 M1 N  ~4 dstart:3 @& B$ d0 i- r6 D- Z* w( p
    mov ax, seg SMBIOS_Sign
( {+ c( u: K  z& \: ^1 L0 F: K    mov es, ax$ M2 o  W/ c7 t' b, T
    mov ax, 0f000h
- A- g7 |, H5 d7 W; M6 Z* U% B    mov ds, ax
, d3 Z0 P) l* g    mov si, 0' a$ M8 }& G2 H* R4 z; e
    mov cx, 04000h- k+ V, I: @$ E' e* O# X) C3 {
    cld
% J! ^) V3 ~+ P0 V: O: v  Q2 x, k@@:
6 ?: Q, j5 X; k    lodsd: t6 a) x- W- ^7 L
    dec cx
1 P1 h. y7 Q4 ^! Q3 V    jz  short @F5 C; w/ r* B1 n9 X! s
    cmp eax,dword ptr es:[SMBIOS_Sign]% Y" r! l' C& Z+ n1 y( B
    jnz short @B* Q/ l# N; f! S7 V+ \% Z
@@:( C4 F1 C5 P5 u/ U9 S- }: Q
    or  cx, cx
  z) b* i7 b  h* ]' t) e8 T# a. |    jz  short @exit* u* R; G7 ]/ ^
    add si, 14h6 |2 ]3 m" [6 s
    mov ax, ds:[si]
' m* P; J- Z; G( I/ c; K. d    add ax, 09h2 ~8 b% _4 c! p2 K6 N
    mov di, ax# P4 R7 M9 h" e' e* z" B2 T- G
    xor bx, bx* e# P( h4 a8 C/ ^, J( J% z
    mov bl, ds:[di]
+ O9 {7 r# q! {0 \+ T, n+ h8 h- }  V% Y    inc bl
) `5 R, M2 b) u& M$ V( O- p1 N    shl bx,6
# p; q' h* {  t7 L* h4 |@exit:9 g9 x. b6 D. M, S% C5 C
    mov ah,4ch
# L$ R& n1 [4 C5 V1 L    int 21h
9 i& C5 b% N$ F- j5 w0 Oend start
" [. \+ O9 l( F+ N$ v  {cseg ends% F  D3 S# t/ f, s) _1 _
推测你的算法是:
5 n# I$ s* s5 h) M% i1 u1.找'_SM_',然后在其后offset 18h的地方为下一个offset2" L# Y2 X9 z3 ?$ J
2.找到这个offset2+9的地方的值
0 E$ P! E5 z$ g' @$ y3.此值加一,乘以64为BIOS Size,在bx中.# _( f& F3 u* ^, T/ I2 p
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT: ]: U, ~0 K! V. Z
    ;此处输入数据段代码  
5 p$ w' k& m% c8 O4 v9 j5 fDATAS ENDS
$ B( J$ q: R2 s8 V4 @
, `  z; D  O. U9 WSTACKS SEGMENT
* @* R7 V4 Q' w6 p, l    ;此处输入堆栈段代码
; p* |* z- s8 C! wSTACKS ENDS0 s0 g# ?# Q7 H% k) W' P% U
6 w# D! r  B- H, N6 ^4 F
CODES SEGMENT% z1 b' L$ b' i+ [" R
    ASSUME CS:CODES,DSATAS,SS:STACKS
1 B! m8 f6 d4 x4 |) D+ c! ^9 ~.486/ ~5 e' x8 K9 R- w" y/ ?1 |
START:! D0 o1 U/ |/ Z$ g( D/ U& a
    MOV AX,0f000h4 L5 ~# F/ c+ x* p$ a
    MOV DS,AX( V/ H; E- b7 O* L! N: e7 M
    ;此处输入代码段代码
& S) D  \$ n% i) K" _8 {! S    mov si,0' S5 Q; L& c  K) B, E! e
   last:
1 o9 G' T1 [) t# f; l" Q$ ]. j+ @    mov eax,[si]
2 K5 L. A  o; s  b, f$ a    cmp eax,5f4d535fh  m( l, R0 p4 C% O
    je over
2 Q/ c3 z# s& p- u1 [  V/ q8 D/ _    add si,10h
0 m& M: i5 f" i1 a% [    jmp last
8 F0 b) g2 v, Y6 Z4 e" ?8 s) X    + }* |; r4 T6 p. z  v5 W+ M! {- B
    over:
! ^" Q- ?; R, d    add si,18h
" c1 m# S4 {% Y: n' M- C    mov eax,[si]
. G. E  V/ V. b  m2 E+ k; R    mov si,ax5 `  s2 P) f1 K( v6 p
    add si,9, f( w' v$ T- W/ U% X5 K. a0 Y+ S  [% w
    mov ax,[si]
. o8 S( M* H3 {  a    add al,17 R# ?3 s0 G( C# R2 W+ B2 J' b
    mov bl,649 E$ f3 e0 w  T) {5 E; g$ h
    mul bl
9 X6 x2 `7 s: R7 E+ m. E) T, z    mov bx,ax
$ A- v+ \& C' [* u1 j, I/ y   
; h; ~% N& u1 N8 X+ ^: R/ }    call display
7 m8 }* _  \9 j, D7 c) \    MOV AH,4CH+ I: p9 Z' d: W! K( e9 v: }
    INT 21H  * A" a2 u' e0 [7 J8 ?2 H- |2 }
    % M7 H1 B3 C' G3 M0 `
    display proc near
6 e2 m* Y  p3 |- Z% k   push ax
; v8 d1 Q+ L; v- G: ?: v   push bx
7 |2 h  X( B& k   push cx
  B: a3 t/ }/ ^( }- x7 \$ z   mov ch,4
& b$ z" I. N& e$ h$ a  v0 b  rotate:mov cl,4  U4 ^' Z6 Z$ ^. K) _: |2 [0 a
   rol bx,cl
4 o+ @/ R( }  j4 w7 v/ z9 `" m   mov al,bl
% B) O/ ~% n8 Z8 Q* g5 d5 }   and al,0fh
5 _+ ~5 F. Q0 G. B9 Y6 a   add al,30h
: V1 Y- u7 [  E4 \7 C   cmp al,3ah
: _: F2 b5 O+ A) f   jl printit
% E% c" o1 U, v- a& r   add al,7h1 H9 n- D0 V+ Z+ F
  printit:( }- D& ^; }! X; O- S; K4 j0 C
  mov dl,al5 V& c/ Q& L7 t6 o2 N
  mov ah,2
- S8 Q$ e/ v2 [& w) I2 n% K* T8 C$ b4 c8 n  int 21h
: J0 X( Y- G& f3 n8 m  dec ch( ~' q: c, r  F+ l4 k
  jnz rotate+ d& _8 T+ Y( }3 g
  mov dl,20h
, E* J  K0 Q8 r) u  W3 `" H9 p/ ?  mov ah,2h
) S3 C# S, Y2 o/ @  int 21h. a/ @" R: \. {" v& k/ F2 [6 v
  pop cx0 [$ L! f  w( K6 |) w) ]  A
  pop bx
  [; m$ Q9 m7 I6 S7 F  pop ax
6 n& Y2 R3 X6 {1 n, T  ret" `4 w+ S/ g$ u6 {& u
  display endp
$ O5 K$ z* [/ ]& r9 X2 B* {: m4 Z% M& ~% P" }3 F5 t2 L) T
CODES ENDS
& b0 I! a/ n0 n5 s  l    END START
7 x, ]  j8 d3 ?8 I1 |
- w" }/ V+ c7 G1 l/ R: v, i, b7 p运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun
+ r9 p$ t# L( d, Q. k5 y" ~0 bDATAS SEGMENT7 {% T: Z3 Z  r
    ;此处输入数据段代码  
: _) P2 \/ T' G% u6 Z, PDATAS ENDS
  A9 V7 y2 o! q% d+ p; O) S* B
2 C- X4 b5 d! |! PSTACKS SEGMENT- _, j6 j2 |5 S' s4 O
    ;此处输入堆栈段代码; K- ~$ r2 d+ V) @
STACKS ENDS
! v8 b! G% y3 F) m4 b) \& H( ?7 \' |; M9 P" O& l, l3 v$ T
CODES SEGMENT% V( I+ x* T7 d/ D: g& z) Z" t
    ASSUME CS:CODES,DSATAS,SS:STACKS
  b+ _* Z3 t& n  d" r# M& ^3 Q: E.486
0 k7 E' P8 U# g' e! BSTART:
9 C7 U! w' t! j" f2 \/ `% [( s    MOV AX,0f000h; u* E4 I: p- o
    MOV DS,AX ...

) L1 K8 [+ D; ?. [2 p% {二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。8 n: A/ _* G0 h: n
) N9 q" S3 R/ R
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:45 , Processed in 0.056073 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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