GameFixer

Applications, Games, Tools, User libs and useful stuff coded in PureBasic
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

GameFixer

Post by Thorium »

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)
Last edited by Thorium on Sat Jun 30, 2012 5:10 pm, edited 2 times in total.
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

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.

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.
LuCiFeR[SD]
666
666
Posts: 1033
Joined: Mon Sep 01, 2003 2:33 pm

Re: GameFixer

Post by LuCiFeR[SD] »

Very interesting stuff Thorium, Thank you :P
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

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.
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

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."
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

There is an update for the NetBlock plugin available.

NetBlock Changelog

v0.02
-fixed: On some games the blocking didnt worked.
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

New version is available on the online update.

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.
v0.01
  • initial release
Changelog MaxFPS Plugin

v0.01
  • initial release
By using the MaxFPS plugin the FPS of a game can be limited. This is usefull for games that dont offer such a option. It does only work on games that use DirectDraw and will most likely be replaced with another plugin in the future. It's main purpose is to demonstrate the new DirectDraw hooking of the GameFixer.

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.
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

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.

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
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

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
  • 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.
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.
v0.01
  • initial release
BuckoA51
New User
New User
Posts: 2
Joined: Thu Sep 13, 2012 8:39 pm

Re: GameFixer

Post by BuckoA51 »

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.
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

BuckoA51 wrote:I hope you will continue to develop the utility though.
Yes i will. I just dont have much time for at least the next 2 month. New job, much work there.

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"
BuckoA51
New User
New User
Posts: 2
Joined: Thu Sep 13, 2012 8:39 pm

Re: GameFixer

Post by BuckoA51 »

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.
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:-

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

Image

Do let me know on here or by PM if you are interested.
Thorium
Addict
Addict
Posts: 1271
Joined: Sat Aug 15, 2009 6:59 pm

Re: GameFixer

Post by Thorium »

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
Liqu
User
User
Posts: 77
Joined: Sun Apr 21, 2013 10:31 am

Re: GameFixer

Post by Liqu »

i'm waiting for the new update and download links :)
Opcode
Enthusiast
Enthusiast
Posts: 137
Joined: Thu Jul 18, 2013 4:58 am

Re: GameFixer

Post by Opcode »

Liqu wrote:i'm waiting for the new update and download links :)
He has stated that he plans on publish the source code soon. :D
Post Reply