effacer du texte de la memoire (xml, ou autre)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

effacer du texte de la memoire (xml, ou autre)

Message 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 :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: effacer du texte de la memoire (xml, ou autre)

Message par Chris »

Étonnant ce que tu dis là! 8O
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. :?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: effacer du texte de la memoire (xml, ou autre)

Message 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>
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: effacer du texte de la memoire (xml, ou autre)

Message par Chris »

Effectivement, c'est étonnant :?

Essaie de faire un FillMemory(*MemoryID, MemorySize(*MemoryID)) pour remplir la zone mémoire de zéros.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: effacer du texte de la memoire (xml, ou autre)

Message par G-Rom »

tu remplis *memoryID avec n'importe quoi, des zéros par exemple.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: effacer du texte de la memoire (xml, ou autre)

Message par Backup »

c'est quoi ce code ? :roll:

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 :

Code : Tout sélectionner

FreeMemory(*MemoryID)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: effacer du texte de la memoire (xml, ou autre)

Message 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.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: effacer du texte de la memoire (xml, ou autre)

Message 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)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: effacer du texte de la memoire (xml, ou autre)

Message 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()).
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: effacer du texte de la memoire (xml, ou autre)

Message 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 :mrgreen:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: effacer du texte de la memoire (xml, ou autre)

Message 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...
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: effacer du texte de la memoire (xml, ou autre)

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

Code : Tout sélectionner

FillMemory(*MemoryID, MemorySize(*MemoryID))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: effacer du texte de la memoire (xml, ou autre)

Message 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...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: effacer du texte de la memoire (xml, ou autre)

Message 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 ..)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: effacer du texte de la memoire (xml, ou autre)

Message 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
Dernière modification par blendman le ven. 03/juin/2011 14:24, modifié 1 fois.
Répondre