Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Käypä ratkaisu toisen ohjelman muistin lukemiseen?

mikkokh [05.04.2011 14:04:52]

#

Heips.

Ohjelmani tarvitsee noutaa useasti tietoa toisen ohjelman muistista, joten minua kiinnostaisi tietää tämä:

Riittääkö että ohjelmani avaa tuon toisen ohjelman muistin sekä kopioi tarvittavien tietojen muistin alkuosoitteet talteen vain kertaalleen, jättäen sen jälkeen muistin auki.

Ja aina tarvittaessa ohjelma voisi sitten lukea tietoa noiden talteen otettujen muistiosoitteiden avulla, ilman uutta muistin avausta tai muistiosoitteen hakemista.

Ja vasta kun jompikumpi ohjelma sulkeutuisi (joko minun tai se jonka muistia luen), ohjelmani sulkisi avaamansa muistin.

Toivottavasti ymmärritte ideani...

Onko käypä ratkaisu?

Jokotai [05.04.2011 15:18:21]

#

Siis kaksi ohjelmaa käyttäisi samaa muistiosoitetta. Täysin mahdollista.

Metabolix [05.04.2011 15:41:47]

#

Mitä tarkoitat muistin avaamisella? Jos tieto pysyy toisen ohjelman muistissa paikallaan (eli kyseessä on esimerkiksi globaali muuttuja), kuvaamasi ratkaisu sopii hyvin. Toisen ohjelman "vakoileminen" on kuitenkin usein hankalaa, ja jos ohjelmien on erityisesti tarkoitus välittää tietoja toisilleen, kannattaa harkita jotain muuta.

Torgo [05.04.2011 15:42:15]

#

Riippuu käyttöjärjestelmästä, mutta ei onnistu ihan noin suoraviivaisesti moderneissa PC-koneiden käyttöjärjestelmissä. Normaalisti ohjelma ei saa oikeuksia toisen ohjelman muistialueelle. Sinun täytyy erikseen jakaa muisti sovelluksesta. Katso tämä linkki Windowsille.

jimi-kimi [05.04.2011 16:08:45]

#

Jotain tällästä? http://www.blizzhackers.cc/viewtopic.php?p­=4000830

mikkokh [05.04.2011 16:44:14]

#

Kiitoksia paljon kaikille vastauksistanne!

Muistin luku toimii jo käytännössä, mutta haluaisin työstää siitä tehokkaamman koska joudun lukemaan sitä usein... Hommassa vaan on aika paljon tekemistä koska koodi tekee paljon muutakin kuin vaan tuon.

Ohjelmani hankkii siis SendMessagella tiedon $IPC_GET_PLAYING_TITLE Winampilta, joka sisältää toistettavan kappaleen nimen ensimmäisen muistiosoitteen. Sen jälkeen ohjelmani avaisi Winampin muistin luettavakseen käyttäen OpenProcessia ja tiedon lukeminen tapahtuu merkki merkiltä ReadProcessMemoryllä 'word' -muodossa.

Tietääkseni (tai siis maalaisjärjellä aajatellen) tuon muistiosoitteen pitäisi $IPC_GET_PLAYING_TITLE:n kohdalla olla samana pysyvä (niin kauan kun Winamp pysyy pällä), toisin kuin se toinen ratkaisu jossa SendMessagella haetaan ensiksi kappaleen numero ja sitten vielä kappaleen numeroa vastaavan nimen ensimmäinen muistiosoite.

Toisen ohjelman muistin lukeminen on minulle täysin uusi juttu johon olen vasta alkanut tutustumaan käytännön tarpeen vuoksi. Ongelmia näinkin pitkälle pääsyssä on ollut jos joitakin.

Tässä asiassa muinua mietityttää esimerkiksi että pysyykö luettavalla ohjelmalla (Winamp) todella aina sama muistiosoite tuon tietonsa kanssa saman sessionsa aikana - vai siirtyykö ohjelman tieto esimerkiksi swapatessa toiseen muistiosoitteeseen? - Epäilen todella moista, mutta haluaisin kuulla asiasta viisaammalta varmuuden.

Lisäksi, kun ohjelma (Winamp) jolta olen lukenut tietoja suljetaan ja sen muisti on vielä jätetty avoimeksi ohjelmani puolelta, onko silloin jo liian myöhä käyttää CloseHandlea? Voiko moinen tilanne sotkea jotakin?

Torgo [05.04.2011 18:16:47]

#

Disclaimer: en ole itse tehnyt vastaavaa Windowsille, joten tämä on pitkälti mutua. Korjatkoon paremmin tietävät, jos olen väärässä. :)

Olettaen että kyseinen muuttuja/objekti on Winampissa staattisesti varattu, niin se pysyy samassa osoitteessa koko suorituksen ajan. Sillä missä se fyysisesti sijaitsee ei ole merkitystä, koska Windows mäppää sen kuitenkin prosessille varattuun muistiavaruuteen. Jos se taas ei ole staattisesti varattu, niin se voi hyppiä mihin sattuu ja lakata välillä olemasta kokonaan.

Jos objekti on staattisesti varattu ja sinulla on oikeudet avata kyseisen prosessin muisti luettavaksi, niin ongelmaa ei pitäisi olla. Jos prosessi kuolee kesken kaiken ja yrität lukea silti sille varattua muistia, niin ReadProcessMemoryn pitäisi palauttaa false. Sama pitäisi palautua jos sinulla ei ole riittäviä oikeuksia lukea prosessia. Ongelmaa ei siis pitäisi päästä syntymään, kunhan muistat tarkistaa lukemisen onnistumisen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta