avec l'ajout d'une taille , d'un offset & d'un terminator pour détecté la présence d'une source ou pas :ChrisR a écrit : G-Rom as-tu un petit exemple "simple" pour la lecture des lignes de la zone Data à interpréter ?
Pour comparaison avec l'exemple de zorro et le read de la SectionData.
Code : Tout sélectionner
#TERMINATOR = 65355
Procedure SelfAppend(File.s, Destination.s)
; quel est l'exe courant ?
*buffer = AllocateMemory(4096)
If *buffer
PathSize = GetModuleFileName_(#Null, *buffer, #MAX_PATH + 1)
Exe$ = PeekS(*buffer,PathSize)
FreeMemory(*buffer)
Else
ProcedureReturn -1
EndIf
If ReadFile(0,Exe$)
*selfBuffer = AllocateMemory(Lof(0))
If *selfBuffer
; on copie l'exe en mémoire
ReadData(0,*selfBuffer,Lof(0))
CloseFile(0)
; on lis le fichier source a rajouté
If ReadFile(0,File)
*fileBuffer = AllocateMemory(Lof(0))
If *fileBuffer
ReadData(0,*fileBuffer,Lof(0))
CloseFile(0)
finalSize = MemorySize(*selfBuffer) + MemorySize(*fileBuffer) + 12
*finalBuffer = AllocateMemory(finalSize)
CopyMemory(*selfBuffer,*finalBuffer,MemorySize(*selfBuffer))
CopyMemory(*fileBuffer,*finalBuffer + MemorySize(*selfBuffer), MemorySize(*fileBuffer))
PokeL(*finalBuffer + finalSize - 12 , MemorySize(*selfBuffer)) ; write offset
PokeL(*finalBuffer + finalSize - 8 , MemorySize(*fileBuffer)) ; write size
PokeL(*finalBuffer + finalSize - 4 , #TERMINATOR) ; write terminator
FreeMemory(*selfBuffer)
FreeMemory(*fileBuffer)
CreateFile(0,Destination)
WriteData(0,*finalBuffer,finalSize)
CloseFile(0)
FreeMemory(*finalBuffer)
Debug "!"
Else
ProcedureReturn -1
EndIf
Else
ProcedureReturn -2
EndIf
Else
ProcedureReturn -1
EndIf
Else
ProcedureReturn -2
EndIf
EndProcedure
Procedure.l GrabContent()
; quel est l'exe courant ?
*buffer = AllocateMemory(4096)
If *buffer
PathSize = GetModuleFileName_(#Null, *buffer, #MAX_PATH + 1)
Exe$ = PeekS(*buffer,PathSize)
FreeMemory(*buffer)
Else
ProcedureReturn -1
EndIf
If ReadFile(0,Exe$)
*selfBuffer = AllocateMemory(Lof(0))
If *selfBuffer
; on copie l'exe en mémoire
ReadData(0,*selfBuffer,Lof(0))
CloseFile(0)
check = PeekL(*selfBuffer+MemorySize(*selfBuffer)-4)
If check <> #TERMINATOR
ProcedureReturn 0
Else
size = PeekL(*selfBuffer+MemorySize(*selfBuffer)-8)
offset = PeekL(*selfBuffer+MemorySize(*selfBuffer)-12)
*data = AllocateMemory(size)
CopyMemory(*selfBuffer+offset,*data,size)
FreeMemory(*selfBuffer)
ProcedureReturn *data
EndIf
EndIf
EndIf
EndProcedure
*data = GrabContent()
If *data = 0
MessageRequester("Attention !","L'executable est vide ! veuillez choisir un fichier à mettre dedans !")
SelfAppend(#PB_Compiler_File, GetPathPart(#PB_Compiler_File)+"Concat.exe")
Else
MessageRequester("Attention !" , "L'executable contient des données")
OpenWindow(0,0,0,640,480,Str(MemorySize(*data)))
EditorGadget(0,0,0,640,480)
string$ = PeekS(*data,MemorySize(*data),#PB_Ascii)
SetGadgetText(0,string$)
While #True
Repeat
event = WindowEvent()
If event = #PB_Event_CloseWindow
End
EndIf
Until event = 0
Wend
EndIf