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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:, t6 y- Q( }( k1 S; X, T* `
-s f000:0 ffff'SM'3 i+ f( A2 k. x9 ~% b
F000:BFB12 [$ ^( i, G" b( W2 X0 g
-d f000:bfb04 v3 l& ?  U4 a2 Z: ~
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............  z" v/ s1 n# |/ s# n' Y/ H
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
1 a; s3 y/ j) |6 U- ^. J" hF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................- a  i; K9 l9 o6 h
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......8 e( B0 [+ \  b  x9 e
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[....../ _" z& |9 s; m$ x
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
' B& J* ]4 ?5 B. OF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V( W6 p& H" f: W* n7 k
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
9 C; h* h( `9 ~6 o6 b: Y& Q0 H" V$ J-d f000:06f0
- v- s! g. f' L* `F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
8 Q9 j- r7 |" b, rF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
( c( Z4 ^' F& N* N* PF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.8 h! U6 Y3 v+ _' }6 \1 d
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2. U4 \2 c; q! `- k
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
% J& w, ~& ~0 a/ yF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
+ b- {4 u( K3 I9 V6 kF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
" |. T, z) J% E) S8 X  k2 m5 bF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ8 Y1 Y4 @7 k" l3 F/ a% Q

$ ~8 A/ T8 {- w! I8 B. r# S  b4 s8 t9 R  E0 `( `$ }
我要读出这里的06f9:07' |% [$ a9 u, b$ J) a; m$ {
然后得到一个(07+1)*64=512 这样来获取BIOS大小-7 _/ q* A4 V- @6 S; Y& h

) {- R  ]% Y  D! ]用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码- ~8 S. A. s( c9 ~: H* B2 ]9 T
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
0 t1 Q2 O' _; b$ b" t正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
5 Q7 g) ^+ G$ O) V8 H- s+ h4 e至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
0 i. b* I( X& Q5 l9 q; @, P" K.model small3 ^' U9 ~- i+ t. R4 p
.386
# P- f7 m& w& k7 ~  {5 ~9 g.data
" ^8 @" l8 S1 ?" g4 j    SMBIOS_Sign db '_SM_'
/ t( W8 u. O: {9 K$ {; S.code  @& B% J' l! f/ z9 i1 h  D( b
start:+ M- @% I8 a2 [8 O0 i$ e
    mov ax, seg SMBIOS_Sign+ J* `8 a/ k9 |- r
    mov es, ax. o. d$ Y8 O" W# x, N& ]
    mov ax, 0f000h* L. a" f' k/ Q# ^# a0 Y
    mov ds, ax, r* ~- M& g" }! B2 e+ w) I  \- G) i( G1 ?
    mov si, 0
; ]. v/ N6 d1 S) j) n5 [    mov cx, 04000h% s* v: k: p5 {( J/ k. v
    cld
; w+ Z; ^7 {" L) R@@:
0 x0 K5 P" D6 q/ B# {: e    lodsd
% t" S# _/ U: _( `* k    dec cx
# n- J# d% j( e" o1 v    jz  short @F, e; Z: o( [$ p4 w% T4 a6 A
    cmp eax,dword ptr es:[SMBIOS_Sign]# p2 c: L) O, c  R- ?/ W
    jnz short @B0 E/ u+ Q+ i' u
@@:+ r, [7 A. F+ T  |
    or  cx, cx# Q6 b  Q5 ^5 L3 Y$ t! |# q+ R
    jz  short @exit$ N7 J  R; C$ F3 z$ F$ r& N) ^
    add si, 14h9 P$ z0 g% a5 H$ g- e
    mov ax, ds:[si]1 ^0 k, S, H* {4 j
    add ax, 09h; s* L& A1 V& S. ?% c8 }
    mov di, ax
% G0 L" F" l' k    xor bx, bx
9 z4 l; F  u+ U5 ~* a# J    mov bl, ds:[di]& u- X( m* v9 A3 y* P* @
    inc bl
' c3 R, J# E( \2 `. }    shl bx,6
% }/ ~, p9 p6 O4 ^3 F  k2 e: T( {@exit:
5 Y  x# `% [! v* r  F# `$ J    mov ah,4ch$ F& B/ ]! J  B. M+ W( y0 f# i
    int 21h
0 W8 }) u0 u# O# ]end start! ~" H* g& M" z; \+ @! L6 w1 f! M
cseg ends7 t" v0 d* h% l1 a
推测你的算法是:
  {5 J  ~( j! ?& v, v' M1.找'_SM_',然后在其后offset 18h的地方为下一个offset27 H; a5 w6 I' e4 S% m; r6 {
2.找到这个offset2+9的地方的值3 d9 R" v& o" ?0 X
3.此值加一,乘以64为BIOS Size,在bx中.
5 T! x3 g$ U# l/ P) u不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT1 S3 F& L$ E- O3 ]) |8 o! t
    ;此处输入数据段代码  8 k8 M" w: p' Y' ^* ]
DATAS ENDS
5 H1 }  l) M. r& a; R/ B' c! t5 z/ d* y- [2 N2 \  P2 X- o* y
STACKS SEGMENT8 W6 |# X5 ^" u& C5 h6 P2 E7 c! ~
    ;此处输入堆栈段代码
" x0 B' l1 y- F( m4 \  g+ y2 L& lSTACKS ENDS
. a6 l1 b( B8 e$ l+ u3 S9 q* p6 b2 `1 l, A
CODES SEGMENT4 T2 Z8 b( j: G* ?* {2 {- @  `
    ASSUME CS:CODES,DSATAS,SS:STACKS
2 d9 c/ {" a9 B2 h.486# u0 D6 ?2 F0 g9 p/ ?
START:) `( e9 P5 Z% b. N) v
    MOV AX,0f000h' H2 _/ h; G9 A* e: H
    MOV DS,AX- S0 E: v: B5 W$ i1 k- o2 _
    ;此处输入代码段代码
" i7 B+ ?% C4 D( t3 s, ]& ^    mov si,0# ^9 j7 B5 r& t" s. {0 L
   last:
, t) U& L: O* L8 C2 L+ J    mov eax,[si]% P6 K5 N% t! e
    cmp eax,5f4d535fh
/ @. {: e# E6 @: i9 R+ `# c" [% m    je over
% `9 u- c  W' W3 N    add si,10h
6 i% s! T2 o+ M5 |- J    jmp last
* U* K% I0 Z# ?, X1 e' e    8 ~+ o  O& c5 L( c; m
    over:
/ Q3 t  s$ b* V0 N4 k8 @5 v    add si,18h9 J. c0 x' Y0 u  R6 Z0 Q' ]- T: N
    mov eax,[si]. X1 L: j0 N0 ?+ |1 D
    mov si,ax5 G2 F& o/ o' Z( }0 e
    add si,9
( m: w/ ^  F6 i' N    mov ax,[si]6 g4 {8 ^& u8 T3 i
    add al,1
- k) R7 b. ?3 R" [* Y" \# g    mov bl,64
) `# {' H$ A2 F6 R0 Y- X* Y8 V    mul bl/ f8 a/ a1 h, q# N# N; L' Z
    mov bx,ax
2 |7 {5 O5 a* E: H# O4 m3 i7 Z$ _   8 r5 G1 U" I& R5 L$ M  F- l
    call display
% T; p$ C6 Z4 S" s; n/ k    MOV AH,4CH) z9 q5 k  N7 F: j% X% T1 l3 W# z6 j, M
    INT 21H  
- _0 ~- b4 ~% k9 ~* N2 x% R4 ~; R" ~    - o% X9 _  l4 c
    display proc near
; d' S$ j9 @6 t4 u  k9 H) C) y   push ax
1 q8 }& y# b3 y1 C# H   push bx
$ L* T' V. V! u( z9 [; |   push cx0 c7 s' }) k7 I9 ]1 G
   mov ch,4
* H0 [8 R4 P# Q, ?" V  rotate:mov cl,41 a# g) V! i$ Q1 B: f* F3 o# c* q
   rol bx,cl
* `  w3 o4 M: k# j5 U4 T   mov al,bl
# @: M) Y4 y$ z8 l& @' ]) `   and al,0fh8 K. c, r5 w& p+ n" k# Z
   add al,30h9 J) h" s3 Y8 e/ E' C
   cmp al,3ah% P. c8 [; H4 ]: _& P, ?. J" N
   jl printit
* X) ?8 i  e2 x* O( ~   add al,7h
% t+ g8 L  ?4 n  printit:# L0 A9 |: V$ O  a
  mov dl,al' h8 L5 K9 w" B9 F/ G
  mov ah,22 S/ E2 y' E6 Y& x
  int 21h
6 p: ^2 k/ s5 g4 C! z  dec ch
8 G. h, b4 n8 U2 F  jnz rotate
/ m' P' d6 ~7 C8 \  mov dl,20h
2 I9 y3 R' Y) d1 R2 Z# q6 ^  mov ah,2h
# U; n/ y& C1 O  int 21h
4 K4 ]* ]; i6 l  pop cx& p8 f# q# ]4 V3 p" S
  pop bx( V) P: k$ m( [" l7 `
  pop ax9 L' y6 z2 S9 h
  ret
- D7 _! ~, |) F5 u* n7 |  display endp
( p+ ?* e" X% n& O8 n: q9 q
6 M/ d3 E. _6 c5 a1 i+ M  }CODES ENDS
1 p, c: U4 R5 [8 p% H    END START
7 T: n' u  U; ?  ]
9 p# e; K0 P3 {0 i* A1 t' ~% w运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun! J8 y, K: [  U# I+ X6 T4 m
DATAS SEGMENT
6 [" _: C4 f7 D! M( l0 S    ;此处输入数据段代码  
, s1 N( |5 J, L  D* j. _8 u+ WDATAS ENDS9 Z1 g# d; M/ L" I, V7 R2 o
9 j7 I  ~. l* c& H2 f
STACKS SEGMENT
" s! I) `7 k# X    ;此处输入堆栈段代码
' }3 x0 p( H( D* \! bSTACKS ENDS6 Q9 l+ X8 t# @( l' v, F8 G

3 X  `8 {! v3 [3 eCODES SEGMENT
+ [% c  {, T* P* O  Y0 S, ]; y  Y& k    ASSUME CS:CODES,DSATAS,SS:STACKS9 n% i- [* `7 g
.486
0 ~) |; ^( U; N7 q; e& cSTART:- R+ w1 V" N) k" \
    MOV AX,0f000h2 `' r- t0 x( ]. k5 a
    MOV DS,AX ...
$ m; E9 ~8 }2 _& P
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
1 t2 h8 A0 y/ o3 L* }8 ]' I4 o
3 Q, j6 I. {2 P还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:47 , Processed in 0.033841 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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