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:\WatchNow\test.exe","C:\Test.exe")
change=ChangeVersionData("C:\Test.exe",NewFileversion)
If change
MessageRequester("Info","Suchsess")
Else
MessageRequester("Info","Failed")
EndIf
Code: Alles auswählen
1 VERSIONINFO
FILEVERSION 6,0,6000,16549
PRODUCTVERSION 6,0,6000,16549
FILEOS 0x40004
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "040904B0"
{
VALUE "CompanyName", "Test Company"
VALUE "FileDescription", "Test FileDescription"
VALUE "FileVersion", "Test FileVersion"
VALUE "InternalName", "Test InternalName"
VALUE "LegalCopyright", "Test LegalCopyright"
VALUE "OriginalFilename", "Test OriginalFilename"
VALUE "ProductName", "Test Productname"
VALUE "ProductVersion", "Test ProductVersion"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0409 0x04B0
}
}