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

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 ?
j'arrive pas à voir à quoi cela pourrait servir. il y a peut-être une autre solution...

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é

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
