Page 1 sur 2

Runprogram directement dans la mémoire

Publié : ven. 28/mai/2004 17:31
par julien
Salut,

Je me demandai comment exécuter directement dans la mémoire un fichier inclus dans l'exe avec la commande includebinary ? (donc sans l'extraire et l'enregistrer sur le HD puis l'exécuter)

Publié : ven. 28/mai/2004 19:02
par Paneric
Je pense que le code est :

Code : Tout sélectionner

!Jsr l_prg

end

Datasection
prg:
includebinary "monprg.exe"
enddatasection
Paneric

Publié : ven. 28/mai/2004 19:54
par julien
Erreur -> Error Illegal instruction [78]

Publié : ven. 28/mai/2004 20:59
par Chris
Tu peux peut-être réserver une zone avec AllocateMemory(), puis créer ton fichier dans ce buffer!

Par contre, pour le lancer, je ne sais pas si ça peut fonctionner. J'ai pas testé, parce que j'arrive pas à utiliser IncludeFile avec un exe.
Ca plante à chaque fois, même en essayant de créer le fichier dans un répertoire.

J'ai fait ce code qui a l'air correct, le fichier est bien créé, la valeur retournée correspond bien à la taille réelle du fichier, et le fichier créé fonctionne parfaitement.

Code : Tout sélectionner

If CreateFile(1, "Notepad.exe")
  WriteData(?StartFile, ?EndFile - ?StartFile)
  CloseFile(1)
EndIf

MessageRequester("Taille du fichier",Str(?EndFile-?StartFile)+" octets")

StartFile:
IncludeBinary "Notepad.exe"
EndFile:
Mais j'ai un message d'erreur de Windows.

Quelqu'un peut-il le compiler et tester pour voir si c'est pareil chez vous.

J'ai PB 3.90

Chris :)

Publié : ven. 28/mai/2004 21:34
par Backup
Paneric a écrit :Je pense que le code est :

Code : Tout sélectionner

!Jsr l_prg

end

Datasection
prg:
includebinary "monprg.exe"
enddatasection
Paneric
heu j'y connais pas trop en assembleur mais sur pc
c'est pas la fonction CALL au lieu de JSR ???
8O

Publié : ven. 28/mai/2004 21:38
par julien
ok ça fonctionne mais le fichier est céér sur le disque dur...
Mais pour l'exécuter directement en mémoire sans ecrire le fichier sur le disque dur.... je ne sais pas comment faire... peut être voir dans les API avec la commande CreateProcess_() qui peut être une piste

Publié : ven. 28/mai/2004 21:46
par Le Soldat Inconnu
quel est l'intéret de la chose ? :roll:
j'arrive pas à voir à quoi cela pourrait servir. il y a peut-être une autre solution... :D

Publié : sam. 29/mai/2004 8:18
par julien
A apprendre, et a exécuter un exe comprésser directement dans la mémoire sans accés au disque dur.

Publié : sam. 29/mai/2004 9:51
par Le Soldat Inconnu
à OK, je cherche trop compliqué :oops:

Publié : sam. 29/mai/2004 9:53
par julien
j'ai sufer sur plusieur forum (vbfrance...) et la question est souvent abordé mais reste sans réponse... :(

Publié : sam. 29/mai/2004 18:44
par Backup
t'a essaye de faire comme paneric

mais avec un !call ala place de son !Jsr

comme ça

Code : Tout sélectionner

!Call l_prg

end

Datasection
prg:
includebinary "monprg.exe"
enddatasection 

Publié : sam. 29/mai/2004 20:21
par julien
Dobro a écrit :t'a essaye de faire comme paneric
Oui est ça donne rien, c'est pas l'équivalent d'un goto en PB ?

Publié : dim. 30/mai/2004 1:34
par Backup
ben plutot a un "gosub"

en pure :

gosub titi

titi:
jjjj
jjjj
jjjj
return

en assembleur

call nom_de_ la_ procedure


nom_de_ la_ procedure Proc NEAR
jjjj
jjjj
jjjj
nom_de_ la_ procedure Proc ENDP


enfin je crois :)

Publié : dim. 30/mai/2004 11:04
par Le Soldat Inconnu
je pense que le plus proche de ce que tu cherches est le thread.

sinon, je ne voit que copier l'exe qui est en include sur le disque dur pour l'exécuter puis l'effacer après :?

Publié : dim. 30/mai/2004 11:24
par Chris
Il y a peut-être une autre solution, c'est de créer un RamDisk, (un disque virtuel), mais comment ? : Aucune idée!

A mon avis, ça paraît bien compliqué pour, finalement, peu d'utilité :?

Le plus simple reste quand même de créer le fichier sur le disque, et de le supprimer quand il ne sert plus.

Un truc dans ce genre :

Code : Tout sélectionner

;- Extrait le fichier à executer, et le recrée sur le disque
If CreateFile(1, "Notepad.exe")
  WriteData(?StartFile, ?EndFile - ?StartFile)
  CloseFile(1)
EndIf

;- Lance le fichier, et attends qu'il se termine
While RunProgram("Notepad.exe","","",1)<= 0 : Wend

;- Efface le fichier du disque, et termine
DeleteFile("Notepad.exe")
End

;- Le fichier à executer est inclus à la compilation
DataSection
StartFile:
IncludeBinary "Notepad.exe"
EndFile:
EndDataSection
Chris :)