_DMI Structure(assebleri guruille)

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-
5359
Äänestä

Muut lukivat myös

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????

Äänestä
  • 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-

    Äänestä

  • Sam_T kirjoitti:

    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.

    Äänestä

  • Mad_Max kirjoitti:

    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..

    Äänestä

  • Sam_T kirjoitti:

    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   

    Äänestä

Kommentoi aloitusta


Sam_T kirjoitti:

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-

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu