Exe Informationen ändern
Re: Exe Informationen ändern
Willst du eine beliebige Exe mit neuen Versioninfos ausstatten oder deine eigene Compilierte?
Gruß, Frank
Re: Exe Informationen ändern
Eine die aus meinem Programm heraus erstellt wird, also eine andere. Aber der Source den ich gepostet hab funktioniert einfach nicht, alles versucht. 
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Exe Informationen ändern
Deine Stubs.exe sollte bereits eine Versionsinfo enthalten, dann funktioniert es auch!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Exe Informationen ändern
Also der LoadLibrary-Kram ist schonmal verkehrt, wenn die Versioninfo nicht vorhanden ist. In dem Fall einfach nur BeginUpdateResource - UpdateResource - EndUpdateResource, vielleicht mit einer externen XML-Datei. UpdateResource kann zwischen Begin und End aber mehrmals aufgerufen werden. Der zweite Parameter von EndUpdateResource sollte #False sein.
Gruß, Frank
Re: Exe Informationen ändern
die Informationen sind vorhanden + Adminrechte. Bekomm auch die Nachricht "Success" nur hat es die exe absolut nicht verändert. (auch nicht zerstört.. was ich schon als Erfolg betrachten würde
)
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")
EndIfRe: Exe Informationen ändern
Liegt die originale Version-Resource denn auch als Sprache #LANG_ENGLISH | #SUBLANG_ENGLISH_US vor?
Gruß, Frank
Re: Exe Informationen ändern
soso.. ^^ das bedeutet aber das die Angabe der Sprache immer auf Englisch steht. Und den AdminModus wird man ja auch nicht umgehen können..
edit: die FileVersion funktioniert leider nicht
edit: die FileVersion funktioniert leider nicht
Re: Exe Informationen ändern
Ich mach es in meinem Editor so, dass ich eine kompilierte Resourcendatei (.res) analysiere und mit UpdateResource die einzelnen Resourcen nacheinander einbaue, was ohne Probleme funktioniert. Auch Resourcendateien in Textform (.rc) lassen sich damit problemlos einbauen, wenn ich sie per GORC vorher nach .res kompiliere. Mit Resourcen aus einer Exe hab ichs nie probiert.
Der Adminstatus wird keine Rolle spielen, mein Editor läuft auch "nur" im Usermodus, trotzdem gehts.
Code ist leider stark integriert, sodass ich dir kein Beispiel posten kann.
Der Adminstatus wird keine Rolle spielen, mein Editor läuft auch "nur" im Usermodus, trotzdem gehts.
Code ist leider stark integriert, sodass ich dir kein Beispiel posten kann.
Gruß, Frank