Exe Informationen ändern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Exe Informationen ändern

Beitrag von Frabbing »

Willst du eine beliebige Exe mit neuen Versioninfos ausstatten oder deine eigene Compilierte?
Gruß, Frank
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Exe Informationen ändern

Beitrag von Lambda »

Eine die aus meinem Programm heraus erstellt wird, also eine andere. Aber der Source den ich gepostet hab funktioniert einfach nicht, alles versucht. :?
Benutzeravatar
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

Beitrag von ts-soft »

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.
Bild
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Exe Informationen ändern

Beitrag von Frabbing »

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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Exe Informationen ändern

Beitrag von Lambda »

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 :D )

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
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Exe Informationen ändern

Beitrag von Frabbing »

Liegt die originale Version-Resource denn auch als Sprache #LANG_ENGLISH | #SUBLANG_ENGLISH_US vor?
Gruß, Frank
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Exe Informationen ändern

Beitrag von Lambda »

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
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Exe Informationen ändern

Beitrag von Frabbing »

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.
Gruß, Frank
Antworten