GameFixer
GameFixer
I have a first working version of my new project.
It's a compatiblity tool that fixes problems with 32 bit windows games, makes them run on newer windows systems.
It's designed to be integrated in other software like application launchers. So it comes without a GUI, just a console app you need to configure by command line parameters.
Everyone can expand it by developing plugins. Actualy the core itself does nothing else than offer functionality for plugins. Currently the core exports a very reliable procedure hooking system enabling you to hook StdCall procedures, like Win32 API. Other calling conventions like FastCall will be supported in the future. It also exports a working disassembler (BeaEngine), because the one in PB just not works reliable. It's the cheetah version that dont constructs a text string of the disassembled instruction but its very fast and perfect to use for automatic code analysis. It's used by the procedure hooking system.
Next functionalty i will implement is DirectDraw hooking.
This first release comes with just one plugin: MemoryFix
It hooks GlobalMemoryStatus to make games running that calculate free memory wrong or just refuse to run if the page file is deactivated.
One game i tested it with is Battle Isle 3 and yes it runs it under Win 7 x64.
I have a lot of ideas for core functionalities and plugins there will be upcoming some more generic plugins and some plugins for specific games but i guess the project will live from other people making plugins. If you are interessted about making a plugin: I will open up the plugin interface with the next version and will post some examples to use it. It's perfect for people that allways was been interessted in that kind of stuff but be scared off by DLL injection and hooking. Thats the good thing about the GameFixer, it will take care about all that complicated stuff for you.
So finaly: How to use it
It's a console program, you tell it what to do via command line parameters, it launches the game and does the magic.
Syntax: GameFixer.exe Game.exe [-Params Gameparameters] [-DontAsk] [-Silent] [-Auto] [-Update] [-Plugin1 Config] [-Plugin2 Config]
Game.exe
The game you want to launch with complete path.
If the path includes spaces enclose it in double quotes.
-Params or -p
Specifies that you want to get a parameter line to the game. The parameter line comes after a space.
If it includes spaces enclose it in double quotes. If it includes double quotes replace them with /#DQ/.
-DontAsk or -da
Activates the DontAsk mode.
That means the GameFixer will not wait for user input or offers any decision possiblities to the user.
-Silent or -s
Activates the Silent mode.
That means the GameFixer will not output anything it even will not open the console.
If Silent mode is active, DontAsk mode is automaticly active as well.
-Auto or -a
Tells the GameFixer to configure itself, decide what plugins to use, etc.
Not implemented just yet!
-Update or -u
Does a online update.
Not implemented just yet!
-Plugin
Loads and configures a plugin.
Replace Plugin with the name of the plugin.
The config line comes after a space. If the config line includes spaces enclose it in double quotes.
You can specify any number of plugins.
MemoryFix Plugin
I dont think i need to write much about that on a coder board. It's just a hook on GlobalMemoryStatus that changes the values of the members of the MEMORYSTATUS structure.
Specify in the config line which members of the MEMORYSTATUS structure you want to change.
Syntax: Name=Value
Names: MemoryLoad, TotalPhys, AvailPhys, TotalPageFile, AvailPageFile, TotalVirtual, AvailVirtual
Example for Battle Isle 3:
GameFixer.exe C:\Games\BI3\BIN\SDI_1C.EXE -MemoryFix "TotalPageFile=67108864 AvailPageFile=67108864"
Download: GameFixer v0.03 (107KB)
Download: GameFixer SDK v0.03 (18KB)
It's a compatiblity tool that fixes problems with 32 bit windows games, makes them run on newer windows systems.
It's designed to be integrated in other software like application launchers. So it comes without a GUI, just a console app you need to configure by command line parameters.
Everyone can expand it by developing plugins. Actualy the core itself does nothing else than offer functionality for plugins. Currently the core exports a very reliable procedure hooking system enabling you to hook StdCall procedures, like Win32 API. Other calling conventions like FastCall will be supported in the future. It also exports a working disassembler (BeaEngine), because the one in PB just not works reliable. It's the cheetah version that dont constructs a text string of the disassembled instruction but its very fast and perfect to use for automatic code analysis. It's used by the procedure hooking system.
Next functionalty i will implement is DirectDraw hooking.
This first release comes with just one plugin: MemoryFix
It hooks GlobalMemoryStatus to make games running that calculate free memory wrong or just refuse to run if the page file is deactivated.
One game i tested it with is Battle Isle 3 and yes it runs it under Win 7 x64.
I have a lot of ideas for core functionalities and plugins there will be upcoming some more generic plugins and some plugins for specific games but i guess the project will live from other people making plugins. If you are interessted about making a plugin: I will open up the plugin interface with the next version and will post some examples to use it. It's perfect for people that allways was been interessted in that kind of stuff but be scared off by DLL injection and hooking. Thats the good thing about the GameFixer, it will take care about all that complicated stuff for you.
So finaly: How to use it
It's a console program, you tell it what to do via command line parameters, it launches the game and does the magic.
Syntax: GameFixer.exe Game.exe [-Params Gameparameters] [-DontAsk] [-Silent] [-Auto] [-Update] [-Plugin1 Config] [-Plugin2 Config]
Game.exe
The game you want to launch with complete path.
If the path includes spaces enclose it in double quotes.
-Params or -p
Specifies that you want to get a parameter line to the game. The parameter line comes after a space.
If it includes spaces enclose it in double quotes. If it includes double quotes replace them with /#DQ/.
-DontAsk or -da
Activates the DontAsk mode.
That means the GameFixer will not wait for user input or offers any decision possiblities to the user.
-Silent or -s
Activates the Silent mode.
That means the GameFixer will not output anything it even will not open the console.
If Silent mode is active, DontAsk mode is automaticly active as well.
-Auto or -a
Tells the GameFixer to configure itself, decide what plugins to use, etc.
Not implemented just yet!
-Update or -u
Does a online update.
Not implemented just yet!
-Plugin
Loads and configures a plugin.
Replace Plugin with the name of the plugin.
The config line comes after a space. If the config line includes spaces enclose it in double quotes.
You can specify any number of plugins.
MemoryFix Plugin
I dont think i need to write much about that on a coder board. It's just a hook on GlobalMemoryStatus that changes the values of the members of the MEMORYSTATUS structure.
Specify in the config line which members of the MEMORYSTATUS structure you want to change.
Syntax: Name=Value
Names: MemoryLoad, TotalPhys, AvailPhys, TotalPageFile, AvailPageFile, TotalVirtual, AvailVirtual
Example for Battle Isle 3:
GameFixer.exe C:\Games\BI3\BIN\SDI_1C.EXE -MemoryFix "TotalPageFile=67108864 AvailPageFile=67108864"
Download: GameFixer v0.03 (107KB)
Download: GameFixer SDK v0.03 (18KB)
Last edited by Thorium on Sat Jun 30, 2012 5:10 pm, edited 2 times in total.
Re: GameFixer
I decided to open up the plugin interface just now.
This is because i decided to not change anything on the plugin interface in the next versions. There will be changes to the plugin format, which will need you to include some data into the plugin file but the interface itself will not change.
So i decided to open it up in case someone wants to play with it.
It's very simple, so anyone can use it, you dont need to be a expert coder. It can be used with any programming language that can compile a standard DLL.
A GameFixer plugin is a standard DLL (StdCall convention), which is renamed to *.gfp.
On how to import functionality from the GameFixer core and what procedures have to be exported by your plugin just take a look at the "Plugin Template.pb", it's all explaint in there.
To use your plugin, just copy it into the Plugins folder and use the -Plugin command line parameter explaint in the first post. Specify the plugin name without the .gfp expansion.
The SDK also contains the commented source code of the MemoryFix plugin as a example.
At the moment the SDK is nothing more than a template code, a example, a include for BeaEngine and the files needed to import the "GameFixer Core.dll".
At the moment nothing more is need. For the data needed to be included in plugins in later version, there will be a tool for that included in the SDK.
To show you how simple it is to make a plugin i just post here the MemoryFix example code, so you dont need to download it, if you are just curious.
For more detailed explanations and a complete list of "GameFixer Core.lib" imports take a look at "Plugin Template.pb" included in the SDK.
This is because i decided to not change anything on the plugin interface in the next versions. There will be changes to the plugin format, which will need you to include some data into the plugin file but the interface itself will not change.
So i decided to open it up in case someone wants to play with it.
It's very simple, so anyone can use it, you dont need to be a expert coder. It can be used with any programming language that can compile a standard DLL.
A GameFixer plugin is a standard DLL (StdCall convention), which is renamed to *.gfp.
On how to import functionality from the GameFixer core and what procedures have to be exported by your plugin just take a look at the "Plugin Template.pb", it's all explaint in there.
To use your plugin, just copy it into the Plugins folder and use the -Plugin command line parameter explaint in the first post. Specify the plugin name without the .gfp expansion.
The SDK also contains the commented source code of the MemoryFix plugin as a example.
At the moment the SDK is nothing more than a template code, a example, a include for BeaEngine and the files needed to import the "GameFixer Core.dll".
At the moment nothing more is need. For the data needed to be included in plugins in later version, there will be a tool for that included in the SDK.
To show you how simple it is to make a plugin i just post here the MemoryFix example code, so you dont need to download it, if you are just curious.
For more detailed explanations and a complete list of "GameFixer Core.lib" imports take a look at "Plugin Template.pb" included in the SDK.
Code: Select all
;/-------------------\
;| GameFixer Plugin |
;| Memory Fix |
;| |
;| Version 0.01 |
;| Date: 30.04.2012 |
;| PureBasic 4.60 |
;| |
;| by Thorium |
;\-------------------/
EnableExplicit
;Import all what we need from the GameFixer core.
Import "GameFixer Core.lib"
UninstallStdProcHook(HookId.i)
GetOrigStdProcAddr.i(HookId.i)
InstallWin32ApiHook.i(DllName.s, ProcName.s, HookProcAddr.i)
EndImport
;We need this prototype to call GlobalMemoryStatus after we hooked it.
Prototype Proto_GlobalMemoryStatus(*lpBuffer.MEMORYSTATUS)
Global GlobalMemoryStatus.Proto_GlobalMemoryStatus
;Variable for the hook ID of the GlobalMemoryStatus hook.
Global GlobalMemoryStatusHookId.i
;Variables to hold the values we want to change inside the MEMORYSTATUS
;structure returned by GlobalMemoryStatus.
;-1 means dont change it.
Global MemoryLoad.i = -1
Global TotalPhys.i = -1
Global AvailPhys.i = -1
Global TotalPageFile.i = -1
Global AvailPageFile.i = -1
Global TotalVirtual.i = -1
Global AvailVirtual.i = -1
;This procedure is called if the plugin DLL is first loaded.
ProcedureDLL AttachProcess(Instance.i)
;We do nothing here.
;It's not needed to include this procedure.
EndProcedure
;This procedure is called if the plugin DLL unloads.
ProcedureDLL DetachProcess(Instance.i)
;If our plugin unloads we need to uninstall the hook on GlobalMemoryStatus,
;or the game will crash if it calls it again.
UninstallStdProcHook(GlobalMemoryStatusHookId)
EndProcedure
;We redirect all calls to GlobalMemoryStatus to this procedure.
Procedure GlobalMemoryStatusHook(*lpBuffer.MEMORYSTATUS)
;We call the original GlobalMemoryStatus procedure,
;to get the real values of the members in the MEMORYSTATUS structure.
GlobalMemoryStatus(*lpBuffer)
;Change them if the user wants to.
If MemoryLoad <> -1
*lpBuffer\dwMemoryLoad = MemoryLoad
EndIf
If TotalPhys <> -1
*lpBuffer\dwTotalPhys = TotalPhys
EndIf
If AvailPhys <> -1
*lpBuffer\dwAvailPhys = AvailPhys
EndIf
If TotalPageFile <> -1
*lpBuffer\dwTotalPageFile = TotalPageFile
EndIf
If AvailPageFile <> -1
*lpBuffer\dwAvailPageFile = AvailPageFile
EndIf
If TotalVirtual <> -1
*lpBuffer\dwTotalVirtual = TotalVirtual
EndIf
If AvailVirtual <> -1
*lpBuffer\dwAvailVirtual = AvailVirtual
EndIf
;The GlobalMemoryStatus function does not return anything,
;so we dont need to also.
EndProcedure
;This procedure is called by the GameFixer core to configure the plugin.
ProcedureDLL.i Config(Config.s)
Protected i.i
Protected Setting.s
Protected Value.i
;We are parsing the config line in Config.s
;to know what members of the MEMORYSTATUS structure
;the user wants to change and to what values.
For i = 1 To 100
Setting = StringField(Config, i, " ")
If Setting = ""
Break
EndIf
Value = Val(StringField(Setting, 2, "="))
Select LCase(StringField(Setting, 1, "="))
Case "memoryload", "ml"
MemoryLoad = Value
Case "totalphys", "tp"
TotalPhys = Value
Case "availphys", "ap"
AvailPhys = Value
Case "totalpagefile", "tpf"
TotalPageFile = Value
Case "availpagefile", "apf"
AvailPageFile = Value
Case "totalvirtual", "tv"
TotalVirtual = Value
Case "availvirtual", "av"
AvailVirtual = Value
EndSelect
Next
;Now we are installing a hook on GlobalMemoryStatus,
;so we can change the values of the MEMORYSTATUS
;every time the game calls GlobalMemoryStatus.
;The hook will redirect every call from GlobalMemoryStatus
;to our own procedure: GlobalMemoryStatusHook
GlobalMemoryStatusHookId = InstallWin32ApiHook("Kernel32.dll", "GlobalMemoryStatus", @GlobalMemoryStatusHook())
If GlobalMemoryStatusHookId = 0
;The hooking failed, so we tell the GameFixer core that our plugin failed by returning #False.
ProcedureReturn #False
EndIf
;We need to get a new address to call the original GlobalMemoryStatus procedure,
;without getting redirected to GlobalMemoryStatusHook.
;For easy calling later, we use a prototype here.
GlobalMemoryStatus = GetOrigStdProcAddr(GlobalMemoryStatusHookId)
;We return #True to tell the GameFixer core that all wend fine.
ProcedureReturn #True
EndProcedure
Last edited by Thorium on Fri Jun 29, 2012 11:59 am, edited 1 time in total.
-
- 666
- Posts: 1033
- Joined: Mon Sep 01, 2003 2:33 pm
Re: GameFixer
Very interesting stuff Thorium, Thank you
Re: GameFixer
Just working on the DirectDraw hooking system and it's actualy quite confusing.
If i want to support all DirectDraw versions, there are 3 ways the DirectDraw object can be created and there is no way to tell the version of DirectDraw that the game uses before it creates a surface object. Well if it uses DirectDrawCreateEx, it's DirectDraw7 for sure. But it's also valid to create the DirectDraw7 object with DirectDrawCreate. DirectDraw3 does not have it's own interface version, so you can only tell if it's used if a DirectDrawSurface3 object is created.
So the hooking system cant tell the plugin what DirectDraw version is used before a surface is created. This is no problem if your plugin is going to support just one version of DirectDraw. But if it needs to support all of them it's not easy to design a simple to use system for that.
If i want to support all DirectDraw versions, there are 3 ways the DirectDraw object can be created and there is no way to tell the version of DirectDraw that the game uses before it creates a surface object. Well if it uses DirectDrawCreateEx, it's DirectDraw7 for sure. But it's also valid to create the DirectDraw7 object with DirectDrawCreate. DirectDraw3 does not have it's own interface version, so you can only tell if it's used if a DirectDrawSurface3 object is created.
So the hooking system cant tell the plugin what DirectDraw version is used before a surface is created. This is no problem if your plugin is going to support just one version of DirectDraw. But if it needs to support all of them it's not easy to design a simple to use system for that.
Re: GameFixer
This week i will release version 0.02, which will introduce easy to use DirectDraw hooking and some small changes.
However there are 2 updates on the project available right now.
1st: There is a new small plugin which makes it possible to block all network accesses of a game.
You can also just use your firewall for that. But it was a request by a user. He wants to include the GameFixer into alternative game installers he makes for old games and he wanted a easy way to block games from accessing the internet.
This plugin is called NetBlock and does not need any configuration other than specifing it to load via "-NetBlock".
Right now it is only available on the online update.
2nd: The online updater is available: Download
Unpack the contents of the .zip to the GameFixer folder, keep the folder structure as it is in the .zip.
Using the updater:
If you run Updater.exe without any parameters it will check for new versions and asks if you want to update.
The following parameters are available (will be inherited from GameFixer.exe on version 0.02 and higher):
-DontAsk or -da
Activates the DontAsk mode.
That means the updater will not wait for user input or offers any decision possiblities to the user.
-Silent or -s
Activates the Silent mode.
That means the updater will not output anything, it even will not open the console.
If Silent mode is active, DontAsk mode is automaticly active as well.
-Force or -f
Forces an update, even if your installed versions are up to date.
This is usefull for testing purposes. It also "repairs" damaged installation (if files are missing).
-OnlyDownload or -od
Downloads updates but dont applys them.
The updates will be saved to the Update folder and can be applied later or copied to another GameFixer installation that has no internet connection.
-OnlyApply or -oa
Applys all updates present in the Update folder.
Does not connect to a server and does not check for new versions.
-Server ServerName or -svr ServerName
Specifys the first server the updater is going to connect to.
The server does not need to be present on the UpdateServer.lst.
-SingleServer or -ss
Forces the updater to only connect to one server. If that fails the update fails.
There is a file called UpdateServer.lst in the System folder of the GameFixer folder. This file contains a list of update servers. The updater will randomly select one of the servers to connect to. If the connection fails it will select the next server from the list, and so on.
Currently there is only one server. This feature is allready working but for future use to distribute server load over a number of servers. It will only be used if the project gets realy successfull.
I do include user made plugins into the online update. Just contact me if you want to get your plugin to the online update.
Updates can have any number of files and folders, are LZMA compressed and have the file extension .gfu."
However there are 2 updates on the project available right now.
1st: There is a new small plugin which makes it possible to block all network accesses of a game.
You can also just use your firewall for that. But it was a request by a user. He wants to include the GameFixer into alternative game installers he makes for old games and he wanted a easy way to block games from accessing the internet.
This plugin is called NetBlock and does not need any configuration other than specifing it to load via "-NetBlock".
Right now it is only available on the online update.
2nd: The online updater is available: Download
Unpack the contents of the .zip to the GameFixer folder, keep the folder structure as it is in the .zip.
Using the updater:
If you run Updater.exe without any parameters it will check for new versions and asks if you want to update.
The following parameters are available (will be inherited from GameFixer.exe on version 0.02 and higher):
-DontAsk or -da
Activates the DontAsk mode.
That means the updater will not wait for user input or offers any decision possiblities to the user.
-Silent or -s
Activates the Silent mode.
That means the updater will not output anything, it even will not open the console.
If Silent mode is active, DontAsk mode is automaticly active as well.
-Force or -f
Forces an update, even if your installed versions are up to date.
This is usefull for testing purposes. It also "repairs" damaged installation (if files are missing).
-OnlyDownload or -od
Downloads updates but dont applys them.
The updates will be saved to the Update folder and can be applied later or copied to another GameFixer installation that has no internet connection.
-OnlyApply or -oa
Applys all updates present in the Update folder.
Does not connect to a server and does not check for new versions.
-Server ServerName or -svr ServerName
Specifys the first server the updater is going to connect to.
The server does not need to be present on the UpdateServer.lst.
-SingleServer or -ss
Forces the updater to only connect to one server. If that fails the update fails.
There is a file called UpdateServer.lst in the System folder of the GameFixer folder. This file contains a list of update servers. The updater will randomly select one of the servers to connect to. If the connection fails it will select the next server from the list, and so on.
Currently there is only one server. This feature is allready working but for future use to distribute server load over a number of servers. It will only be used if the project gets realy successfull.
I do include user made plugins into the online update. Just contact me if you want to get your plugin to the online update.
Updates can have any number of files and folders, are LZMA compressed and have the file extension .gfu."
Re: GameFixer
There is an update for the NetBlock plugin available.
NetBlock Changelog
v0.02
-fixed: On some games the blocking didnt worked.
NetBlock Changelog
v0.02
-fixed: On some games the blocking didnt worked.
Re: GameFixer
New version is available on the online update.
Changelog GameFixer
v0.02
v0.01
Example for using MaxFPS (limiting FPS to 30): GameFixer.exe c:\Games\Test.exe -MaxFPS 30
I will work on a new SDK with a DirectDraw hooking example tomorrow.
Changelog GameFixer
v0.02
- added: DirectDraw hooking
- added: The updater now can be launched through GameFixer.exe by using the command line parameter -Update or -u.
- added: GameFixer will now check the .exe for it's format. This can be disabled by using -DontCheckExe or -dce.
- initial release
v0.01
- initial release
Example for using MaxFPS (limiting FPS to 30): GameFixer.exe c:\Games\Test.exe -MaxFPS 30
I will work on a new SDK with a DirectDraw hooking example tomorrow.
Re: GameFixer
The GameFixer v0.02 SDK is now available: GameFixer SDK v0.02 (11KB)
Also a new complete .zip package with the updater and all available plugins can be downloaded GameFixer v0.02 (109KB)
The v0.02 SDK contains the MaxFPS plugin source as example to use the DirectDraw hooking.
For details on the DirectDraw hooking take a look on the "Plugin Template.pb", it's all explaint in there.
And as i did with the MemoryFix Plugin, here is the source of the MaxFPS plugin right on the forum, for people that are just curious how it works.
Also a new complete .zip package with the updater and all available plugins can be downloaded GameFixer v0.02 (109KB)
The v0.02 SDK contains the MaxFPS plugin source as example to use the DirectDraw hooking.
For details on the DirectDraw hooking take a look on the "Plugin Template.pb", it's all explaint in there.
And as i did with the MemoryFix Plugin, here is the source of the MaxFPS plugin right on the forum, for people that are just curious how it works.
Code: Select all
;/-------------------\
;| GameFixer Plugin |
;| MaxFPS |
;| |
;| Version 0.01 |
;| Date: 29.06.2012 |
;| PureBasic 4.60 |
;| |
;| by Thorium |
;\-------------------/
EnableExplicit
;Contains constants we need for the DirectDraw hooking.
XIncludeFile "GameFixer DirectDraw Hook.pbi"
;Import all what we need from the GameFixer core.
Import "GameFixer Core.lib"
UninstallStdProcHook(HookId.i)
GetOrigStdProcAddr.i(HookId.i)
InstallDDrawHook.i(*Callback)
UninstallDDrawHook(DDrawHookId.i)
InstallDDrawProcHook(*Object, MethodeIndex.i, HookProcAddr.i)
EndImport
;We want to hook the Flip procedure and need a prototype
;to call the original procedure after it is hooked.
Prototype Proto_Flip(*this, *lpDDSurfaceTargetOverride, dwFlags.i)
Global Flip.Proto_Flip
;Holds the hook ID of the DirectDraw hook.
Global DDrawHookId.i
;Holds the hook ID of the Flip procedure hook.
Global FlipHookId.i
;Holds the FPS limit.
Global MaxFps.i
;Needed for delay calculation to limit the FPS.
Global FpsTimerDuration
Global StartTime.i
;We redirect all calls to Flip to this procedure.
;The Flip procedure swaps two surfaces (image buffer) on the graphics card.
;This is typicly used for double buffering: There is a front buffer,
;which is currently displayed and a backbuffer the game is drawing to.
;If the game completed all drawing operations it flips the buffers to
;display the drawn image. And starts over with drawing on the buffer which
;is currently not displayed.
;This is done to prevent flickering, which would occur if the game would
;draw on a buffer while it's displayed.
;So this procedure is called once per frame in most cases. And is a good
;entry point to limit the FPS.
Procedure.i DDraw_Flip_Hook(*this, *lpDDSurfaceTargetOverride, dwFlags.i)
Protected Ret.i
Protected TimeGab.i
;Calculates the delay needed to limit the FPS.
TimeGab = FpsTimerDuration - (timeGetTime_() - StartTime)
;If a delay is needed for the FPS limiting, we wait the calculated time.
If TimeGab > 1
Delay(TimeGab)
EndIf
;Calls the original Flip procedure to do the Flip.
Ret = Flip(*this, *lpDDSurfaceTargetOverride, dwFlags)
;Gets a new start time for the delay calculation to limit the FPS.
StartTime = timeGetTime_()
;Returns the return value of the original Flip procedure.
ProcedureReturn Ret
EndProcedure
;This procedure is called back by a DirectDraw hook.
Procedure DDrawCallback(*Object, Action.i, ObjectType.i)
Select Action
Case #GF_DD_ObjectCreate
;A new DirectDraw releated object was been created.
Select ObjectType
;We only want to hook the Flip procedure, so we need to wait for surface object to be created.
Case #GF_DD_IDirectDrawSurface, #GF_DD_IDirectDrawSurface2, #GF_DD_IDirectDrawSurface3, #GF_DD_IDirectDrawSurface4, #GF_DD_IDirectDrawSurface7
If FlipHookId = 0
;If the Flip hook is not allready installed, we install it.
FlipHookId = InstallDDrawProcHook(*Object, #GF_DD_IDDS_Flip, @DDraw_Flip_Hook())
;We need to get a new address to call the original Flip procedure,
;without getting redirected to DDraw_Flip_Hook.
;For easy calling later, we use a prototype here.
Flip = GetOrigStdProcAddr(FlipHookId)
;Initializes StartTime for the delay calculation to limit the FPS.
StartTime = timeGetTime_()
EndIf
EndSelect
EndSelect
EndProcedure
;This procedure is called if the plugin DLL is first loaded.
ProcedureDLL AttachProcess(Instance.i)
;We do nothing here.
;It's not needed to include this procedure.
EndProcedure
;This procedure is called if the plugin DLL unloads.
ProcedureDLL DetachProcess(Instance.i)
;If our plugin unloads we need to uninstall the hooks on Flip and DirectDraw.
UninstallStdProcHook(FlipHookId)
UnInstallDDrawHook(DDrawHookId)
EndProcedure
;This procedure is called by the GameFixer core to configure the plugin.
ProcedureDLL.i Config(Config.s)
;Installs the hook on DirectDraw.
;After that the DDrawCallback procedure is called by the GameFixer core
;every time a DirectDraw releated object is created or released.
DDrawHookId = InstallDDrawHook(@DDrawCallback())
If DDrawHookId = 0
;The hooking failed, so we tell the GameFixer core that our plugin failed by returning #False.
ProcedureReturn #False
EndIf
;Sets the FPS limit by the value thats in Config.
MaxFps = Val(Config)
If MaxFps < 1
;If the FPS limit is 0 or negativ we set it to 60.
MaxFps = 60
EndIf
;Needed for delay calculation to limit the FPS.
FpsTimerDuration = 1000 / MaxFps
;We return #True to tell the GameFixer core that all wend fine.
ProcedureReturn #True
EndProcedure
Re: GameFixer
New version is available on the online update.
The v0.03 SDK now contains includes and a plugin template for C++. SDK v0.03 (18KB)
Changelog GameFixer
v0.03
The v0.03 SDK now contains includes and a plugin template for C++. SDK v0.03 (18KB)
Changelog GameFixer
v0.03
- fixed: Crash of the injector if GameFixer core raised an error.
- added: DDraw: Plugins now can retrieve the DirectDraw version, the game uses.
- added: DDraw: Clipper objects, which are created using DirectDrawCreateClipper, will now be hooked and reported to the plugins.
- added: DDraw: DirectDraw objects, which are created using CoCreateInstance, will now be hooked and reported to the plugins.
- added: DirectDraw hooking
- added: The updater now can be launched through GameFixer.exe by using the command line parameter -Update or -u.
- added: GameFixer will now check the .exe for it's format. This can be disabled by using -DontCheckExe or -dce.
- initial release
Re: GameFixer
Hi, I run a new website about running old games on new computers and I came across this utility, but I tried it as suggested with Battle Isle 3 and it made no difference, the game still crashed. I tried on Windows XP SP3 as I was not able to get the game installed on Windows 7 x64. I hope you will continue to develop the utility though.
Re: GameFixer
Yes i will. I just dont have much time for at least the next 2 month. New job, much work there.BuckoA51 wrote:I hope you will continue to develop the utility though.
I am planing to open a website for the tool and hope to get some people to develop some plugins. Some game specific plugins are also in work, for example one to fix Dune 2000 graphics problems.
In the mean time here is a current compatiblity list for the GameFixer with the current plugins:
Battle Isle 3
Error message: "YOU DONT HAVE ENOUGH VIRTUAL MEMORY!"
Fix: GameFixer.exe C:\BI3\BIN\SDI_1C.EXE -MemoryFix "TotalPageFile=67108864 AvailPageFile=67108864"
Gunman Chronicles
Error message: "Your system has only -780.00K of physical memory."
Fix: GameFixer.exe C:\Gunman\gunman.exe -MemoryFix "TotalPhys=67108864"
Myth: The Fallen Lords
Error message: "Myth does not have enough memory to launch."
Fix: GameFixer.exe C:\Kreuzzug\Kreuzzug.exe -MemoryFix "AvailPageFile=67108864"
Vikings
Error message: "This program requires at least 3MB of free virtual memory to run."
Fix: GameFixer.exe C:\Index\Vikings\Vikings.exe -MemoryFix "AvailPageFile=67108864"
Re: GameFixer
I would like to offer to host you on my site, if you don't want to I quite understand, but have a look, it would be a good fit, I am trying to build a database of old games and how to get them running again:-I am planing to open a website for the tool and hope to get some people to develop some plugins. Some game specific plugins are also in work, for example one to fix Dune 2000 graphics problems.
http://www.play-old-pc-games.com/
How did you even install Battle Isle 3 on a 64 bit system btw? I think the installer needs rewriting, I can probably do that myself as I can write NSIS scripts. Here's what happens when I try to run Battle Isle 3:-
Do let me know on here or by PM if you are interested.
Re: GameFixer
After a long time there is a new update to this project.
I made a new plugin, which can fix the problem that some games want the CD in a specific drive, like D: or the first CD drive of the system.
The plugin is called DriveFix and is available on the online update. Just run Updater.exe in \GameFixer\System directory.
It needs to be configured by specifieing a source path and a destination path. Source path is the drive the game wants to access and destination path is the drive the CD is realy in.
That actualy can be complete pathes, dont need to be only drive letters.
Example: GameFixer.exe c:\game.exe -DriveFix "sp=d: dp=f:"
sp = source path
dp = destination path
I want to make a automatic mode in the future, that will allow automatic determination of source and destination.
For now it needs to be configured by hand.
It works by redirecting file accesses and MCI commands.
So CD audio over MCI should work.
If the game checks the CD name it will not work currently.
Fallowing API's are redirected:
CreateFileA
CreateFileW
SetCurrentDirectoryA
SetCurrentDirectoryW
mciSendStringA
mciSendStringW
mciExecute
I made a new plugin, which can fix the problem that some games want the CD in a specific drive, like D: or the first CD drive of the system.
The plugin is called DriveFix and is available on the online update. Just run Updater.exe in \GameFixer\System directory.
It needs to be configured by specifieing a source path and a destination path. Source path is the drive the game wants to access and destination path is the drive the CD is realy in.
That actualy can be complete pathes, dont need to be only drive letters.
Example: GameFixer.exe c:\game.exe -DriveFix "sp=d: dp=f:"
sp = source path
dp = destination path
I want to make a automatic mode in the future, that will allow automatic determination of source and destination.
For now it needs to be configured by hand.
It works by redirecting file accesses and MCI commands.
So CD audio over MCI should work.
If the game checks the CD name it will not work currently.
Fallowing API's are redirected:
CreateFileA
CreateFileW
SetCurrentDirectoryA
SetCurrentDirectoryW
mciSendStringA
mciSendStringW
mciExecute
Re: GameFixer
i'm waiting for the new update and download links
Re: GameFixer
He has stated that he plans on publish the source code soon.Liqu wrote:i'm waiting for the new update and download links