Kysynkin tällä kertaa.._DMI structurin käytöstä.
Jos jokin on sattumoisin kuullut.Pc:n muistiin on tallentuneena Koneen tietoja.Tämän on Pc:n biosin käytössä olevaa laiteinformatiota.Osaan skannata tämän _DMI structuri rakenteen muistista.Mutta nyt tulee kysymys:Smbios specifikaation käytöstä(http://www.ibm.com/products/surepath/other/smbios.pdf)Voi olla että assebmleri taitoni on vajavaiset mut nyt en hoksaa.Miten saan otettua pointterin System Information (Type 1)structurista?
-Thanks-
Jos jokin on sattumoisin kuullut.Pc:n muistiin on tallentuneena Koneen tietoja.Tämän on Pc:n biosin käytössä olevaa laiteinformatiota.Osaan skannata tämän _DMI structuri rakenteen muistista.Mutta nyt tulee kysymys:Smbios specifikaation käytöstä(http://www.ibm.com/products/surepath/other/smbios.pdf)Voi olla että assebmleri taitoni on vajavaiset mut nyt en hoksaa.Miten saan otettua pointterin System Information (Type 1)structurista?
-Thanks-
Vastaukset 5
Vanhimmat
vähän tarkemmin, miten luet tuon structin.. siis luetko sen esim. C:llä johonkin varattuun muistipaikkaan, ja nyt haluat lukea assembler:lla tätä structia ja tarvit osoittimen tämän muistin alkuun vai miten????
Yep..#:)
Eli tarkoitus olisi lukea tiedot varattuun muistipaikkaan aluksi asseblerilla ja sen jälkeen siirrän tiedot pinossa kutsuvalle ohjelmalle.
eli tähän mennessä olen tajunnut asiasta tämän.->
mov ax,0F000h ; look in bios area
mov es,ax;es:di osoittaa tonne-> 0F000:0000h
xor di,di
mov cx,0FFFFh; search one segment
KeepGoen: mov al,'_' ;
Löytyykö muistialueelta '_DMI_' ja se löytyy tietenkin.Mutta sitten tulee ongelmia..Tämän on vasta _DMI_ structurin alku osoite.Seuraava olisi system info structuri.Ja varmaan ratkaisu on käsittmättömän helppo mut nyt ei vaan hoksaa et mites.....
-Great-
mitään koodia minulla ei ole tähän nyt heittää. Mutta jos katsot kohtaa (2.1.1 SMBIOS Structure Table Entry Point) ja siintä taulukosta offset 10h, niin siinä on se _DMI_ , ja 8 tavua eteenpäin on structien alkuosoite, se on 32 bittinen luku eli fyysinen osoite, siintä osoitteesta löytyy esimmäisenä type 0.
Jos katsotaan kohdasta (3.3.1 BIOS information (Type 0)) niin offset 1h löytyy taulukon koko merkkijonot, niitä on useimpia (esim. jos kohdassa offset 5 lukee 2... niin se on string 2:nen). Näitten jälkeen tulee sitten se Type 1 (eli se mitä haet)..jne.
Mutta siihen millätavoin ne structit olisi helposti haettavissa.. jos ei ole olemassa mitään taulukkoa missä olisi osoitteet, niin ei auta muuta kun laskea ne erikseen. alkuosoite on jo tiedossa ja taulukoiden koko, merkkijonot on nollaloppuisia, tai viimeinen loppuu nollaan. Siis..jonkinverran joutuu koodaamaan.
Sinänsä mielenkiintoinen tämä SMBIOS.. täytyy syventyä aiheeseen tarkemmin.
plug and play calling conventin voisi olla yksi ratkaisu.Speksissä onkin esimerkki functio 50h kutsusta.Mutta varmaan assylla saa tiedot poimittua paremmin.
Yksi helppo konsti miten voi _DMI_:tä voi tutkailla.
käynnistää msdosissa ohjelman debug
-s f000:0 ffff'_DMI_'
tuloksena tulee että osoitteessa F000:58D0 on merkki _DMI_.joten käsky d f000:58D0 tulostetaan muistialue.
Ilmoittele jos jokin ratkaisu ilmaantuu.Mullakin on asian kanssa mietintä myssy päässä.Joten ilmoittelen jos ratkaisen jutun..
Jos viellä tarvit koodia niitten osoitteiden etsimiseen niin kirjoitin pienen asm.esimerkin miten siintä DMI:stä saadaan noukittua ne taulujen offsetit esille.
Tämä esimerkki on sitten typistetty helpoksi joten voi vaatia pientä viilausta.
Eli _SMI rutiini paluttaa varattuun muistipaikkaan taulujen tyyppinumeron (byte) ja heti sen perään sen taulun offsetin (word),ja taas seuraavan taulun numeron ja offsetin..jne
sekä kuinka monta kappaletta niitä on (handle) sama löytyy myös BX rekisteristä !Huomaa datasegmentti on ES eikä DS
Mulla ainakin tiettyjä tyyppejä löytyy useimpia esim 8:ja.
lisäksi ne ei välttämättä ole edes numerojärjestyksessä???
;********************************************
p386
code segment public use16
; --------------------
data segment
TYPE_ID dw 256 dup (0)
HANDLE dw 0 ;kpl
data ends
; ---------------------
assume cs:code,ds:data
mov ax,data
mov es,ax
call _smi
mov ah,4ch
int 21h ;paluu Dos:siin
;************************
; SUB-RUTIINI
;************************
_SMI: pushf
push es
CLD
mov ax,0f000h
mov ds,ax
mov es,ax
xor di,di
xor dx,dx
mov cx,0ffffh
tzz: mov al,'_'
repne
scasb
mov ax,[es]:[di]
cmp ax,'MD'
jne tzz
;-----------------
mov si,di
add si,7
lodsw
mov cx,[es]:[si 2] ;handle kpl
mov bx,cx
mov handle,bx
mov si,ax ;type 0:n offset.
;------------------
pop es
lea di,es:type_id
Next:
lodsw
stosb
sub si,2
mov dl,ah
mov ax,si
stosw
add si,dx
;;; mov ax,si ; merkkijonon-offset..jos tarvii
;;; stosw
;------------------
MM:
lodsb
cmp al,0
jne MM
lodsb ; etsitään jonon loppua.. 00,00
cmp al,0
jne MM
loop Next
;------------------
lea eax,es:type_ID
popf
RET
;*******************************
code ends
end