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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:3 r& `0 P% S3 |. r
-s f000:0 ffff'SM'
  p# g2 e0 M0 n; {0 bF000:BFB1
5 _7 ~7 c0 l1 Q2 V' a-d f000:bfb0- F; h. M7 z% {' [. \+ d
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
+ f. x8 K) _& e5 ]# }/ |F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...- P1 ~1 \* O8 n2 n, {0 S! f
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................( o: l+ P1 C9 N2 S
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......; @1 z- j1 k$ z5 N
F000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
. n9 F" R& Q+ M, t/ l  i- J" i, HF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.% R: P4 z' F, Z5 |$ x/ N7 W
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V" B) A* o$ P( }. C/ f0 T
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
+ P6 ~9 r5 \) l2 j% c* W' q-d f000:06f0$ O+ z: p, e  p; `
F000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
. c4 G$ L; n$ S- @F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American0 m+ d; @. X6 A0 t! b( l: c3 h
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
9 n0 E4 O! z2 B( h5 i& {F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2' A" S% p8 ]" c: w( U4 G
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u$ E; ^0 s5 K% E( M' q" p
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...8 F0 G0 ?8 }% p: X3 k
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
+ {5 {  K# h! t5 E$ e2 hF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ; h- V6 M4 w9 b# E- L0 J

) }; Y* g  F/ U/ R. U3 ^! H9 i& k4 M, }+ k6 v
我要读出这里的06f9:07
! X! ?2 S( @6 ?+ n) r 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
/ G1 O7 I! b8 w* M! G( r) L
/ {5 M* m( V: D0 v) b用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码" n1 E1 M, i' e1 H6 ?# n3 ]
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。' N9 \5 l8 |0 _7 _# [% c' ^; z
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。* ?* b- Y4 Y5 P" E+ G; M; E, e
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:  g: u4 {- n4 s/ V% E3 j
.model small
: F1 i- x4 h: T/ x+ Z: V, |.386
: L. f1 {+ t3 P.data2 f$ m; g2 r& E% X$ {6 ~  J( t+ e
    SMBIOS_Sign db '_SM_'  k; \/ e- B0 G' Y: t: [: [
.code
" l( F* C# d% Y$ s1 Lstart:
$ c8 q4 X& v( k/ w$ }    mov ax, seg SMBIOS_Sign
  O& h! P) E; m    mov es, ax  B( P# i8 N5 M. s
    mov ax, 0f000h: Q) v- Y# ^/ D4 o' D6 o! p) {3 i$ D
    mov ds, ax+ G" D" T/ ?: N6 \
    mov si, 0
; a2 W; ~" b* A" B# w- x/ J    mov cx, 04000h
6 y) K- P6 U! u! G5 R    cld4 f, c# w3 D5 t. Z4 A
@@:
  z4 D' _- t+ X# L0 ?2 {  I! H    lodsd
5 I- ]' f4 r" Z" b! J: {    dec cx
8 m7 O7 `6 X# Z0 R    jz  short @F0 Z2 B4 `1 w0 b- K8 [8 X
    cmp eax,dword ptr es:[SMBIOS_Sign]8 E6 P7 S6 y" P# {
    jnz short @B
: q( o* B7 b: |/ N: K5 u' I5 N@@:
- m, T# Z+ `) b- R    or  cx, cx
4 h: x' i- D' k, k4 o0 k    jz  short @exit3 V0 ^( ?* ?( j
    add si, 14h
  F+ @/ C- w" |    mov ax, ds:[si]3 e: a- |7 ]. g" {& V
    add ax, 09h- ?0 V( _: H# i4 f
    mov di, ax
* d4 D+ Y! j5 D2 `    xor bx, bx
# t2 L/ o; d, w: i( L9 I    mov bl, ds:[di]* z7 ~4 g$ I  B; d# m
    inc bl% l' w; _1 ^$ g. X
    shl bx,6
' J* ~8 S% b: V) X+ G@exit:
& d! q3 t# x3 [) M, b    mov ah,4ch7 D9 V6 L2 T3 z/ j: J$ u
    int 21h
$ f( i8 `; L, M6 S( k4 lend start
& \/ |; U0 c; u2 [5 m8 S7 Tcseg ends9 c0 L' c6 ]4 H$ d, O% H
推测你的算法是:, o- G: }" _( {6 a, g2 A
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2+ D# f9 s4 P8 }7 ?2 D( j0 N% j
2.找到这个offset2+9的地方的值
: P0 A& @+ J9 P1 c! g3.此值加一,乘以64为BIOS Size,在bx中.
- r! J5 b9 X( C  ]# ~% ]  _3 i不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
8 |! `! h& t; O* Q$ A2 S' z( w    ;此处输入数据段代码  
% l: P& m+ ~0 @# {( u0 F8 x- m8 {% o8 LDATAS ENDS8 e; [9 w# n4 y5 {, l& g
8 w6 d7 x$ T$ u% s
STACKS SEGMENT
) [* U: u9 ^% L. L: Q    ;此处输入堆栈段代码; m0 }, P4 }" V4 K# H: S  ?
STACKS ENDS3 z# p5 ^- O! l# O% }: [; P0 q; N" Q
1 d: l& ?! D* f) I
CODES SEGMENT+ Y3 I* U! j0 ], ^: U8 O3 T
    ASSUME CS:CODES,DSATAS,SS:STACKS
0 o) i/ U+ O2 D1 |/ B.4861 ~$ N: R8 t- a& ?2 g+ G+ w
START:+ J: W$ X9 [) P$ T" X0 A
    MOV AX,0f000h" p' y) a$ p( `% w+ h2 m
    MOV DS,AX
, ?9 z" Z* W, J3 N( c    ;此处输入代码段代码
: V, _0 K! c, v! c5 }    mov si,0
/ ^* s4 Y# D: z0 J0 C   last:
# ^5 o; l3 B4 @% F    mov eax,[si]. h5 q3 h' y: N5 K9 g, ~: P& M
    cmp eax,5f4d535fh
. R0 l. A: O, \  [    je over
  }% X1 D  Q& K6 G$ y    add si,10h
3 v! d& p, q# s" p' Q    jmp last
) N9 o: j: L# u& Q9 \    0 S( T2 ^4 N  P: i
    over:# h8 L8 O4 i: w
    add si,18h
; a5 h9 G! G1 |( K    mov eax,[si]
5 Y) o  [& t* t/ g% U/ i    mov si,ax3 s/ }0 [' q1 ]1 z" o
    add si,9
5 y9 i6 E7 l3 s) {) G! Q/ ^    mov ax,[si]9 E& d  U( x4 @+ |3 \
    add al,1: ^! N! x1 J" v4 g
    mov bl,64
% t7 F; k2 F) g% V    mul bl+ Z9 p8 V- d9 k- c
    mov bx,ax
  w6 y( a8 C+ F/ y- c) V4 ]   
" B( M8 t( E8 N    call display9 v. N9 {0 H( x6 K! X- u# c: p
    MOV AH,4CH
* F6 ?$ k" k6 m8 w" u    INT 21H  
# _" T' G) a7 ?& C  v% s: g8 b8 p+ P    $ ?$ h9 k1 Q8 g3 K: i
    display proc near( {5 ~* N2 q7 }" d: s
   push ax
! Y! O4 E- [- E% \+ r! o3 k) p7 k   push bx  W6 }- W6 Z' Q# |
   push cx
* \% [2 `/ `+ I6 I   mov ch,4
$ x+ x" G' M9 l5 A  E+ m, ]  rotate:mov cl,4' T! b: c3 e% v# F4 a
   rol bx,cl
! H6 s% ^- U1 w$ P# b6 Y+ [   mov al,bl
# m, F$ L. H+ L# ]+ x   and al,0fh
- H) }/ e2 d+ P/ H+ {, O/ \   add al,30h5 \. R3 H! X" O$ {
   cmp al,3ah( p6 W+ x# e5 T$ m( ~9 g- Q) A
   jl printit
9 P9 Y& A9 I+ f7 D3 D   add al,7h  {" B. }) L8 Z
  printit:
" [: r7 o+ J  y& g  mov dl,al
* q! P$ Z& k* ?2 T  mov ah,2
. b; q" E( C0 Q3 j3 _1 A  int 21h& Y# z0 N) B/ ]; k- k
  dec ch! C; T* q0 ~, v; Q2 I' W+ n
  jnz rotate! S" L) H: T" z. H
  mov dl,20h
+ [, A6 |$ o# c- E, s6 c( A! U  mov ah,2h! i( ~. \$ N; ?6 U
  int 21h
! Z- U: H( \# V( ~! p- {  pop cx
* ^# L# M" z) _* `( q  x  pop bx, Y7 M9 a1 H8 A0 g
  pop ax
7 d% @" }0 u6 W3 W  ret8 _$ @! X) r- K5 X7 z9 o* U/ \
  display endp* ~* N( i2 W1 g# ?; @7 [
: b( A! ?6 H4 N/ v
CODES ENDS
' k2 |' x6 |1 C    END START
5 I) s% `& F! ]- j! v
# \+ L9 e1 O* M运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun3 _" T( U2 o0 r6 H9 R; h
DATAS SEGMENT9 |7 X2 S. O& \9 ~) N6 l5 O
    ;此处输入数据段代码  
3 O' c# q9 y1 q+ \' W: p! e: ADATAS ENDS
$ i' [9 @+ e4 q- i& Q4 C4 ~. u9 N  V9 n, D
STACKS SEGMENT
9 o3 l, r* M/ S) m# v/ G    ;此处输入堆栈段代码% _7 z1 L/ Y. w: G3 B
STACKS ENDS$ o/ ?9 A, c$ W3 D9 [0 D6 X$ [

% h+ v8 R/ W9 V  \/ g7 hCODES SEGMENT
* I/ f% \% U: e( d6 A: v; u( `    ASSUME CS:CODES,DSATAS,SS:STACKS# V/ S& [* ?: P3 o. h2 ~
.486
: n3 I; r6 g9 S6 GSTART:
! C) u" j' _5 }9 K    MOV AX,0f000h& H) i  b" ?8 N9 K% Z* z, w
    MOV DS,AX ...

7 Z3 _& h) `5 V0 }二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
1 k/ U2 b, `7 U% S
6 b/ z) l9 U$ U  D还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 15:01 , Processed in 0.065075 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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