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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
) q$ M) g" ]8 X$ p5 l" A-s f000:0 ffff'SM'" O- ~8 D! N5 s! j; W
F000:BFB1& v, O7 N: n) U' M5 R1 {, b- E& C
-d f000:bfb0
5 S2 i* {4 f1 s/ g  s4 EF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............" S0 L2 @6 _* H( M- T
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...5 E  g( B1 M' t. g" T: X8 g
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
1 j0 v1 u+ T* c  @F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
: \6 ~1 h- b" s! h3 W& AF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......5 m, j- b6 Y' E* ^$ e2 ]1 \7 j
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
( _; \* A. t2 T$ A% {' t; D- S" a8 JF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V! n3 B& D2 @0 _0 P. K( p& w" l) \
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
+ n3 |, B+ y& o% A$ N- o0 M-d f000:06f0+ l  ]9 R, K! V5 E1 ^  k0 v
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................8 e* m8 }: b: Y; N- \
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American5 {. _5 X0 ~$ S1 N0 q6 g) p
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.8 z' A$ T+ u" J5 x$ ]) Q
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/22 u# N& f( U. }4 P' T. d
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u% N3 t! @) k! Z6 P- ~; ]
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...7 }' N7 _) t& |3 G6 q8 s# ?6 N
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
% o* h7 u' B) Q7 `* y2 I1 @! WF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ3 }) Z! l5 ~+ ]6 M9 |
' ^0 T8 C, j/ ]. C2 L
% r+ ?0 G2 n  N: _/ R5 G$ g8 B8 G
我要读出这里的06f9:07, {) s* w: A( B  N  t# w$ K; a2 {
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
; v& ]9 m' R4 V7 z
2 _$ y. n2 g* l( A9 c" t# A用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
1 s5 g; F3 M4 X. m. W# G谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。0 j0 c; L$ K" E; z
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
+ V% m4 f& U8 B至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:2 C6 X8 B, g3 Q, e& V. M
.model small4 E. `* g1 O" e' g
.386# @. _+ |. q6 n' h" W1 X6 {5 G
.data& ^$ [5 a" Q. D* ~% _7 Z6 A, Z  z
    SMBIOS_Sign db '_SM_'
0 _% C6 d6 C- @! l& V3 C" R  z6 b.code
3 l; E2 G0 x" ?6 W+ tstart:3 N: F- t+ x, F
    mov ax, seg SMBIOS_Sign
5 E7 |+ |5 s1 t/ l% [    mov es, ax
- q. G" O/ F& ^, x% I0 r' }1 c& e    mov ax, 0f000h
( R' X- u6 N3 n" O0 f    mov ds, ax! [; {4 a2 |# V4 J2 Q
    mov si, 06 [$ H! f6 j7 m  l# w
    mov cx, 04000h
! F( t* P- r$ d% \: N( T$ ^: z- ]    cld
  e; B$ H( h% Q- I! O( o@@:
  @- x, t* Y/ b2 a: C& u    lodsd; E3 V0 T3 ?( M, ?4 k$ u* {. J
    dec cx/ H4 |4 [" A9 s7 H
    jz  short @F4 h* f8 m4 Z9 f# y8 ]& F4 a
    cmp eax,dword ptr es:[SMBIOS_Sign]  p# I2 ]# m7 Z  B9 m
    jnz short @B
1 F2 G( i: H. ?+ w9 m5 e) w: K4 l@@:  M4 t- V$ M4 b  F% \
    or  cx, cx
6 ^7 M  h5 I; D9 v    jz  short @exit' W0 \& _( X. I1 _5 S8 U
    add si, 14h/ u' u- L) G) n! E* b& T
    mov ax, ds:[si]" Y$ X% j: u( y8 U5 {+ w
    add ax, 09h) u8 Q0 a3 R- B
    mov di, ax2 F0 F4 g/ _/ H7 {, x$ ~2 z0 O+ g
    xor bx, bx& A5 ^# ~2 z1 o9 }2 J; u
    mov bl, ds:[di], g4 k( w/ T( ?0 ^' m
    inc bl' U, E+ @. m5 c1 d) Z' i; n2 C" g
    shl bx,64 P3 M/ v1 e5 M
@exit:5 b7 G/ s) e; I+ t8 D+ i2 ^. t
    mov ah,4ch' t# v+ |  q; _4 U! u
    int 21h
' h3 A) @) ?$ I: |7 _2 K, ?- zend start
! L0 @! A6 @) Z6 ]! qcseg ends
# b- h/ x/ r! Z6 g, U, q# h推测你的算法是:
; ~6 W$ b( V1 h8 v1.找'_SM_',然后在其后offset 18h的地方为下一个offset2% J* U& R/ a4 ]" ]
2.找到这个offset2+9的地方的值# F4 I; l3 ^% U( n, \
3.此值加一,乘以64为BIOS Size,在bx中.
& J, F% w; t: ]# G, w: j5 a不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT* M1 v5 s( {1 {% B4 _0 ?
    ;此处输入数据段代码  + X3 X0 ]+ ?0 Q# [# Y* }
DATAS ENDS3 D; g7 W5 p: m0 u1 G
) m: F) [+ q5 Y# t( W9 ?1 [
STACKS SEGMENT
4 r. e9 \" @1 |    ;此处输入堆栈段代码
; ^( O2 P3 q  ]7 j5 vSTACKS ENDS
, v# k  h+ o# P7 w9 O3 \
2 ]3 |3 ?: U, k, v; G. g7 ?CODES SEGMENT5 z) F9 o# G" @& _# f
    ASSUME CS:CODES,DSATAS,SS:STACKS# d) l5 I( \2 q1 V! n/ l8 @
.486- ~) Q$ A* N% c3 c4 b3 O
START:
8 x/ v8 q( |7 q6 p- r* s    MOV AX,0f000h
: @5 Z9 C5 H2 g" T. Y    MOV DS,AX: O; O" |; u' x( c8 }3 R2 M
    ;此处输入代码段代码& @; x& R6 a" q  U, F0 n2 P
    mov si,0  s* |: @& @. \% b1 U  `
   last: % r' K& O; d8 e5 ]# @; G9 F. Y
    mov eax,[si]6 O- r0 C! H, E2 e* q2 T6 n! O  ~
    cmp eax,5f4d535fh
6 g0 e" R. g4 P$ E  L: k  \( x' ~' ^    je over7 X: L/ E1 K4 w6 `
    add si,10h
$ b+ W# t9 m- O. i    jmp last5 O# |4 X! t( B1 a
   
( h2 k- C& ^& X    over:
  {4 G3 H* U) y( P$ \$ W5 a; j" ~/ y7 r    add si,18h6 x( K6 h6 q0 n1 J
    mov eax,[si]
- T! J& v5 A4 r$ U: Z" u! A    mov si,ax
5 F% Z6 `" S1 ?! \" N  h/ W+ A4 j    add si,9
! _# s' G6 Y8 b& G  r    mov ax,[si]( q. w3 X) k1 \+ g1 {
    add al,1
: j* A& d1 D; p* }5 L; F( W    mov bl,64$ U/ w7 Z4 F- O# n% Y. R; c1 L  B
    mul bl
' n# n! V# w8 M    mov bx,ax3 m8 {6 ~+ K3 a  f" u
   
4 v; r) b. G- C/ c6 a- [7 h) ]    call display, P) B! d$ p0 r5 Y
    MOV AH,4CH+ ^( C  Y" ]2 t
    INT 21H  / L" Q3 N& s" E. M$ w
    - ]5 A4 n7 ^7 o8 Q
    display proc near* d7 {) y/ G* v; A! }2 }
   push ax7 ]! ~3 k/ @9 F8 i/ g9 I
   push bx
( b% ~2 ~( w$ W0 W& E   push cx; D* d1 r5 T; i
   mov ch,4# n7 `0 g( j( ~0 v4 c& M& q$ W
  rotate:mov cl,4
3 W2 D7 }/ g6 Z4 d* j2 ]0 p% _7 f   rol bx,cl. K! v& A) b6 n
   mov al,bl
6 x6 E1 j) q( }. I- q8 L9 Y, U   and al,0fh* C1 D1 }0 r% o! B/ A$ D6 w3 h4 v
   add al,30h  f4 y0 C$ O+ e8 j! @/ O* @! [
   cmp al,3ah7 |1 W9 m% L% ^5 s
   jl printit
" H8 T1 g+ ?, Y" L& F   add al,7h1 u! _( u1 E, Z7 y) ?
  printit:
7 Z$ o! C" i5 Z7 n7 A  mov dl,al5 V- g7 ]* |' }; X
  mov ah,2
3 `7 g! P' {  `9 {8 D  int 21h( N) E  x+ Q# [4 b% p9 w: J
  dec ch
! G7 o+ [, w0 d' J8 b3 z/ {) I7 t  jnz rotate, L4 d. w& H& H. X% Z7 t
  mov dl,20h
5 f. U" [" m6 j+ K+ d# A5 N+ i- Q  mov ah,2h
; P6 P) V# o" p& `6 `8 A$ a  int 21h* {" o! v0 c: Z
  pop cx
& X( D3 O2 H; |# z& a2 k1 ~. X  pop bx" q- E4 {$ E2 S$ W1 ^" F
  pop ax2 R% K5 c9 W9 ~
  ret
  U, S/ Z+ v& d$ _& w7 E  display endp
3 `& l; d5 \  [: ]6 g, \  M2 L' I" g
CODES ENDS& q+ y2 s5 A8 G4 l* m- B5 d
    END START/ H- j* n$ M+ E: s  @1 D) {2 [

$ v+ F- A) T! U- x9 B) L运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun* n7 p4 Q2 g6 Y9 ^' C7 n
DATAS SEGMENT5 o: u1 l* X( f, H5 E+ a
    ;此处输入数据段代码  
9 p4 a! ^8 z2 I6 q# F! v  aDATAS ENDS
4 F' c1 H" A) v8 E5 D% {1 h4 u( _& p  }" _4 A7 j' L' S+ Q9 H
STACKS SEGMENT1 Z3 o  g9 a, \, K5 k  w
    ;此处输入堆栈段代码+ k4 u/ P- _8 A
STACKS ENDS
* |1 m9 H& D& l0 b
4 |* ~$ T' N, e) |2 TCODES SEGMENT
7 q& z6 f' c$ }" _. F7 M4 @: g    ASSUME CS:CODES,DSATAS,SS:STACKS
  |4 |7 W) J8 ~0 _/ f.4868 W) w, n9 ]8 B' m4 o
START:
* m- X; V0 |- p+ }9 ]1 n    MOV AX,0f000h- O' B. Y( a7 C
    MOV DS,AX ...

  k' n: T* b+ c3 d4 a$ O; {二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
: H" ]: s  X$ }  z3 e. \7 V3 @  O) W
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 10:34 , Processed in 0.110368 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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