Page 1 sur 2
effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 10:37
par blendman
salut
Lorsque l'on ouvre un fichier texte, xml, preference, etc.. avec purebasic, que ce fichier soit encrypté ou pas, il est possible d'obtenir le texte de ce fichier via la mémoire.
Je me demandais s'il y avait moyen d'effacer le contenu du texte après utilisation, car même après avoir fermer ce fichier, cela reste en mémoire et est accessible.
Par exemple, pour le xml, j'ai bien essayer freexml(), mais j'ai quand même encore accès aux informations du fichier xml en mémoire.
Savez-vous si cela est possible ? Ou sinon, savez-vous si on peut charger un fichier en mémoire, obtenir l'information voulu et libérer cette mémoire.
Par exemple, j'ai testé en utilisa catchxml(), à la manière de catchsprite(). Mais le texte (xml) reste en mémoire et est accessible, même après un freememory() et un freexml().
Connaissez-vous une méthode pour faire ce genre de chose ?
Merci

Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 10:48
par Chris
Étonnant ce que tu dis là!
Tu le charges comment, ton fichier?
Parce que si tu le charges en mémoire avec AllocateMemory(), FreeMemory() devrait normalement le faire disparaître de la mémoire.

Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 11:18
par blendman
oui, cela m'étonnes aussi
voici le code que j'ai testé (dérivé d el'exemple fourni avec purebasic) :
Code : Tout sélectionner
#Window = 0
#TreeGadget = 0
#XML = 0
Procedure FillTree(*CurrentNode, CurrentSublevel)
If XMLNodeType(*CurrentNode) = #PB_XML_Normal
Text$ = GetXMLNodeName(*CurrentNode) + " (Attributes: "
If ExamineXMLAttributes(*CurrentNode)
While NextXMLAttribute(*CurrentNode)
Text$ + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
Wend
EndIf
Text$ + ")"
AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel)
*ChildNode = ChildXMLNode(*CurrentNode)
While *ChildNode <> 0
FillTree(*ChildNode, CurrentSublevel + 1)
*ChildNode = NextXMLNode(*ChildNode)
Wend
EndIf
EndProcedure
If OpenFile(0,"test2.xml")
If ReadFile(0, "test2.xml")
length = Lof(0)
*MemoryID = AllocateMemory(length)
*MemoryID2 = AllocateMemory(length)
If *MemoryID
bytes = ReadData(0, *MemoryID, length)
EndIf
CloseFile(0)
EndIf
CatchXML(#XML,*memoryID,length)
;If LoadXML(#XML, FileName$);
;
If XMLStatus(#XML) <> #PB_XML_Success
Message$ = "Error in the XML file:" + Chr(13)
Message$ + "Message: " + XMLError(#XML) + Chr(13)
Message$ + "Line: " + Str(XMLErrorLine(#XML)) + " Character: " + Str(XMLErrorPosition(#XML))
MessageRequester("Error", Message$)
EndIf
;EndIf
If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TreeGadget(#TreeGadget, 10, 10, 480, 480)
*MainNode = MainXMLNode(#XML)
If *MainNode
FillTree(*MainNode, 0)
EndIf
For i = 0 To CountGadgetItems(#TreeGadget) - 1
SetGadgetItemState(#TreeGadget, i, #PB_Tree_Expanded)
Next i
FreeXML(#XML)
FreeMemory(*MemoryID)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Else
MessageRequester("Error", "The file cannot be opened.")
EndIf
et le fichier xml (mais bon, n'importe quel fichier irait, je pense), à nommer "test2.xml" par exemple :
Code : Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1"?>
<GENERALZ SUBJECT="XML"> <!-- note-->
<INFOS ISBN="9782212090819" LANG="fr" SUBJECT="applications">
<AUTHOR>
<FIRSTNAME>Jean-Christophe</FIRSTNAME>
<LASTNAME>Bernadac</LASTNAME> </AUTHOR>
<AUTHOR>
<FIRSTNAME>François</FIRSTNAME>
<LASTNAME>Knab</LASTNAME> </AUTHOR>
<TITLE>Construire une application XML</TITLE>
<PUBLISHER>
<NAME>Eyrolles</NAME>
<PLACE>Paris</PLACE> </PUBLISHER>
<DATEPUB>1999</DATEPUB>
</INFOS>
</GENERALZ>
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 11:38
par Chris
Effectivement, c'est étonnant
Essaie de faire un FillMemory(*MemoryID, MemorySize(*MemoryID)) pour remplir la zone mémoire de zéros.
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 11:42
par G-Rom
tu remplis *memoryID avec n'importe quoi, des zéros par exemple.
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 12:59
par Backup
c'est quoi ce code ?
Code : Tout sélectionner
If OpenFile(0,"test2.xml") ; <------------ça sert a rien ça
If ReadFile(0, "test2.xml")
length = Lof(0)
et apres tu reserve 2 fois de la memoire ?
Code : Tout sélectionner
*MemoryID = AllocateMemory(length)
*MemoryID2 = AllocateMemory(length)
mais tu ne libere que :
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 13:18
par blendman
Bon, j'ai testé plusieurs techniques.
Sans utiliser catchxml() ou autre, mais juste en lisant le fichier xml dans un premier temps (avec readdata() par ex) :
- Si le fichier est encrypté, puis décrypté, je n'accède pas facilement au contenu (même si ça doit rester faisable).
- Par contre, s'il est en clair, j'accède très facilement au contenu (enfin, via la mémoire).
Par contre, si j'utilise catchxml(), là, que le fichier soit encrypté ou pas, on accède assez facilement à son contenu via la mémoire, même avec freexml.
Donc, la question reste entière et j'imagine que ce n'est pas simple : peut-on ouvrir un fichier texte (encrypté ou pas), y prendre certaines infos (lire ou écrire) et le fermer, sans pour autant pouvoir obtenir ces infos via la mémoire ?
Dobro : c'est vrai que openfile() avant readfile() ne sert à rien. Pour la libération de la mémoire, c'est un copier-coller trop rapide, en fait, dans mes tests, j'ai aussi libérer *memoryID2, mais j'ai le même problème.
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 13:49
par Chris
De toute manière, il faut bien que tu stockes tes données quelque part si tu veux les exploiter.
Que tu les laisse dans le tampon, que tu les stockes dans des variables, dans un tableau ou dans n'importe quoi d'autre, elle resteront accessibles pour peu qu'on se donne la peine les retrouver.
Il y a toujours une adresse ou les données sont stockées. Il suffit de la trouver.
Cela dit, c'est vrai que ça me parait bizarre, cette histoire de mémoire qui ne se libère pas avec un FreeMemory().
D'autant plus que si tu utilises un PokeS() pour coller des données dans la tampon, le FreeMemory() fonctionne normalement.
Code : Tout sélectionner
Chaine$ = "Ceci est une chaine"
*Buffer = AllocateMemory(Len(Chaine$))
PokeS(*Buffer, Chaine$)
Debug "Contenu de la variable " + PeekS(@Chaine$) + " : Taille = " + Str(Len(Chaine$))
Debug "Contenu du Buffer " + PeekS(*Buffer) + " : Taille = " + Str(MemorySize(*Buffer))
FreeMemory(*Buffer) : Debug "La mémoire à été libérée"
Debug "Contenu du Buffer " + PeekS(*Buffer)
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 15:11
par blendman
Etrange, chez moi, la mémoire est à moitié effacée avec ton exemple :
Le debug :
Code : Tout sélectionner
Contenu de la variable Ceci est une chaine : Taille = 19
Contenu du Buffer Ceci est une chaine : Taille = 19
La mémoire à été libérée
Contenu du Buffer x x une chaine
logiquement, après contenu du buffer ne devrait-on pas ne plus rien avoir ?
EDIT :
De toute manière, il faut bien que tu stockes tes données quelque part si tu veux les exploiter.
Que tu les laisse dans le tampon, que tu les stockes dans des variables, dans un tableau ou dans n'importe quoi d'autre, elle resteront accessibles pour peu qu'on se donne la peine les retrouver.
Il y a toujours une adresse ou les données sont stockées. Il suffit de la trouver.
oui, je suis bien d'accord, mais disons que j'aimerai juste que ce ne soit pas trop facile à obtenir, car pour le moment, c'est vraiment très simple à avoir (le contenu d'un fichier texte, xml, pref, etc..), contrairement par exemple aux images (avec catchsprite()).
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 15:19
par Chris
Normalement oui.
Quand je lance ce code, je n'ai plus rien dans le buffer qui se trouve dans la chaine "Chaine$" ("Ceci est une chaine").
Il me reste des caractères (comme ceux qu'il y a au début de ton debug), mais rien d'autre.
J'imagine que le buffer est vidé, mais que son adresse existe toujours dans *Buffer.
Code : Tout sélectionner
Contenu de la variable Ceci est une chaine : Taille = 19
Contenu du Buffer Ceci est une chaine : Taille = 19
La mémoire à été libérée
Contenu du Buffer x?
[Edit] C'était la réponse à ta première question

Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 15:34
par G-Rom
c'est un comportement tout à fait normal , FreeMemory() pour une question de rapidité , n'efface pas vraiment la mémoire , mais son libère un index
disant que l'on peut écrire dans cette zone mémoire. Un peut comme quand on efface un fichier de son DD , le fichier n'est pas physiquement effacer , mais son index est considérer comme disponible par l'OS qui l'allouera à un autre fichier , etc...
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 15:42
par Chris
Donc, ça veut dire que si on veut vraiment que le contenu du bloc mémoire ne soit pas récupérable, il faut remplacer son contenu.
Ce que je disais au début, en fait.
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 15:43
par blendman
oki, d'où le fillmemory() qui fonctionne bien avec l'exemple
EDIT : oui, comme tu disais
EDIT 2 : enfin, sauf que ça ne marche pas avec mon exemple

, mais ce n'est visiblement pas lié à la mémoire, mais à autre chose...
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 15:56
par Backup
hum ! ça sent la défaillance de Ram ...
ou alors c'est ta memoire Virtuel qui a gardé une partie sur le disque..
(mais pour ça faudrait saturer ta ram ..)
Re: effacer du texte de la memoire (xml, ou autre)
Publié : jeu. 02/juin/2011 16:56
par blendman
Dobro a écrit :hum ! ça sent la défaillance de Ram ...
ça se pourrait, car il m'arrive d'avoir des plantages de mon ordi, avec un ecran tout bleu et il redémarre (je dirais 1 fois tous les mois environ.
ou alors c'est ta memoire Virtuel qui a gardé une partie sur le disque..
(mais pour ça faudrait saturer ta ram ..)
j'ai mis bcp de ram viruelle il faut dire, (dans les paramètres). Je devrais peut être diminuer ça.
EDIT :
visiblement, le sujet a déjà été un peu abordé, mais ça ne semble pas possible de libérer une chaine de caractère :
http://forums.purebasic.com/french/view ... 1&start=15