Re: Exe Informationen ändern
Verfasst: 16.03.2012 20:57
Willst du eine beliebige Exe mit neuen Versioninfos ausstatten oder deine eigene Compilierte?
Code: Alles auswählen
;Dies Ist der Hauptquellcode um bestehende Versionsinfos in Executables zu aendern.
;Copyright (C) 2007 by Christian Seysen and Felix Kuberjans(C++)
;Website: http://www.desaster-games.com
#RT_VERSION = 16
Structure VS_VERSIONINFO
wLength.w
wValueLength.w
wType.w
szKey.w[16]
Padding1.w
Value.VS_FIXEDFILEINFO
Padding2.w
Children.w
EndStructure
Structure VarFileInfo
wLength.w;
wValueLength.w;
wType.w;
szKey.w[15];
Padding.w;
Children.w;
EndStructure
Structure StringFileInfo
CompanyName.s
Productname.s
ProductVersion.s
FileVersion.s
FileDescription.s
InternalName.s
OriginalFilename.s
LegalCopyright.s
Website.s
EndStructure
Procedure.w MAKELANGID(p.w, s.w)
ProcedureReturn (s << 10) | p
EndProcedure
Macro MAKEINTRESOURCE(I)
(I)
EndMacro
Procedure ErrorHandler(Error.s)
MessageRequester("ERROR",Error.s,#MB_OK | #MB_ICONEXCLAMATION)
EndProcedure
Procedure WriteStringFileInfo(pStringName.s,pValue.s,Buffer2.l,Coursor.l)
bPadding1.b
dwPadding2.l
dwStringNameLength = Len(pStringName);
dwValueLength = Len(pValue);
dwSize.w
If dwValueLength % 2 And Not dwStringNameLength % 2
bPadding1 = #False;
Else
bPadding1 = #True;
EndIf
dwSize=10+(dwStringNameLength + dwValueLength + bPadding1) * 2
dwPadding2 = dwSize % SizeOf(Long);
ReAllocateMemory(Buffer2,Coursor + dwSize + dwPadding2)
;1.laenge gesamt
PokeW(Buffer2+Coursor,dwSize) : Coursor=Coursor+2
;2.laenge inhaltslaenge
PokeW(Buffer2+Coursor,dwValueLength+1):Coursor=Coursor+2
;write a 1 ( 01 00)
PokeW(Buffer2+Coursor,1):Coursor=Coursor+2
;StringName
report1$=""
For StringName = 1 To dwStringNameLength
PokeW(Buffer2+Coursor,Asc(Mid(pStringName,StringName,1))):Coursor=Coursor+2
report1$=(report1$+Mid(pStringName,StringName,1))
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
If (bPadding1)
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
EndIf
;Value
report2$=""
For ValueName = 1 To dwValueLength
PokeW(Buffer2+Coursor,Asc(Mid(pValue,ValueName,1))):Coursor=Coursor+2
report2$=(report2$+Mid(pValue,ValueName,1))
Next
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
If (dwPadding2)
ZeroMemory_(Buffer2+Coursor,dwPadding2)
Coursor=Coursor+dwPadding2
EndIf
ProcedureReturn Coursor
EndProcedure
Procedure ChangeVersionData(pExe.s,*Information.StringFileInfo)
;Laden der Exe und kopieren der Resource in den Buffer1
hExe = LoadLibrary_(pExe);
If hExe = #Null
ErrorHandler("Could not load exe.");
Goto Except
EndIf
hRes = FindResource_(hExe, MAKEINTRESOURCE(#VS_VERSION_INFO), #RT_VERSION)
If hRes = #Null
ErrorHandler("Could not locate dialog box.");
Goto Except
EndIf
hResLoad = LoadResource_(hExe, hRes);
lsz=SizeofResource_(hExe, hRes)
If hResLoad = #Null
ErrorHandler("Could not load dialog box.");
Goto Except
EndIf
lpResLock = LockResource_(hResLoad);
If lpResLock = #Null
ErrorHandler("Could not lock dialog box.");
Goto Except
EndIf
Buffer1=AllocateMemory(lsz); pointer zu den resource Daten
MoveMemory(lpResLock, Buffer1, lsz)
;Erstelle Buffer2 fuer unsere neue Resource
Buffer2=AllocateMemory(152)
;#####Create VERSIONINFO#####
;public class Versionsinfo{
;#define SizeOfResource
PokeW(Buffer2,MemorySize(Buffer2))
;kopiere vorhandenes Matterial
For Coursor=2 To 90 Step 2
PokeW(Buffer2+Coursor,PeekW(Buffer1+Coursor))
Next Coursor
;einige Mathematische Vorkehrungen
;Laenge-160
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-160)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,34) : Coursor=Coursor+34
;Laenge-196
PokeW(Buffer2+Coursor,(MemorySize(Buffer2)-196)) : Coursor=Coursor+2
;Kopiere
CopyMemory(Buffer1+Coursor,Buffer2+Coursor,20) : Coursor=Coursor+20
;Null
PokeW(Buffer2+Coursor,0):Coursor=Coursor+2
;Schreibe die Informationen in die exe
Coursor=WriteStringFileInfo("CompanyName",*Information\CompanyName,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileDescription",*Information\FileDescription,Buffer2,Coursor)
Coursor=WriteStringFileInfo("FileVersion",*Information\FileVersion,Buffer2,Coursor)
Coursor=WriteStringFileInfo("InternalName",*Information\InternalName,Buffer2,Coursor)
Coursor=WriteStringFileInfo("LegalCopyright",*Information\LegalCopyright,Buffer2,Coursor)
Coursor=WriteStringFileInfo("OriginalFilename",*Information\OriginalFilename,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductName",*Information\Productname,Buffer2,Coursor)
Coursor=WriteStringFileInfo("ProductVersion",*Information\ProductVersion,Buffer2,Coursor)
;
ReAllocateMemory(Buffer2,Coursor+68)
CopyMemory(Buffer1+lsz-68,Buffer2+Coursor,68):Coursor=Coursor+68;68
;Laenge korrigieren
PokeW(Buffer2,MemorySize(Buffer2))
PokeW(Buffer2+92,(MemorySize(Buffer2)-160))
PokeW(Buffer2+128,(MemorySize(Buffer2)-196))
;#####Finished neue Resource#####
FreeResource_(hResLoad)
GetModuleFileName_(hExe,pExe,#MAX_PATH)
FreeLibrary_(hExe)
;Beginne mit dem schreiben der Versionsinfos
hUpdateRes = BeginUpdateResource_(pExe, #False);
If hUpdateRes = #Null
ErrorHandler("Could not open file for writing.");
Goto Except
EndIf
If Not UpdateResource_(hUpdateRes, #RT_VERSION, MAKEINTRESOURCE(#VS_VERSION_INFO), MAKELANGID(#LANG_ENGLISH, #SUBLANG_ENGLISH_US), Buffer2, MemorySize(Buffer2))
ErrorHandler("Could not add resource.");
Goto Except
EndIf
If Not EndUpdateResource_(hUpdateRes, #False)
ErrorHandler("Could not write changes to file.");
Goto Except
EndIf
;Wenn alles geklappt hat bekommen wir die Groesse in Bytes zurueck
ProcedureReturn Coursor
;Andernfalls -1
Except:
ProcedureReturn -1
EndProcedure
;Und nun testen wir es:
NewFileversion.StringFileInfo
NewFileversion\CompanyName="Test Company"
NewFileversion\Productname="Test Productname"
NewFileversion\ProductVersion="Test ProductVersion"
NewFileversion\FileVersion="Test FileVersion"
NewFileversion\FileDescription="Test FileDescription"
NewFileversion\InternalName="Test InternalName"
NewFileversion\OriginalFilename="Test OriginalFilename"
NewFileversion\LegalCopyright="Test LegalCopyright"
NewFileversion\Website="Test Website"
CopyFile("C:\old.exe","C:\Test.exe")
change=ChangeVersionData("C:\Test.exe",NewFileversion)
If change
MessageRequester("Info","Suchsess")
Else
MessageRequester("Info","Failed")
EndIf