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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
* R- @( k5 H& a* g$ I7 U-s f000:0 ffff'SM') B% Q& M6 y  E) K
F000:BFB1. \0 H0 I0 r& l  h) y
-d f000:bfb0/ c7 b* D& W4 o. H
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............% l. `$ N1 b$ |2 {7 g
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...5 j+ h$ N; c9 J- Z7 N6 M( e7 Y% p
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................+ [, B: b- z1 G& _5 E9 [% p  |
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......9 O. T3 p$ M1 W% G  {8 \
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......2 u; m$ V( y* `1 i
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.# R. w/ V$ i& m4 z. s: x
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V/ \9 K+ P3 h' w, s1 I5 D
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..# [. L/ |8 s9 {- S0 k
-d f000:06f0: G: g% P4 I0 C
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
: n' S* p3 E) D* Q6 r1 D& cF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
2 o# s- @( S5 S/ h  h- A7 J( u! WF000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.: n5 i( h- X8 {& h. t, M
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
8 J1 d8 [- K5 NF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u# ?( {) q, r3 V1 k5 m$ B
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...7 E) g7 @0 ?. t" i/ l
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
6 j- r: V9 C% e! h* m9 sF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
& p7 {; Z% z0 G' j: P- Y
- `9 v% x/ }" ^8 t: G3 E- I& F& m* j7 T) W  M! }
我要读出这里的06f9:07
5 |" O* R* s7 }: ~ 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
4 a" F) N) u2 Q: Y8 n! X& V! G* y$ U0 }6 ?2 R
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码; s5 K! P  O% l% C3 R# [
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
7 K" `3 {& m' B正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
! K  {. |6 V5 m) e至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
- }& ^8 F4 D) u. |.model small
! W! T1 i8 t! J2 Y9 E! k.386! h% {; T/ E. \6 n/ T, @! T2 q
.data3 C6 G1 }5 S4 Z$ m- L4 j. M7 c( n; W
    SMBIOS_Sign db '_SM_'& U0 t& T, s. Q  |! a1 s/ ?5 f
.code( c- v& k; N2 |  w
start:/ z4 P4 e. G$ j
    mov ax, seg SMBIOS_Sign5 u7 [2 w- A! o1 ?: T
    mov es, ax) r8 J' i( B; F1 a6 |
    mov ax, 0f000h" r5 q5 |5 K! a' C9 \% p' b
    mov ds, ax
& R% I: X/ Z1 e* m3 k    mov si, 0
! j6 ^0 [* m# {$ ?    mov cx, 04000h
* u0 {! {' n) F! O" G% u' b: u    cld
+ m, O: P1 U' C2 _5 z( B@@:1 w! z9 ^% [  e: |
    lodsd
" o" ?: ?8 c$ s0 h. ?: T& `    dec cx1 P1 Q, l- p8 r& X* r4 Q. |
    jz  short @F
  I5 W/ ]& E' E4 X' c4 j* j    cmp eax,dword ptr es:[SMBIOS_Sign]) Q" s; `* ?5 l+ f
    jnz short @B' @' ]) J% s4 h9 `0 W: s# f, q. V
@@:
: Q( n! U$ ^$ s- o    or  cx, cx
3 O& m1 F3 e' Z0 [7 F( N, n    jz  short @exit
0 o  T0 h! P1 q: m3 z+ ?( {    add si, 14h
1 Z. V1 r7 s* h  R& S    mov ax, ds:[si]
# [. U% A4 b& p: Q  {/ ?    add ax, 09h
8 n6 P  P% ^0 r    mov di, ax9 L8 i! A: w+ _* C& [! @; |3 T
    xor bx, bx
; }. L' g0 Q: v$ A1 U( _( \% i    mov bl, ds:[di]: a* ~8 Z" L; @
    inc bl1 K9 l0 W7 y. ?! k) L' J* {
    shl bx,67 i# A4 J: w5 x( X- W6 \  w6 z
@exit:
8 b- C' j, I, |- |    mov ah,4ch) D; {6 v0 T( W  f7 ]6 Z7 Q( I7 q( |
    int 21h
2 P) l, @5 a! |" ^9 xend start
+ x1 A4 [" T) N% y) Wcseg ends6 V7 @( P/ M* P& f' Z. k$ T% |
推测你的算法是:, S/ w7 d( P0 U+ w6 T4 L3 ?" M
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
7 v6 q: y+ q& W  a4 s2.找到这个offset2+9的地方的值8 D! _5 X$ O: C+ E, D
3.此值加一,乘以64为BIOS Size,在bx中.
% f, }( C) |+ B# f$ f. }不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT3 L" M" p3 V, f) x3 b2 C2 r
    ;此处输入数据段代码  " z" N6 i* d( U+ s0 [: p, n1 k
DATAS ENDS3 Y! I5 o# x( b: X! q

8 i- Z+ p# \3 QSTACKS SEGMENT
: I& d9 k9 H& R, u2 P    ;此处输入堆栈段代码
1 X8 m/ |! z1 X- P# L3 s/ HSTACKS ENDS$ ?* y' ~1 X6 k& ]9 T! ?

; i; ?6 g( V' C" P1 o" sCODES SEGMENT- a6 i4 L% h* @4 O% k
    ASSUME CS:CODES,DSATAS,SS:STACKS( T8 O3 {+ ]0 C+ u5 \0 @# B: W4 u
.486
, Q2 P0 c5 e% I. p5 f$ R& pSTART:* `& T2 o. L0 `# G- u  h* N) N
    MOV AX,0f000h
( z$ ?. T* D2 a) ?    MOV DS,AX6 {. N6 \/ {. {' b( l
    ;此处输入代码段代码+ o; ^! n, J7 n
    mov si,0
" \/ ~& N9 C# x) h   last:
" y0 h5 n! c; d, k& G' `. G    mov eax,[si]
  H: `3 m7 F7 z) K+ G$ t    cmp eax,5f4d535fh
( }" k$ W. d* B' [    je over
. t- U8 l/ E( r3 [    add si,10h) G: M/ r) K9 c# f
    jmp last
- }4 w* ~; O' g2 G2 B' z! r+ M   
. H5 y: C" j- b9 |/ v    over:
, g/ {; m* y. U7 f7 B. q    add si,18h
' }2 F! L) p. i; ^" G    mov eax,[si]
& D7 V9 _" _( l- F    mov si,ax6 G2 U$ c3 i( C( |; E+ U' K) p
    add si,9. f1 k$ B4 i7 A; {
    mov ax,[si]
' @" b- x. G7 [' |7 R8 V3 y$ t7 B    add al,1( n- U# D5 j: i4 j7 p8 Q0 _7 S
    mov bl,64
+ x6 M( F+ Y& q# z# Z) Z    mul bl
! I4 M' u: E* G8 `    mov bx,ax2 p, W: }# C6 W0 U2 j' r% i( N
   
: K2 s$ L$ J; K- p% m' r2 k2 q    call display4 [( I9 z) X4 {5 X" z; e3 ~
    MOV AH,4CH7 N2 R: P4 \( E" o! k5 v( V
    INT 21H  # M( a% q) y) [1 {% ], L' T/ C
   
5 s0 C% u7 o! r( i: G0 V' g    display proc near+ O& p$ }: r' B: Q
   push ax" x2 i" i9 [) k$ x& P& r
   push bx
3 F6 a7 @1 D/ c6 \/ m   push cx5 M' x* d/ ~% n  y
   mov ch,41 Y* X' U6 I0 Y
  rotate:mov cl,4
+ R4 r0 E' p8 m& Q* z   rol bx,cl
2 A/ P, J( H$ y6 R   mov al,bl) N. j: X$ N: p" Y& @" T- k5 X- s
   and al,0fh. j! g  v& V' R5 V: x* c5 H
   add al,30h
- A2 N- s) ]7 s8 L+ o8 F; }   cmp al,3ah
5 J( s( L( Z( C( g$ R* n   jl printit+ d# Y7 |3 ~% W* A; l6 j9 K
   add al,7h
* n/ l. W- b# l& S* n" L  printit:9 Y$ |' Z, U1 X( T- h0 f- T
  mov dl,al; p8 Z6 a* M) b+ `
  mov ah,2
7 L& d$ a# J# l7 X1 ?  int 21h
7 g0 O/ @, X9 R; J/ A. z1 l  dec ch  R. e3 Z- e' ]/ U. |
  jnz rotate
8 z1 M) x: i; J; A: H  mov dl,20h/ E5 @2 \/ g7 O& W% A! Y! a
  mov ah,2h
3 S# w  M. r1 H7 U5 `  int 21h
& e* {$ X2 c/ W1 ^) w7 R3 e  pop cx
- K- J: s' ]+ d6 T: k  pop bx
3 I9 W; }4 v9 M1 ]# z) \  pop ax
. @$ ~0 Z5 o% ]  L' i9 u  ret
1 ?$ J2 t2 A' G1 f4 B3 h3 y% j  display endp- W* h4 ^+ ?$ w+ g( A

% V" O8 ^) [5 kCODES ENDS
5 _. {8 W5 |4 z& p4 A/ P9 z  i+ r- Y3 D3 G    END START) k$ b" k. R+ E2 i0 A

. f9 w: Q. ^# W9 D3 R9 o; C运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun+ T0 H! D, E' X* ?4 m+ h" u( L. }
DATAS SEGMENT/ ^7 _9 w8 F0 k# \0 F- b% i& T% j
    ;此处输入数据段代码  % t# E8 Z8 i2 x% k
DATAS ENDS3 g$ n+ i  w8 a) [3 J# b

: {2 B3 Q( x/ ]% ~1 W! x1 _4 `STACKS SEGMENT
% n2 {+ T7 N' u5 K, b9 }* m    ;此处输入堆栈段代码7 p. E, z. p. E" y
STACKS ENDS
% s/ y3 _. Z% b
8 n% Z" u& r+ ?# N, w7 N6 M. U& ZCODES SEGMENT- N7 m7 g- j1 a
    ASSUME CS:CODES,DSATAS,SS:STACKS
2 _7 K7 d) k6 C+ @3 M& f5 ?.486- s1 T2 M$ s7 W9 q! z" O
START:( R8 L3 V4 ?4 |% {. g4 H
    MOV AX,0f000h0 _9 ~3 I% r+ r' k
    MOV DS,AX ...

/ N! {2 j% W# l* ?! A" @二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
: b! A: T  P+ ~* Q
/ b1 p6 T/ ^6 h3 D9 L. ?7 m6 G还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-22 10:10 , Processed in 0.032387 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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