Skip to content

Commit

Permalink
Added libmodutils project
Browse files Browse the repository at this point in the history
Added Trampoline
  • Loading branch information
michael-fadely committed Feb 8, 2016
1 parent 522ce7d commit 534e862
Show file tree
Hide file tree
Showing 17 changed files with 328 additions and 39 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Expand Up @@ -58,4 +58,5 @@ ipch/
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.vspx
*.opendb
21 changes: 19 additions & 2 deletions SA2ModLoader.sln
@@ -1,12 +1,17 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.40629.0
# Visual Studio 14
VisualStudioVersion = 14.0.24720.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SA2ModLoader", "SA2ModLoader\SA2ModLoader.vcxproj", "{3BF5C1B2-E3A4-43E7-9C2A-E445810834DE}"
ProjectSection(ProjectDependencies) = postProject
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE} = {83C0F6B3-2297-4A14-98D6-F9C3E99192CE}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SA2ModManager", "SA2ModManager\SA2ModManager.csproj", "{8B980BC2-ED9C-4BBD-930F-28171EC82BA9}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmodutils", "libmodutils\libmodutils.vcxproj", "{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Mixed Platforms = Debug|Mixed Platforms
Expand Down Expand Up @@ -39,6 +44,18 @@ Global
{8B980BC2-ED9C-4BBD-930F-28171EC82BA9}.Release|Win32.Build.0 = Release|x86
{8B980BC2-ED9C-4BBD-930F-28171EC82BA9}.Release|x86.ActiveCfg = Release|x86
{8B980BC2-ED9C-4BBD-930F-28171EC82BA9}.Release|x86.Build.0 = Release|x86
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Debug|Win32.ActiveCfg = Debug|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Debug|Win32.Build.0 = Debug|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Debug|x86.ActiveCfg = Debug|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Debug|x86.Build.0 = Debug|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Release|Mixed Platforms.ActiveCfg = Release|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Release|Mixed Platforms.Build.0 = Release|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Release|Win32.ActiveCfg = Release|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Release|Win32.Build.0 = Release|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Release|x86.ActiveCfg = Release|Win32
{83C0F6B3-2297-4A14-98D6-F9C3E99192CE}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
14 changes: 4 additions & 10 deletions SA2ModLoader/SA2ModLoader.vcxproj
Expand Up @@ -51,14 +51,14 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;SA2MODLOADER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;..\libmodutils</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<AdditionalDependencies>dbghelp.lib;Shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>dbghelp.lib;Shlwapi.lib;..\$(Configuration)\libmodutils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
Expand All @@ -69,7 +69,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;SA2MODLOADER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;..\libmodutils</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
Expand All @@ -78,11 +78,10 @@
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<AdditionalDependencies>dbghelp.lib;Shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>dbghelp.lib;Shlwapi.lib;..\$(Configuration)\libmodutils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="AnimationFile.h" />
<ClInclude Include="CodeParser.hpp" />
<ClInclude Include="Events.h" />
<ClInclude Include="FileMap.hpp" />
Expand All @@ -94,14 +93,11 @@
<ClInclude Include="include\SA2ModLoader\SA2Structs.h" />
<ClInclude Include="include\SA2ModLoader\SA2Variables.h" />
<ClInclude Include="IniFile.hpp" />
<ClInclude Include="LandTableInfo.h" />
<ClInclude Include="ModelInfo.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="TextConv.hpp" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="AnimationFile.cpp" />
<ClCompile Include="CodeParser.cpp" />
<ClCompile Include="dllmain.cpp">
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
Expand All @@ -114,8 +110,6 @@
<ClCompile Include="Events.cpp" />
<ClCompile Include="FileMap.cpp" />
<ClCompile Include="IniFile.cpp" />
<ClCompile Include="LandTableInfo.cpp" />
<ClCompile Include="ModelInfo.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
Expand Down
18 changes: 0 additions & 18 deletions SA2ModLoader/SA2ModLoader.vcxproj.filters
Expand Up @@ -24,15 +24,6 @@
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ModelInfo.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="LandTableInfo.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="AnimationFile.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\ModLoader\MemAccess.h">
<Filter>Header Files\include</Filter>
</ClInclude>
Expand Down Expand Up @@ -77,15 +68,6 @@
<ClCompile Include="dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ModelInfo.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AnimationFile.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LandTableInfo.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CodeParser.cpp">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down
2 changes: 1 addition & 1 deletion SA2ModLoader/dllmain.cpp
Expand Up @@ -13,7 +13,7 @@
#include <Shlwapi.h>
#include "IniFile.hpp"
#include "SA2ModLoader.h"
#include "ModelInfo.h"
#include <ModelInfo.h>
#include "CodeParser.hpp"
#include "Events.h"
using namespace std;
Expand Down
@@ -1,4 +1,4 @@
#include "StdAfx.h"
#include "stdafx.h"
#include "AnimationFile.h"
#include <fstream>
#include <iostream>
Expand Down
Expand Up @@ -4,7 +4,7 @@
#include <unordered_map>
#include <unordered_set>
#include <cstdint>
#include "SA2ModLoader.h"
#include <SA2ModLoader.h>

class AnimationFile
{
Expand Down
14 changes: 12 additions & 2 deletions SA2ModLoader/LandTableInfo.cpp → libmodutils/LandTableInfo.cpp
@@ -1,8 +1,18 @@
#include "StdAfx.h"
#include "stdafx.h"
#include "LandTableInfo.h"
#include <fstream>
#include <iostream>
using namespace std;
using std::default_delete;
using std::ifstream;
using std::ios;
using std::istream;
using std::list;
using std::shared_ptr;
using std::streamoff;
using std::string;
#ifdef _MSC_VER
using std::wstring;
#endif /* _MSC_VER */

LandTableInfo::LandTableInfo(const char *filename)
{
Expand Down
Expand Up @@ -4,7 +4,7 @@
#include <unordered_map>
#include <unordered_set>
#include <cstdint>
#include "SA2ModLoader.h"
#include <SA2ModLoader.h>

class LandTableInfo
{
Expand Down
14 changes: 12 additions & 2 deletions SA2ModLoader/ModelInfo.cpp → libmodutils/ModelInfo.cpp
@@ -1,8 +1,18 @@
#include "StdAfx.h"
#include "stdafx.h"
#include "ModelInfo.h"
#include <fstream>
#include <iostream>
using namespace std;
using std::default_delete;
using std::ifstream;
using std::ios;
using std::istream;
using std::list;
using std::shared_ptr;
using std::streamoff;
using std::string;
#ifdef _MSC_VER
using std::wstring;
#endif /* _MSC_VER */

ModelInfo::ModelInfo(const char *filename)
{
Expand Down
File renamed without changes.
52 changes: 52 additions & 0 deletions libmodutils/Trampoline.cpp
@@ -0,0 +1,52 @@
#include "stdafx.h"
#include "Trampoline.h"

#include <Windows.h>
#include <exception>
#include <ninja.h> // for typedefs
#include <ModLoader/MemAccess.h>

/// <summary>
/// Initializes a new <see cref="Trampoline" />, allowing you to replace functions and still call the original code.
/// </summary>
/// <param name="start">Start offset (address of function).</param>
/// <param name="end">End offset.</param>
/// <param name="func">Your detour function.</param>
Trampoline::Trampoline(size_t start, size_t end, DetourFunction func) :
target(nullptr), detour(nullptr), codeData(nullptr), originalSize(0), codeSize(0)
{
if (start > end)
throw std::exception("Start address cannot exceed end address.");

if (end - start < 5)
throw std::exception("Length cannot be less than 5 bytes.");

target = (void*)start;
detour = func;
originalSize = end - start;
codeSize = originalSize + 5;

// Copy original instructions
codeData = VirtualAlloc(nullptr, codeSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (codeData == nullptr)
throw std::exception("VirtualAlloc failure");

// ReadProcessMemory maybe?
memcpy(codeData, target, originalSize);

// Append jump (terribly)
WriteJump((&((Uint8*)codeData)[originalSize]), (void*)end);

// NOP
std::vector<Uint8> nop(originalSize, 0x90);
WriteData(target, nop.data(), nop.size());

// Jump
WriteJump(target, func);
}

Trampoline::~Trampoline()
{
if (codeData)
VirtualFree(codeData, codeSize, MEM_DECOMMIT);
}
51 changes: 51 additions & 0 deletions libmodutils/Trampoline.h
@@ -0,0 +1,51 @@
#pragma once

#include <vector>
#include <windef.h>

typedef void(*DetourFunction)(void);

// TODO: Better documentation
// TODO: Clearer member names
// TODO: Code restoration

class Trampoline
{
private:
void* target;
DetourFunction detour;
LPVOID codeData;
size_t originalSize;
size_t codeSize;

public:
/// <summary>
/// Initializes a new <see cref="Trampoline" />, allowing you to replace functions and still call the original code.
/// </summary>
/// <param name="start">Start offset (address of function).</param>
/// <param name="end">End offset.</param>
/// <param name="func">Your detour function.</param>
Trampoline(size_t start, size_t end, DetourFunction func);
~Trampoline();

// Pointer to original code.
LPVOID Target() const
{
return codeData;
}
// Pointer to your detour.
void* Detour() const
{
return detour;
}
// Original data size.
size_t OriginalSize() const
{
return originalSize;
}
// Size of Target including appended jump to remaining original code.
size_t CodeSize() const
{
return codeSize;
}
};

0 comments on commit 534e862

Please sign in to comment.