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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
, S/ E, L' E$ M( P  z, r-s f000:0 ffff'SM'
0 s, h1 j: Y; p  k" sF000:BFB1% k2 P' N' q4 N( [( B" |! m. Y
-d f000:bfb0
! O1 f5 q) J/ T5 a1 F& ]& p& J2 [F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
+ T/ U2 c" [6 y! eF000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
8 H* f- m6 M6 ]7 A# M: c8 DF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
4 ?5 l: E% G! s$ RF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
8 i  y# B8 o3 g( R0 ^. l4 m! RF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
' c8 h% I+ C! ?- QF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
7 z/ L* Z2 [% P" h% sF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V/ v* Z+ p9 c. [5 c. m  y% R4 g
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..: x% j+ r: @- j/ ?% R- V; S( o
-d f000:06f0( ]3 l. Z8 e; P  Y, T; B1 x5 q
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
8 B9 v3 I" Q8 `& V! d9 u6 h5 U9 o  VF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American4 w$ w! ~0 r$ z+ @  Z0 U5 m
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
* C$ x5 V$ ~! P, ?F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
3 z9 f! I; [2 J# R0 LF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
8 n; [% u9 f" x" ~: J& f& w. GF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
+ e# J* S/ E  I) l, l# m+ P8 CF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
# H1 U: O; ]7 J1 b& a8 y2 TF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ0 C1 T( c- B) g( Y$ Y
+ u. H" M( u. R5 z% X6 ~# I
; N- Q# L5 R; l5 y2 H; [  K' n/ M6 m
我要读出这里的06f9:07
& I, l: N4 k; J" Q& a 然后得到一个(07+1)*64=512 这样来获取BIOS大小-1 |" L* ^: m( j% s

$ `9 V! x3 @/ o4 ^$ t/ E! f用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
, v! A- ~5 ]# N# s7 H1 a谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
' @$ U/ y: k4 e0 r正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
5 d  T: A8 Y3 l2 |0 P, J$ F0 S4 k, j6 O至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
% w  H) R1 u3 N( v4 _.model small2 I; ^% a& w$ R8 R0 d3 M
.386
9 }7 ?! F% M2 @  Y, u  |.data
/ B% Z- S6 }1 i/ o* S& w2 y    SMBIOS_Sign db '_SM_'4 G/ [0 \9 Z2 J; t0 |- P
.code
: t7 N+ r0 x+ ystart:3 |6 r# _; z0 q
    mov ax, seg SMBIOS_Sign
. ~0 [5 g( S: g# j    mov es, ax
9 k. I& K6 F& l+ x# J    mov ax, 0f000h0 u% B& E- r! k' v
    mov ds, ax2 ^! w  @2 l  g
    mov si, 0/ X  t, P0 u2 j; a4 f
    mov cx, 04000h) K( E: h* @# w! I2 T7 O4 v: k  D0 _
    cld
( N2 Q" Z# C2 D. k* U@@:
$ J( V6 _) U; a8 G. R$ H    lodsd
' W* _0 D3 n+ B9 r/ |, w7 b; D    dec cx2 C! @! L- \: |& h* H& U
    jz  short @F
9 Z) l: O1 U$ Y* P8 h( a    cmp eax,dword ptr es:[SMBIOS_Sign]
* Q2 M# R4 Y) b  {2 k7 K    jnz short @B
1 z! J( |" R# W& u@@:
" G* c4 \# Z0 x( F! W% K/ |: B$ i    or  cx, cx
, e& k: u7 c3 _% P% [    jz  short @exit) }& ], |9 ?1 i) v6 n- ~
    add si, 14h! ]( U- |) y8 Q- p, G. m8 T- o! |% \
    mov ax, ds:[si]
. R3 O3 F! Q% Z  p# r4 F/ r7 k    add ax, 09h
" c9 v. ^, v: g( C    mov di, ax2 e" {% a8 `8 F
    xor bx, bx3 X3 N. |& A# M9 s3 I* C8 A
    mov bl, ds:[di]2 o8 G0 V9 V: Q& H9 k  J
    inc bl
$ J! b: ]' E7 i- |( t$ V, s6 S    shl bx,6
: x6 m; l  F2 n2 c0 ^@exit:: _7 T% E) l2 m7 X% O% U. }- X, {
    mov ah,4ch7 u2 j9 L* x' A3 V& y7 H% e1 `1 w& e
    int 21h
5 @7 I5 [  Z! A5 Jend start* E/ C2 U# U9 W* [/ _1 z5 \, u
cseg ends
+ Y  m5 q3 r/ P8 p8 [" i推测你的算法是:
2 |, m) a4 z& i8 m- T( m* r4 p  g) n1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
3 u" X/ n; e! [. y: [; z% P/ y2.找到这个offset2+9的地方的值. d2 r. P, F2 J9 @! X' U" N5 e* W
3.此值加一,乘以64为BIOS Size,在bx中.
3 Q& u& w. Z* b! F- v0 Q. s不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
" t: ?$ k6 |  N: M. ]" s    ;此处输入数据段代码  
/ }6 N3 F0 M/ C8 n4 N2 C  T) eDATAS ENDS
! q2 D4 B+ w& \+ g: w  [6 A* ?5 \* g+ Y! E  Y( G
STACKS SEGMENT& F- A# {" R4 o0 u- I+ m
    ;此处输入堆栈段代码
" N6 |) U9 Z4 }, RSTACKS ENDS
" L( }% p0 f1 u. C/ V5 @- w8 q! ~# f& N
CODES SEGMENT
, v, {2 i% N% w5 a4 d3 [    ASSUME CS:CODES,DSATAS,SS:STACKS
' y' y( f' F6 Z$ q- r& V.4863 H& u! J5 N% ~, z' J
START:
$ }) m! q0 ~4 C' O2 M7 {0 F    MOV AX,0f000h
; l: N- @5 W' l9 h: k1 E    MOV DS,AX
' D( z7 S; P( _9 [% t' M    ;此处输入代码段代码4 U0 m: N3 w9 e$ Z
    mov si,0
. u' L1 O2 K" Q8 J   last: & M6 Z  e* R! p- P  k& |0 C
    mov eax,[si]3 h! I- h$ |, A6 H/ t
    cmp eax,5f4d535fh5 N$ H  P  J( L+ k( r9 d6 J
    je over0 K7 u7 G' X$ ^/ l) u
    add si,10h, J) ]( d/ D" d2 T
    jmp last
2 i( U0 x2 y% N! W8 e% z- A   
( w& T$ l) H5 m  B6 ~    over:
' F9 ?9 ^' M% _* }3 n    add si,18h
- E. @. z0 M  z+ T, `    mov eax,[si]
2 N" y0 W; y: L4 E$ |' _& b. Y. |    mov si,ax+ h, e7 k& T: x* c' U# r# n( m& D0 o
    add si,99 E& E1 W" n% R/ f2 Z& Q
    mov ax,[si]3 T4 j4 g* g4 C
    add al,1, r$ q- d! M! p) _
    mov bl,64
8 E% f' F/ @$ q5 j    mul bl
/ b& ^( c0 M5 \/ @    mov bx,ax  N- S" |& ~, n8 m! i% L
   ; A& H2 s' V0 ^1 Y
    call display
. f* y! d1 O, W) g7 P    MOV AH,4CH0 _* B! a" x# u: h
    INT 21H  
. `# f( l/ H- e, {   
+ c, N+ F* |: b* u; o& j    display proc near7 V! u: N/ Q( {2 I
   push ax+ Y9 f9 e+ O% z' r
   push bx; z- a& s& Q, F( k
   push cx7 M3 d" X, b# g: L& t! R
   mov ch,4
5 h0 w" c$ o6 E  rotate:mov cl,46 l2 g6 M7 H4 W" I* v
   rol bx,cl0 B8 E5 ^+ r3 O0 Q$ g0 G/ _
   mov al,bl% y( J+ U; G! H
   and al,0fh
4 k, [  A0 z8 @1 j# f' L   add al,30h; I4 ?8 t" h, h+ h$ u1 i
   cmp al,3ah
; V. g2 F$ t# W% L3 z   jl printit; D3 t" T' S( }: y* y
   add al,7h: x) W8 E8 {. O$ H6 _
  printit:
- O" G7 k! Q5 ?: B8 E  b  mov dl,al- s& L; {( c- S3 g- o$ u! v0 L0 d
  mov ah,2
6 u/ ]. q" |' B$ o% O* L  int 21h- h$ z5 n+ e8 r) h. @  `) U/ Z
  dec ch
/ ^, L; N) {! S2 T' i( @  jnz rotate& D: ^' l% U, _- V3 A* c
  mov dl,20h
5 L, |& L1 ~5 M5 J9 G  mov ah,2h
" G0 u1 g# F( c4 |2 Y  int 21h4 h7 {1 Q  e' I1 s& e% @
  pop cx. V1 N; A3 \' p
  pop bx
2 d5 A2 u$ F4 T' ]  pop ax
9 w/ @1 Z* E; x' U  ret4 R( ~  @) \  S/ n9 w
  display endp
+ k- L0 m* u5 S% `' t7 b7 X% e; C; k
/ Z* v9 R4 C3 a, O* u& R3 I6 O6 xCODES ENDS% i, U9 {" U- f# K7 ?3 H# M
    END START* {. \/ F8 f3 _3 C) [8 ?3 a

% y8 ^: W7 i% }3 L运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun7 N5 Y1 D* R' W, i2 N$ W
DATAS SEGMENT0 ?8 Q" f% N  L( r9 a
    ;此处输入数据段代码  
6 A( i2 l& D/ N9 `9 \; d  }' fDATAS ENDS5 v7 `0 |$ k6 h! s
5 ^' _: U+ @( ~6 J- k
STACKS SEGMENT
# b" E8 o  b* C# _, a9 A# [    ;此处输入堆栈段代码/ O2 Q/ H; b# U: K9 _
STACKS ENDS
% l0 l: R$ k' J/ q8 g* w2 }  h* M) u! r/ ~* y( n
CODES SEGMENT3 f& k, i5 Z% n$ w/ }0 V6 D1 d$ [
    ASSUME CS:CODES,DSATAS,SS:STACKS0 h4 J7 R! N" g, v$ h7 t& H
.486
, \) o6 @. v, d" \+ L2 m/ y$ PSTART:
$ H6 H9 w3 o6 A, v$ s+ b. `    MOV AX,0f000h& b/ t" f7 [' ]! X
    MOV DS,AX ...

2 d; S( j+ j& i二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。# I3 G) `7 j2 M+ Q& D* H
+ c/ m$ c$ \! r5 M; a9 o
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 18:57 , Processed in 0.142722 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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