diff --git a/Il2CppInspector.CLI/Program.cs b/Il2CppInspector.CLI/Program.cs
index 4727494..2e23441 100644
--- a/Il2CppInspector.CLI/Program.cs
+++ b/Il2CppInspector.CLI/Program.cs
@@ -258,7 +258,7 @@ namespace Il2CppInspector.CLI
// IDA Python script output
using (new Benchmark("Generate IDAPython script")) {
- new IDAPythonScript(appModel).WriteScriptToFile(options.PythonOutFile, options.CppOutPath + Path.DirectorySeparatorChar + "il2cpp-types.h");
+ new IDAPythonScript(appModel).WriteScriptToFile(options.PythonOutFile, Path.Combine(options.CppOutPath, "appdata/il2cpp-types.h"));
}
// C++ output
diff --git a/Il2CppInspector.Common/Outputs/CppScaffolding.cs b/Il2CppInspector.Common/Outputs/CppScaffolding.cs
index fdda516..825a408 100644
--- a/Il2CppInspector.Common/Outputs/CppScaffolding.cs
+++ b/Il2CppInspector.Common/Outputs/CppScaffolding.cs
@@ -80,17 +80,24 @@ typedef size_t uintptr_t;
writer.Close();
}
- public void Write(string outputPath) {
+ public void Write(string projectPath) {
// Ensure output directory exists and is not a file
// A System.IOException will be thrown if it's a file'
- Directory.CreateDirectory(outputPath);
+ var srcUserPath = Path.Combine(projectPath, "user");
+ var srcFxPath = Path.Combine(projectPath, "framework");
+ var srcDataPath = Path.Combine(projectPath, "appdata");
+
+ Directory.CreateDirectory(projectPath);
+ Directory.CreateDirectory(srcUserPath);
+ Directory.CreateDirectory(srcFxPath);
+ Directory.CreateDirectory(srcDataPath);
// Write type definitions to il2cpp-types.h
- WriteTypes(Path.Combine(outputPath, "il2cpp-types.h"));
+ WriteTypes(Path.Combine(srcDataPath, "il2cpp-types.h"));
// Write selected Unity API function file to il2cpp-api-functions.h
// (this is a copy of the header file from an actual Unity install)
- var il2cppApiFile = Path.Combine(outputPath, "il2cpp-api-functions.h");
+ var il2cppApiFile = Path.Combine(srcDataPath, "il2cpp-api-functions.h");
var apiHeaderText = model.UnityHeaders.GetAPIHeaderText();
using var fsApi = new FileStream(il2cppApiFile, FileMode.Create);
@@ -110,7 +117,7 @@ typedef size_t uintptr_t;
writer.Close();
// Write API function pointers to il2cpp-function-ptr.h
- var il2cppFnPtrFile = Path.Combine(outputPath, "il2cpp-function-ptr.h");
+ var il2cppFnPtrFile = Path.Combine(srcDataPath, "il2cpp-function-ptr.h");
using var fs2 = new FileStream(il2cppFnPtrFile, FileMode.Create);
writer = new StreamWriter(fs2, Encoding.ASCII);
@@ -130,7 +137,7 @@ typedef size_t uintptr_t;
writer.Close();
// Write application type definition addresses to il2cpp-type-ptr.h
- var il2cppTypeInfoFile = Path.Combine(outputPath, "il2cpp-type-ptr.h");
+ var il2cppTypeInfoFile = Path.Combine(srcDataPath, "il2cpp-type-ptr.h");
using var fs3 = new FileStream(il2cppTypeInfoFile, FileMode.Create);
writer = new StreamWriter(fs3, Encoding.ASCII);
@@ -145,7 +152,7 @@ typedef size_t uintptr_t;
writer.Close();
// Write method pointers and signatures to il2cpp-functions.h
- var methodFile = Path.Combine(outputPath, "il2cpp-functions.h");
+ var methodFile = Path.Combine(srcDataPath, "il2cpp-functions.h");
using var fs4 = new FileStream(methodFile, FileMode.Create);
writer = new StreamWriter(fs4, Encoding.ASCII);
@@ -165,19 +172,24 @@ typedef size_t uintptr_t;
writer.Close();
// Write boilerplate code
- File.WriteAllText(Path.Combine(outputPath, "il2cpp-init.h"), Resources.Cpp_IL2CPPInitH);
- File.WriteAllText(Path.Combine(outputPath, "helpers.h"), Resources.Cpp_HelpersH);
- File.WriteAllText(Path.Combine(outputPath, "dllmain.h"), Resources.Cpp_DLLMainH);
- File.WriteAllText(Path.Combine(outputPath, "main.cpp"), Resources.Cpp_MainCpp);
- File.WriteAllText(Path.Combine(outputPath, "helpers.cpp"), Resources.Cpp_HelpersCpp);
- File.WriteAllText(Path.Combine(outputPath, "dllmain.cpp"), Resources.Cpp_DLLMainCpp);
+ File.WriteAllText(Path.Combine(srcFxPath, "dllmain.cpp"), Resources.Cpp_DLLMainCpp);
+ File.WriteAllText(Path.Combine(srcFxPath, "helpers.cpp"), Resources.Cpp_HelpersCpp);
+ File.WriteAllText(Path.Combine(srcFxPath, "helpers.h"), Resources.Cpp_HelpersH);
+ File.WriteAllText(Path.Combine(srcFxPath, "il2cpp-appdata.h"), Resources.Cpp_Il2CppAppDataH);
+ File.WriteAllText(Path.Combine(srcFxPath, "il2cpp-init.cpp"), Resources.Cpp_Il2CppInitCpp);
+ File.WriteAllText(Path.Combine(srcFxPath, "il2cpp-init.h"), Resources.Cpp_Il2CppInitH);
+ File.WriteAllText(Path.Combine(srcFxPath, "pch-il2cpp.cpp"), Resources.Cpp_PCHIl2Cpp);
+ File.WriteAllText(Path.Combine(srcFxPath, "pch-il2cpp.h"), Resources.Cpp_PCHIl2CppH);
+
+ File.WriteAllText(Path.Combine(srcUserPath, "main.cpp"), Resources.Cpp_MainCpp);
+ File.WriteAllText(Path.Combine(srcUserPath, "main.h"), Resources.Cpp_MainH);
// Write Visual Studio project and solution files
var projectGuid = Guid.NewGuid();
var projectName = "IL2CppDLL";
var projectFile = projectName + ".vcxproj";
- File.WriteAllText(Path.Combine(outputPath, projectFile),
+ File.WriteAllText(Path.Combine(projectPath, projectFile),
Resources.CppProjTemplate.Replace("%PROJECTGUID%", projectGuid.ToString()));
var solutionGuid = Guid.NewGuid();
@@ -189,7 +201,7 @@ typedef size_t uintptr_t;
.Replace("%PROJECTFILE%", projectFile)
.Replace("%SOLUTIONGUID%", solutionGuid.ToString());
- File.WriteAllText(Path.Combine(outputPath, solutionFile), sln);
+ File.WriteAllText(Path.Combine(projectPath, solutionFile), sln);
}
private void writeHeader() {
diff --git a/Il2CppInspector.Common/Properties/Resources.Designer.cs b/Il2CppInspector.Common/Properties/Resources.Designer.cs
index 5d351eb..c0a46e2 100644
--- a/Il2CppInspector.Common/Properties/Resources.Designer.cs
+++ b/Il2CppInspector.Common/Properties/Resources.Designer.cs
@@ -62,10 +62,12 @@ namespace Il2CppInspector.Properties {
///
/// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+ ///// DLL entry point
///
///#define WIN32_LEAN_AND_MEAN
- ///#include "windows.h"
- ///#include "dllmain.h"
+ ///#include <windows.h>
+ ///#include "il2cpp-init.h"
+ ///#include "main.h"
///
///// DLL entry point
///BOOL APIENTRY DllMain( HMODULE hModule,
@@ -77,7 +79,7 @@ namespace Il2CppInspector.Properties {
/// {
/// case DLL_PROCESS_ATTACH:
/// init_il2cpp();
- /// CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) Run, NULL, [rest of string was truncated]";.
+ /// CreateThread(NULL, 0, (LPTHREAD_S [rest of string was truncated]";.
///
internal static string Cpp_DLLMainCpp {
get {
@@ -87,35 +89,24 @@ namespace Il2CppInspector.Properties {
///
/// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
- ///
- ///// Entry point declaration for custom injected code
- ///void Run();
- ///
- ///// IL2CPP initializer
- ///void init_il2cpp();.
- ///
- internal static string Cpp_DLLMainH {
- get {
- return ResourceManager.GetString("Cpp-DLLMainH", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
- ///// Logging functions
+ ///// Helper functions
///
///#define WIN32_LEAN_AND_MEAN
- ///#define WIN32_EXTRA_LEAN
///#include <windows.h>
+ ///#include <string>
///#include "helpers.h"
///
- ///// Write some text to the log file
- ///void LogWrite(std::string text)
- ///{
- /// HANDLE hfile = CreateFileW(LOG_FILE, FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ ///// Log file location
+ ///extern const LPCWSTR LOG_FILE;
///
- /// if (hfile == INVALID_HANDLE_VALUE)
- /// MessageBox(0, L"Could not open log file", 0, [rest of string was truncated]";.
+ ///// Helper function to get the module base address
+ ///uintptr_t GetBaseAddress() {
+ /// return (uintptr_t) GetModuleHandleW(L"GameAssembly.dll");
+ ///}
+ ///
+ ///// Helper function to append text to a file
+ ///void LogWrite(std::string text) {
+ /// HANDLE hfile = CreateFileW(LOG [rest of string was truncated]";.
///
internal static string Cpp_HelpersCpp {
get {
@@ -125,22 +116,24 @@ namespace Il2CppInspector.Properties {
///
/// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
- ///// Logging functions
+ ///// Helper functions
///
///#pragma once
+ ///
///#include <string>
///#include <sstream>
- ///#include <iomanip>
///
- ///extern const LPCWSTR LOG_FILE;
+ ///// Helper function to get the module base address
+ ///uintptr_t GetBaseAddress();
///
///// Helper function to append text to a file
///void LogWrite(std::string text);
///
+ ///// Helper function to open a new console window and redirect stdout there
+ ///void NewConsole();
+ ///
///// Helper function to convert a pointer to hex
- ///template<typename T> std::string to_hex_string(T i) {
- /// std::stringstream stream;
- /// stream << "0x" << std::setfill('0') << std::setw(sizeof(T) * 2) << [rest of string was truncated]";.
+ ///template<typename T> std::string to_hex_string(T [rest of string was truncated]";.
///
internal static string Cpp_HelpersH {
get {
@@ -150,7 +143,7 @@ namespace Il2CppInspector.Properties {
///
/// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
- ///// IL2CPP application initializer
+ ///// IL2CPP application data
///
///#pragma once
///
@@ -163,18 +156,65 @@ namespace Il2CppInspector.Properties {
///#include "il2cpp-function-ptr.h"
///
///// IL2CPP APIs
+ ///#define DO_API(r, n, p) extern r (*n) p
+ ///#include "il2cpp-api-functions.h"
+ ///#undef DO_API
+ ///
+ ///// Application-specific functions
+ ///#define DO_APP_FUNC(a, r, n, p) extern r (*n) p
+ ///namespace app {
+ /// #include "il2cpp-functions.h"
+ ///} [rest of string was truncated]";.
+ ///
+ internal static string Cpp_Il2CppAppDataH {
+ get {
+ return ResourceManager.GetString("Cpp-Il2CppAppDataH", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+ ///// IL2CPP application initializer
+ ///
+ ///#include "pch-il2cpp.h"
+ ///
+ ///#include "il2cpp-appdata.h"
+ ///#include "il2cpp-init.h"
+ ///#include "helpers.h"
+ ///
+ ///// IL2CPP APIs
///#define DO_API(r, n, p) r (*n) p
///#include "il2cpp-api-functions.h"
///#undef DO_API
///
///// Application-specific functions
///#define DO_APP_FUNC(a, r, n, p) r (*n) p
+ ///namespace app {
///#include "il2cpp-functions.h"
- ///#und [rest of string was truncated]";.
+ ///}
+ ///#undef DO_APP_FUNC
+ ///
+ ///// TypeInfo pointers
+ ///#define DO_TYPEDEF(a, n [rest of string was truncated]";.
///
- internal static string Cpp_IL2CPPInitH {
+ internal static string Cpp_Il2CppInitCpp {
get {
- return ResourceManager.GetString("Cpp-IL2CPPInitH", resourceCulture);
+ return ResourceManager.GetString("Cpp-Il2CppInitCpp", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+ ///// IL2CPP application initializer
+ ///
+ ///#pragma once
+ ///
+ ///// IL2CPP application initializer
+ ///void init_il2cpp();.
+ ///
+ internal static string Cpp_Il2CppInitH {
+ get {
+ return ResourceManager.GetString("Cpp_Il2CppInitH", resourceCulture);
}
}
@@ -182,7 +222,12 @@ namespace Il2CppInspector.Properties {
/// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
///// Custom injected code entry point
///
- ///#include "il2cpp-init.h"
+ ///#include "pch-il2cpp.h"
+ ///
+ ///#define WIN32_LEAN_AND_MEAN
+ ///#include <Windows.h>
+ ///#include <iostream>
+ ///#include "il2cpp-appdata.h"
///#include "helpers.h"
///
///using namespace app;
@@ -190,13 +235,10 @@ namespace Il2CppInspector.Properties {
///// Set the name of your log file here
///extern const LPCWSTR LOG_FILE = L"il2cpp-log.txt";
///
- ///// Injected code entry point
+ ///// Custom injected code entry point
///void Run()
///{
- /// LogWrite("Startup");
- ///
- /// // Place your custom code here
- ///}.
+ /// // If you would like to write to a log file, specify the name above and u [rest of string was truncated]";.
///
internal static string Cpp_MainCpp {
get {
@@ -204,6 +246,52 @@ namespace Il2CppInspector.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+ ///// Custom injected code entry point
+ ///
+ ///#pragma once
+ ///
+ ///// Custom injected code entry point
+ ///void Run();.
+ ///
+ internal static string Cpp_MainH {
+ get {
+ return ResourceManager.GetString("Cpp-MainH", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to // pch.cpp: source file corresponding to the pre-compiled header
+ ///
+ ///#include "pch-il2cpp.h"
+ ///
+ ///// When you are using pre-compiled headers, this source file is necessary for compilation to succeed..
+ ///
+ internal static string Cpp_PCHIl2Cpp {
+ get {
+ return ResourceManager.GetString("Cpp-PCHIl2Cpp", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to // pch.h: This is a precompiled header file.
+ ///// Files listed below are compiled only once, improving build performance for future builds.
+ ///// This also affects IntelliSense performance, including code completion and many code browsing features.
+ ///// However, files listed here are ALL re-compiled if any one of them is updated between builds.
+ ///// Do not add files here that you will be updating frequently as this negates the performance advantage.
+ ///
+ ///#ifndef PCH_IL2CPP_H
+ ///#define PCH_IL2CPP_H
+ ///
+ ///// add headers [rest of string was truncated]";.
+ ///
+ internal static string Cpp_PCHIl2CppH {
+ get {
+ return ResourceManager.GetString("Cpp-PCHIl2CppH", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
///<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
@@ -238,7 +326,7 @@ namespace Il2CppInspector.Properties {
/// Release|x64 = Release|x64
/// Release|x86 = Release|x86
/// EndGlobalSection
- /// GlobalSection(ProjectConfig [rest of string was truncated]";.
+ /// GlobalSection(ProjectConfigurationPlatfo [rest of string was truncated]";.
///
internal static string CppSlnTemplate {
get {
diff --git a/Il2CppInspector.Common/Properties/Resources.resx b/Il2CppInspector.Common/Properties/Resources.resx
index 03f94b2..f8110fd 100644
--- a/Il2CppInspector.Common/Properties/Resources.resx
+++ b/Il2CppInspector.Common/Properties/Resources.resx
@@ -119,10 +119,12 @@
// Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+// DLL entry point
#define WIN32_LEAN_AND_MEAN
-#include "windows.h"
-#include "dllmain.h"
+#include <windows.h>
+#include "il2cpp-init.h"
+#include "main.h"
// DLL entry point
BOOL APIENTRY DllMain( HMODULE hModule,
@@ -143,53 +145,61 @@ BOOL APIENTRY DllMain( HMODULE hModule,
}
return TRUE;
}
-
-
- // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
-
-// Entry point declaration for custom injected code
-void Run();
-
-// IL2CPP initializer
-void init_il2cpp();
// Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
-// Logging functions
+// Helper functions
#define WIN32_LEAN_AND_MEAN
-#define WIN32_EXTRA_LEAN
#include <windows.h>
+#include <string>
#include "helpers.h"
-// Write some text to the log file
-void LogWrite(std::string text)
-{
+// Log file location
+extern const LPCWSTR LOG_FILE;
+
+// Helper function to get the module base address
+uintptr_t GetBaseAddress() {
+ return (uintptr_t) GetModuleHandleW(L"GameAssembly.dll");
+}
+
+// Helper function to append text to a file
+void LogWrite(std::string text) {
HANDLE hfile = CreateFileW(LOG_FILE, FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hfile == INVALID_HANDLE_VALUE)
- MessageBox(0, L"Could not open log file", 0, 0);
+ MessageBoxW(0, L"Could not open log file", 0, 0);
DWORD written;
WriteFile(hfile, text.c_str(), (DWORD) text.length(), &written, NULL);
WriteFile(hfile, "\r\n", 2, &written, NULL);
CloseHandle(hfile);
+}
+
+// Helper function to open a new console window and redirect stdout there
+void NewConsole() {
+ AllocConsole();
+ freopen_s((FILE**) stdout, "CONOUT$", "w", stdout);
}
// Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
-// Logging functions
+// Helper functions
#pragma once
+
#include <string>
#include <sstream>
-#include <iomanip>
-extern const LPCWSTR LOG_FILE;
+// Helper function to get the module base address
+uintptr_t GetBaseAddress();
// Helper function to append text to a file
void LogWrite(std::string text);
+// Helper function to open a new console window and redirect stdout there
+void NewConsole();
+
// Helper function to convert a pointer to hex
template<typename T> std::string to_hex_string(T i) {
std::stringstream stream;
@@ -197,111 +207,25 @@ template<typename T> std::string to_hex_string(T i) {
return stream.str();
}
-
+
// Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
// IL2CPP application initializer
#pragma once
-#include <cstdint>
-
-// Application-specific types
-#include "il2cpp-types.h"
-
-// IL2CPP API function pointers
-#include "il2cpp-function-ptr.h"
-
-// IL2CPP APIs
-#define DO_API(r, n, p) r (*n) p
-#include "il2cpp-api-functions.h"
-#undef DO_API
-
-// Application-specific functions
-#define DO_APP_FUNC(a, r, n, p) r (*n) p
-#include "il2cpp-functions.h"
-#undef DO_APP_FUNC
-
-// TypeInfo pointers
-#define DO_TYPEDEF(a, n) n ## __Class* n ## __TypeInfo
-#include "il2cpp-type-ptr.h"
-#undef DO_TYPEDEF
-
-// Try not to include any Windows symbosl that might cause a naming conflict
-#define WIN32_LEAN_AND_MEAN
-#define WIN32_EXTRA_LEAN
-#define NOIME
-#define NOWINRES
-#define NOGDICAPMASKS
-#define NOVIRTUALKEYCODES
-#define NOWINMESSAGES
-#define NOWINSTYLES
-#define NOSYSMETRICS
-#define NOMENUS
-#define NOICONS
-#define NOKEYSTATES
-#define NOSYSCOMMANDS
-#define NORASTEROPS
-#define NOSHOWWINDOW
-#define OEMRESOURCE
-#define NOATOM
-#define NOCLIPBOARD
-#define NOCOLOR
-#define NOCTLMGR
-#define NODRAWTEXT
-#define NOGDI
-#define NOUSER
-#define NOMB
-#define NOMEMMGR
-#define NOMETAFILE
-#define NOMINMAX
-#define NOMSG
-#define NOOPENFILE
-#define NOSCROLL
-#define NOSERVICE
-#define NOSOUND
-#define NOTEXTMETRIC
-#define NOWH
-#define NOWINOFFSETS
-#define NOCOMM
-#define NOKANJI
-#define NOHELP
-#define NOPROFILER
-#define NODEFERWINDOWPOS
-#define NOMCX
-#define NOIME
-#define NOPROXYSTUB
-#define NOIMAGE
-#define NO
-#define NOTAPE
-#define ANSI_ONLY
-#include "windows.h"
-
-// Initialize everything
-void init_il2cpp() {
- // Get base address of IL2CPP module
- uintptr_t baseAddress = (uintptr_t) GetModuleHandleW(L"GameAssembly.dll");
-
- // Define IL2CPP API function addresses
- #define DO_API(r, n, p) n = (r (*) p)(baseAddress + n ## _ptr)
- #include "il2cpp-api-functions.h"
- #undef DO_API
-
- // Define function addresses
- #define DO_APP_FUNC(a, r, n, p) n = (r (*) p)(baseAddress + a)
- #include "il2cpp-functions.h"
- #undef DO_APP_FUNC
-
- // Define TypeInfo variables
- #define DO_TYPEDEF(a, n) n ## __TypeInfo = *(n ## __Class**) (baseAddress + a);
- #include "il2cpp-type-ptr.h"
- #undef DO_TYPEDEF
-}
+// IL2CPP application initializer
+void init_il2cpp();
// Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
// Custom injected code entry point
-#include "il2cpp-init.h"
+#include "pch-il2cpp.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#include <iostream>
+#include "il2cpp-appdata.h"
#include "helpers.h"
using namespace app;
@@ -309,10 +233,14 @@ using namespace app;
// Set the name of your log file here
extern const LPCWSTR LOG_FILE = L"il2cpp-log.txt";
-// Injected code entry point
+// Custom injected code entry point
void Run()
{
- LogWrite("Startup");
+ // If you would like to write to a log file, specify the name above and use LogWrite()
+ // LogWrite("Startup");
+
+ // If you would like to output to a new console window, use NewConsole() to open one and redirect stdout
+ // NewConsole();
// Place your custom code here
}
@@ -338,10 +266,44 @@ void Run()
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="framework\dllmain.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="framework\helpers.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="framework\il2cpp-init.cpp" />
+ <ClCompile Include="framework\pch-il2cpp.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="user\main.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="appdata\il2cpp-api-functions.h" />
+ <ClInclude Include="appdata\il2cpp-function-ptr.h" />
+ <ClInclude Include="appdata\il2cpp-functions.h" />
+ <ClInclude Include="appdata\il2cpp-type-ptr.h" />
+ <ClInclude Include="appdata\il2cpp-types.h" />
+ <ClInclude Include="framework\helpers.h" />
+ <ClInclude Include="framework\il2cpp-appdata.h" />
+ <ClInclude Include="framework\il2cpp-init.h" />
+ <ClInclude Include="framework\pch-il2cpp.h" />
+ <ClInclude Include="user\main.h" />
+ </ItemGroup>
<PropertyGroup Label="Globals">
<!--<VCProjectVersion>16.0</VCProjectVersion>-->
<Keyword>Win32Proj</Keyword>
- <ProjectGuid>{%PROJECTGUID%}</ProjectGuid>
+ <ProjectGuid>{%PROJECTGUID}</ProjectGuid>
<RootNamespace>Il2CppDLL</RootNamespace>
<!--<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>-->
</PropertyGroup>
@@ -408,7 +370,10 @@ void Run()
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;IL2CPPDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>pch-il2cpp.h</PrecompiledHeaderFile>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <AdditionalIncludeDirectories>$(ProjectDir)appdata;$(ProjectDir)framework;$(ProjectDir)user</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -424,7 +389,10 @@ void Run()
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;IL2CPPDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>pch-il2cpp.h</PrecompiledHeaderFile>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <AdditionalIncludeDirectories>$(ProjectDir)appdata;$(ProjectDir)framework;$(ProjectDir)user</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -440,7 +408,10 @@ void Run()
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;IL2CPPDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>pch-il2cpp.h</PrecompiledHeaderFile>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <AdditionalIncludeDirectories>$(ProjectDir)appdata;$(ProjectDir)framework;$(ProjectDir)user</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -456,7 +427,10 @@ void Run()
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;IL2CPPDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <PrecompiledHeaderFile>pch-il2cpp.h</PrecompiledHeaderFile>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <AdditionalIncludeDirectories>$(ProjectDir)appdata;$(ProjectDir)framework;$(ProjectDir)user</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -466,21 +440,6 @@ void Run()
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="dllmain.cpp" />
- <ClCompile Include="helpers.cpp" />
- <ClCompile Include="main.cpp" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="dllmain.h" />
- <ClInclude Include="helpers.h" />
- <ClInclude Include="il2cpp-api-functions.h" />
- <ClInclude Include="il2cpp-init.h" />
- <ClInclude Include="il2cpp-function-ptr.h" />
- <ClInclude Include="il2cpp-functions.h" />
- <ClInclude Include="il2cpp-type-ptr.h" />
- <ClInclude Include="il2cpp-types.h" />
- </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
@@ -1172,4 +1131,121 @@ Global
EndGlobal
+
+ // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+// IL2CPP application data
+
+#pragma once
+
+#include <cstdint>
+
+// Application-specific types
+#include "il2cpp-types.h"
+
+// IL2CPP API function pointers
+#include "il2cpp-function-ptr.h"
+
+// IL2CPP APIs
+#define DO_API(r, n, p) extern r (*n) p
+#include "il2cpp-api-functions.h"
+#undef DO_API
+
+// Application-specific functions
+#define DO_APP_FUNC(a, r, n, p) extern r (*n) p
+namespace app {
+ #include "il2cpp-functions.h"
+}
+#undef DO_APP_FUNC
+
+// TypeInfo pointers
+#define DO_TYPEDEF(a, n) extern n ## __Class* n ## __TypeInfo
+namespace app {
+ #include "il2cpp-type-ptr.h"
+}
+#undef DO_TYPEDEF
+
+
+ // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+// IL2CPP application initializer
+
+#include "pch-il2cpp.h"
+
+#include "il2cpp-appdata.h"
+#include "il2cpp-init.h"
+#include "helpers.h"
+
+// IL2CPP APIs
+#define DO_API(r, n, p) r (*n) p
+#include "il2cpp-api-functions.h"
+#undef DO_API
+
+// Application-specific functions
+#define DO_APP_FUNC(a, r, n, p) r (*n) p
+namespace app {
+#include "il2cpp-functions.h"
+}
+#undef DO_APP_FUNC
+
+// TypeInfo pointers
+#define DO_TYPEDEF(a, n) n ## __Class* n ## __TypeInfo
+namespace app {
+#include "il2cpp-type-ptr.h"
+}
+#undef DO_TYPEDEF
+
+// IL2CPP application initializer
+void init_il2cpp()
+{
+ // Get base address of IL2CPP module
+ uintptr_t baseAddress = GetBaseAddress();
+
+ using namespace app;
+
+ // Define IL2CPP API function addresses
+ #define DO_API(r, n, p) n = (r (*) p)(baseAddress + n ## _ptr)
+ #include "il2cpp-api-functions.h"
+ #undef DO_API
+
+ // Define function addresses
+ #define DO_APP_FUNC(a, r, n, p) n = (r (*) p)(baseAddress + a)
+ #include "il2cpp-functions.h"
+ #undef DO_APP_FUNC
+
+ // Define TypeInfo variables
+ #define DO_TYPEDEF(a, n) n ## __TypeInfo = *(n ## __Class**) (baseAddress + a);
+ #include "il2cpp-type-ptr.h"
+ #undef DO_TYPEDEF
+}
+
+
+ // Generated C++ file by Il2CppInspector - http://www.djkaty.com - https://github.com/djkaty
+// Custom injected code entry point
+
+#pragma once
+
+// Custom injected code entry point
+void Run();
+
+
+ // pch.cpp: source file corresponding to the pre-compiled header
+
+#include "pch-il2cpp.h"
+
+// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
+
+
+ // pch.h: This is a precompiled header file.
+// Files listed below are compiled only once, improving build performance for future builds.
+// This also affects IntelliSense performance, including code completion and many code browsing features.
+// However, files listed here are ALL re-compiled if any one of them is updated between builds.
+// Do not add files here that you will be updating frequently as this negates the performance advantage.
+
+#ifndef PCH_IL2CPP_H
+#define PCH_IL2CPP_H
+
+// add headers that you want to pre-compile here
+#include "il2cpp-appdata.h"
+
+#endif //PCH_IL2CPP_H
+
\ No newline at end of file
diff --git a/Il2CppTests/TestRunner.cs b/Il2CppTests/TestRunner.cs
index 827c95b..1401e71 100644
--- a/Il2CppTests/TestRunner.cs
+++ b/Il2CppTests/TestRunner.cs
@@ -55,7 +55,8 @@ namespace Il2CppInspector
}.WriteSingleFile(testPath + $@"\test-result{nameSuffix}.cs");
new IDAPythonScript(appModel)
- .WriteScriptToFile(testPath + $@"\test-ida-result{nameSuffix}.py", testPath + $@"\test-cpp-result{nameSuffix}\il2cpp-types.h");
+ .WriteScriptToFile(testPath + $@"\test-ida-result{nameSuffix}.py",
+ testPath + $@"\test-cpp-result{nameSuffix}\appdata\il2cpp-types.h");
new CppScaffolding(appModel)
.Write(testPath + $@"\test-cpp-result{nameSuffix}");
@@ -66,7 +67,7 @@ namespace Il2CppInspector
var suffix = (i > 0 ? "-" + i : "");
compareFiles(testPath, suffix + ".cs", $"test-result{suffix}.cs");
- compareFiles(testPath, suffix + ".h", $@"test-cpp-result{suffix}\il2cpp-types.h");
+ compareFiles(testPath, suffix + ".h", $@"test-cpp-result{suffix}\appdata\il2cpp-types.h");
compareFiles(testPath, suffix + ".py", $"test-ida-result{suffix}.py");
}
}
diff --git a/Il2CppTests/update-expected-results.ps1 b/Il2CppTests/update-expected-results.ps1
index 5fea1e1..97d3dcc 100644
--- a/Il2CppTests/update-expected-results.ps1
+++ b/Il2CppTests/update-expected-results.ps1
@@ -10,8 +10,8 @@ $bin = (gci "$PSScriptRoot/TestBinaries/*/*" -Filter test-result.cs)
$bin2 = (gci "$PSScriptRoot/TestBinaries/*/*" -Filter test-result-1.cs)
$py = (gci "$PSScriptRoot/TestBinaries/*/*" -Filter test-ida-result.py)
$py2 = (gci "$PSScriptRoot/TestBinaries/*/*" -Filter test-ida-result-1.py)
-$cpp = (gci "$PSScriptRoot/TestBinaries/*/test-cpp-result/*" -Filter il2cpp-types.h)
-$cpp2 = (gci "$PSScriptRoot/TestBinaries/*/test-cpp-result-1/*" -Filter il2cpp-types.h)
+$cpp = (gci "$PSScriptRoot/TestBinaries/*/test-cpp-result/appdata/*" -Filter il2cpp-types.h)
+$cpp2 = (gci "$PSScriptRoot/TestBinaries/*/test-cpp-result-1/appdata/*" -Filter il2cpp-types.h)
# Get path to expected test results
$results = "$PSScriptRoot/TestExpectedResults"