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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
7 w% X4 y& F; ~' [, a-s f000:0 ffff'SM'/ w# q1 r( s4 V( I
F000:BFB1
' b2 |, n: w' I-d f000:bfb0
: M" T  A5 Y1 ]F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............6 p: V; d, l, f: ?
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...2 U0 s( R( ~6 L3 y! [
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
3 ]- Y4 M9 u$ N! Y1 d# c: b* CF000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
* F5 r$ P" J" P5 @F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
5 e' `. X" o6 Z5 m" }F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-., R; J+ N( b( G
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
7 E5 @! L! k$ ^; i8 s" P: cF000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..1 L! [* C# c. c& ~# O# r
-d f000:06f0) s5 i; I( A0 f0 `/ H
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
  m1 Y1 t& [0 p: }+ VF000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American2 x9 S* p9 W* b4 Q6 R8 K+ t
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.8 N* i3 `/ B/ B% a% m
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2* C; s# y$ h' H
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
  \$ g9 t6 E4 }- LF000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
7 H+ s0 I: w. V6 M: Y3 ?+ j3 AF000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
* r3 Q& k: C8 U% I  |1 d9 V: e* TF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
: @2 j& j7 M/ m; n! N3 \* N2 M* d. P- w
( I$ N# K. t8 T- w1 F
. r" _7 x; [+ K我要读出这里的06f9:07
/ h* G# h' F6 [& w9 t 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
5 A2 @6 t- _. W$ r( g* U" K0 m4 z3 T% A% o2 m1 ]4 O' i, p/ d2 S
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码0 }9 T9 K% V. Z
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。9 `  ]: r& ]# V7 [0 V6 ^3 I
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。- I* s) ]& ^3 h2 e# |3 b
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
$ g. \: X: c% @% V% O4 a4 t  Y.model small
8 j+ ?7 t* v: P7 S- I.386
1 z+ e3 y' d0 @.data4 e" C5 n9 d6 Q% b. P# b
    SMBIOS_Sign db '_SM_'
* g, Q( f: a/ K4 z1 X8 k.code
* }( Q+ W' w* q$ P* K1 R2 \start:
) u3 `+ T. v+ D8 E+ J    mov ax, seg SMBIOS_Sign
# @2 A& v  U5 B- N& b0 Q    mov es, ax
) H  q" T" {- g    mov ax, 0f000h
4 U6 m  `$ Q8 q; h: J    mov ds, ax! \1 g' g8 ?5 @% m
    mov si, 0  E& f6 P$ W! N) H; n; [: o, @7 b% L
    mov cx, 04000h
6 L7 r8 a3 l6 }    cld& v( g& Q$ P# g
@@:
% @* A5 z8 Y" w* c) W  ~+ n( P    lodsd
/ F$ H8 q. Z& b2 Q0 E4 R# M* Q# y: w1 y    dec cx( F+ ]3 T! e) Q9 x/ Y
    jz  short @F; Y2 R7 y" J( H5 P8 K, J. u5 ~
    cmp eax,dword ptr es:[SMBIOS_Sign]" [) x4 S0 O' D% x3 f+ m9 Q
    jnz short @B
( F5 W! X9 ?1 _/ g# r@@:* I' T+ O/ |! X. e5 ~( p- {- [
    or  cx, cx
2 {& w% R) M8 l8 s: v& p) {/ `# b    jz  short @exit
0 a  ?' t: ]" J7 ~0 Y    add si, 14h
0 Q& |2 \, {# |: h7 g. }' d4 v* n    mov ax, ds:[si]
$ r; O0 B" B6 I6 s2 Z1 f    add ax, 09h
5 o4 V) n# q% A; f5 ?+ l    mov di, ax
1 E& ]8 u" U+ C" O    xor bx, bx1 _% i. V% n0 D& k
    mov bl, ds:[di]
! ~# `" d; `8 y3 g6 q    inc bl: O9 Z6 G6 z; g+ m! ^
    shl bx,6
1 h0 i3 _4 d" ]" p* C* @@exit:
1 D& J' J) ?; n4 p% L5 n% i: d( D    mov ah,4ch
; @' N6 ?. i4 h1 ~) s    int 21h$ k0 [# Z5 J2 ^. q
end start
& p! V1 q' d4 x6 m7 A. `cseg ends& M$ _* |8 S1 p" q" T; ?" U. g
推测你的算法是:
! o8 J$ y. Y1 {  b. {1.找'_SM_',然后在其后offset 18h的地方为下一个offset25 x  v8 y9 k7 `) h* Z
2.找到这个offset2+9的地方的值+ U0 \  n% ?  d4 u/ H; j8 \7 @; g
3.此值加一,乘以64为BIOS Size,在bx中.
1 H0 N4 T2 c7 p$ m不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT! U- g) p2 `1 D; F
    ;此处输入数据段代码  9 n0 Z, N$ {9 j( m2 {
DATAS ENDS
( @# x# G/ k; k0 h. L
2 Q$ k8 L) {' p% k7 E* P" pSTACKS SEGMENT
' y& b' v% K6 L+ a. _- d) V    ;此处输入堆栈段代码
$ d8 h, B7 a0 W# n0 S& m8 B! DSTACKS ENDS' Y6 J" @: d' \
* y; t% A/ r3 ?( [) `, P5 F3 _/ s% D6 v
CODES SEGMENT
% r; o! k5 I  _4 e: m; \, m: E% N- m    ASSUME CS:CODES,DSATAS,SS:STACKS6 R# z" m& V( g3 `2 o
.4867 a8 {( i3 C) t0 e# X# m
START:% K* H, ?( y2 S" {1 P8 @- O
    MOV AX,0f000h
" w5 }- ]* D1 k    MOV DS,AX
: l5 ?; }. ]% R- A- q    ;此处输入代码段代码
( B& P  y6 W; h5 c/ D    mov si,0+ V+ t9 k1 q$ b# T6 j
   last: : e, o/ Q/ b1 {
    mov eax,[si]) `, N$ _4 J+ F+ Q* i- l6 f
    cmp eax,5f4d535fh7 {" b5 z+ w# Q) L3 }! c2 `
    je over- M3 v! G: R1 e' g8 e2 I, ?1 {
    add si,10h
  E6 Y3 h: o  ?8 g9 P" d    jmp last- s9 K# H/ a. e; {
    , `$ m3 B% \( h2 H6 q# N  o: `
    over:
+ D" V2 |/ |" l9 M4 l    add si,18h
! ~: W& e) N3 o9 z: u    mov eax,[si]
( o' W' ~0 U  z$ f  Z. u! h    mov si,ax- `9 y# G( x6 s2 w1 e
    add si,97 [) T3 _- e$ }1 g' e7 P9 x* f
    mov ax,[si]
2 N/ Z  n: Y4 w" y$ L    add al,1
1 `9 Q7 ^9 Y% x7 o: i- w) T' |    mov bl,64) P; L: G' U6 ~. D: w% c  y" X
    mul bl
0 b  s1 e% ?, I/ a    mov bx,ax4 K0 T6 V" j( v5 _) X
   % b# z! L6 O3 F3 Y, w& N
    call display
, G- Z* Y  R; x/ T* t9 ?. H    MOV AH,4CH9 V1 o$ z2 ?* R$ p% n, ?7 j6 G0 A
    INT 21H  - K& H0 P: q2 s0 U- P& i
    : E! T$ J  r* s! G
    display proc near8 O# Y; q5 A1 H# v" y
   push ax
  h2 @" C  j8 D' K1 U6 V9 Z8 c   push bx
) m0 i9 J* i  d& r0 x# H2 ^. ~   push cx7 }) a8 }4 F  G" s$ l. y
   mov ch,4
( M) A. N2 z% w7 d: H7 ~  rotate:mov cl,4" C2 E/ F6 g, u5 G, W: Q' s
   rol bx,cl5 S) G; y# ]  |: @5 J8 b
   mov al,bl# v& @8 a( n! W& \7 m, v2 R+ L
   and al,0fh3 G( k8 o( Y+ x% g$ X) e: @
   add al,30h) f- I5 c" F4 n. r* n
   cmp al,3ah
+ ~5 M! i7 r9 ^/ ^7 I) d5 ?* C* S   jl printit5 g( K0 @  `2 I  T
   add al,7h( I$ P- _6 w6 h$ w9 y
  printit:  B* ]! a4 }) J5 {- w1 J
  mov dl,al( w& N) r& m, {. B' ?! }( j
  mov ah,2$ o* {2 j+ O5 f; W
  int 21h3 C* B8 ?; L3 U
  dec ch
3 w9 l. ~0 S% U+ {+ M% C: C  jnz rotate& K" ]+ H" U6 Q/ ?' W
  mov dl,20h- B. N$ L, p' Y5 ?" t3 i* p; a3 J1 F
  mov ah,2h: |; V) i) E, x3 C% J
  int 21h7 M' g" Q9 i/ t; y# r
  pop cx+ h4 k7 G0 S7 w) f0 z
  pop bx
  F; R  ~! B; D( N% g( u5 V  pop ax
8 D6 Q; }, n4 \" Q( e# C  d  ret
/ q4 D6 q0 w8 q  display endp
8 ^4 q6 J8 O! s- m- v. a, t; `6 K& X& m2 ~) x$ o. d5 ~+ n
CODES ENDS
5 \: l, k0 ]: M    END START- Y  J: T0 D' N; B2 s' G
; l+ D* m$ ]$ z  L% x
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun1 i* o: t1 U% x9 E
DATAS SEGMENT% N! ^0 F. W' K4 B6 v
    ;此处输入数据段代码  ' M& Z& L  J" D8 }2 ]. y5 x
DATAS ENDS
+ p1 Y3 l# [+ V  N2 ]" X
. A; [! f3 q% v0 O% ~STACKS SEGMENT: G; Y& C/ `8 Q! F
    ;此处输入堆栈段代码$ n: z6 t# X% \+ d
STACKS ENDS
0 u9 r/ H2 u' m
8 X( S" {: s! O% b4 tCODES SEGMENT8 z# }( k% q) G2 p; a
    ASSUME CS:CODES,DSATAS,SS:STACKS
: Q+ y, ]8 E; k6 M% F( ]/ u8 ~7 K.486" q9 S0 w6 g& m' ]+ m" [
START:
+ X& X& A0 f$ @) V: Q    MOV AX,0f000h4 G/ r  n% y% [1 j
    MOV DS,AX ...

7 b, R0 B6 f7 H/ i二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
' }. w  h7 f' Q& }% u# K
9 F( D3 M9 X7 v+ O% s* I$ V9 a- E还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:48 , Processed in 0.040638 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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