Skip to content

Commit 5b12c38

Browse files
committed
Refactor into version.dll proxy
1 parent b59d64b commit 5b12c38

File tree

8 files changed

+122
-10
lines changed

8 files changed

+122
-10
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
# d2pad
22
Experimental Xinput support for Diablo II
3+
4+
## Installation
5+
6+
Drop version.dll into your Diablo II directory.

d2pad.vcxproj

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232
<ClCompile Include="src\gamepad.c" />
3333
<ClCompile Include="src\input.c" />
3434
<ClCompile Include="src\util.c" />
35+
<ClCompile Include="src\versionproxy.c" />
3536
</ItemGroup>
3637
<ItemGroup>
37-
<ClInclude Include="src\bindings.h" />
3838
<ClInclude Include="src\common.h" />
3939
<ClInclude Include="src\gamepad.h" />
4040
<ClInclude Include="src\input.h" />
@@ -58,7 +58,7 @@
5858
<CharacterSet>Unicode</CharacterSet>
5959
</PropertyGroup>
6060
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
61-
<ConfigurationType>Application</ConfigurationType>
61+
<ConfigurationType>DynamicLibrary</ConfigurationType>
6262
<UseDebugLibraries>false</UseDebugLibraries>
6363
<PlatformToolset>v143</PlatformToolset>
6464
<WholeProgramOptimization>true</WholeProgramOptimization>
@@ -116,6 +116,10 @@
116116
<PropertyGroup Label="UserMacros" />
117117
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
118118
<RunCodeAnalysis>true</RunCodeAnalysis>
119+
<TargetName>version</TargetName>
120+
</PropertyGroup>
121+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
122+
<TargetName>version</TargetName>
119123
</PropertyGroup>
120124
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
121125
<ClCompile>
@@ -130,6 +134,8 @@
130134
<SubSystem>Windows</SubSystem>
131135
<GenerateDebugInformation>true</GenerateDebugInformation>
132136
<AdditionalDependencies>xinput.lib;%(AdditionalDependencies)</AdditionalDependencies>
137+
<ModuleDefinitionFile>
138+
</ModuleDefinitionFile>
133139
</Link>
134140
<PostBuildEvent>
135141
<Command>copy $(TargetPath) "C:\Program Files (x86)\Diablo II\ProjectD2"</Command>
@@ -143,12 +149,16 @@
143149
<SDLCheck>true</SDLCheck>
144150
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
145151
<ConformanceMode>true</ConformanceMode>
152+
<LanguageStandard_C>stdc17</LanguageStandard_C>
146153
</ClCompile>
147154
<Link>
148155
<SubSystem>Console</SubSystem>
149156
<EnableCOMDATFolding>true</EnableCOMDATFolding>
150157
<OptimizeReferences>true</OptimizeReferences>
151158
<GenerateDebugInformation>true</GenerateDebugInformation>
159+
<ModuleDefinitionFile>
160+
</ModuleDefinitionFile>
161+
<AdditionalDependencies>xinput.lib;%(AdditionalDependencies)</AdditionalDependencies>
152162
</Link>
153163
</ItemDefinitionGroup>
154164
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -161,6 +171,7 @@
161171
<Link>
162172
<SubSystem>Console</SubSystem>
163173
<GenerateDebugInformation>true</GenerateDebugInformation>
174+
<ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
164175
</Link>
165176
</ItemDefinitionGroup>
166177
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -177,6 +188,7 @@
177188
<EnableCOMDATFolding>true</EnableCOMDATFolding>
178189
<OptimizeReferences>true</OptimizeReferences>
179190
<GenerateDebugInformation>true</GenerateDebugInformation>
191+
<ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
180192
</Link>
181193
</ItemDefinitionGroup>
182194
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
@@ -189,6 +201,7 @@
189201
<Link>
190202
<SubSystem>Console</SubSystem>
191203
<GenerateDebugInformation>true</GenerateDebugInformation>
204+
<ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
192205
</Link>
193206
</ItemDefinitionGroup>
194207
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
@@ -205,6 +218,7 @@
205218
<EnableCOMDATFolding>true</EnableCOMDATFolding>
206219
<OptimizeReferences>true</OptimizeReferences>
207220
<GenerateDebugInformation>true</GenerateDebugInformation>
221+
<ModuleDefinitionFile>Source.def</ModuleDefinitionFile>
208222
</Link>
209223
</ItemDefinitionGroup>
210224
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

d2pad.vcxproj.filters

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
<ClCompile Include="src\bindings.c">
3131
<Filter>Source Files</Filter>
3232
</ClCompile>
33+
<ClCompile Include="src\versionproxy.c">
34+
<Filter>Source Files</Filter>
35+
</ClCompile>
3336
</ItemGroup>
3437
<ItemGroup>
3538
<ClInclude Include="src\common.h">
@@ -44,9 +47,6 @@
4447
<ClInclude Include="src\util.h">
4548
<Filter>Header Files</Filter>
4649
</ClInclude>
47-
<ClInclude Include="src\bindings.h">
48-
<Filter>Header Files</Filter>
49-
</ClInclude>
5050
</ItemGroup>
5151
<ItemGroup>
5252
<Text Include="LICENSE.txt" />

src/bindings.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include "common.h"
33
#include "gamepad.h"
44
#include "util.h"
5-
#include "bindings.h"
65
#include "input.h"
76

87
static void onMetaKeyDown( void );

src/bindings.h

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@
2222
// Source: https://stackoverflow.com/a/14421702
2323
#define StrWide1( s ) L##s
2424
#define StrWide( s ) StrWide1( s )
25+
26+
void setDefaultKeyBinds( void );
27+
void versionProxyInit( void );

src/dllmain.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include "common.h"
99
#include "gamepad.h"
1010
#include "input.h"
11-
#include "bindings.h"
1211
#include "util.h"
1312

1413
typedef struct {
@@ -116,9 +115,12 @@ void closeMainThread( void ) {
116115
WaitForSingleObject( mainThreadHandle, INFINITE );
117116
}
118117

118+
extern void versionProxyInit( void );
119+
119120
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved ) {
120121
switch ( dwReason ) {
121122
case DLL_PROCESS_ATTACH: {
123+
versionProxyInit( );
122124
utilCreateDebugConsole( );
123125

124126
if ( diaboInterfaceInit( ) ) {

src/versionproxy.c

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include <windows.h>
2+
3+
static HMODULE realVersionDll = NULL;
4+
5+
// Source: https://stackoverflow.com/a/2805560
6+
#define defineProxy( realFuncName, ordinalNo ) \
7+
__declspec( naked ) void proxy##realFuncName( void ) { \
8+
__pragma( comment( linker, "/EXPORT:" #realFuncName "=" __FUNCDNAME__ ) ); \
9+
__asm jmp addr##realFuncName; \
10+
}
11+
12+
static void* addrGetFileVersionInfoA = NULL;
13+
static void* addrGetFileVersionInfoByHandle = NULL;
14+
static void* addrGetFileVersionInfoExA = NULL;
15+
static void* addrGetFileVersionInfoExW = NULL;
16+
static void* addrGetFileVersionInfoSizeA = NULL;
17+
static void* addrGetFileVersionInfoSizeExA = NULL;
18+
static void* addrGetFileVersionInfoSizeExW = NULL;
19+
static void* addrGetFileVersionInfoSizeW = NULL;
20+
static void* addrGetFileVersionInfoW = NULL;
21+
static void* addrVerFindFileA = NULL;
22+
static void* addrVerFindFileW = NULL;
23+
static void* addrVerInstallFileA = NULL;
24+
static void* addrVerInstallFileW = NULL;
25+
static void* addrVerLanguageNameA = NULL;
26+
static void* addrVerLanguageNameW = NULL;
27+
static void* addrVerQueryValueA = NULL;
28+
static void* addrVerQueryValueW = NULL;
29+
30+
// __pragma( comment( linker, "/EXPORT:" __FUNCDNAME__ "=" #realFuncName ) ); \
31+
32+
#define initProxy( realFuncName ) addr##realFuncName = ( void* ) GetProcAddress( realVersionDll, ( LPCSTR ) #realFuncName )
33+
34+
defineProxy( GetFileVersionInfoA, 1 );
35+
defineProxy( GetFileVersionInfoByHandle, 2 );
36+
defineProxy( GetFileVersionInfoExA, 3 );
37+
defineProxy( GetFileVersionInfoExW, 4 );
38+
defineProxy( GetFileVersionInfoSizeA, 5 );
39+
defineProxy( GetFileVersionInfoSizeExA, 6 );
40+
defineProxy( GetFileVersionInfoSizeExW, 7 );
41+
defineProxy( GetFileVersionInfoSizeW, 8 );
42+
defineProxy( GetFileVersionInfoW, 9 );
43+
defineProxy( VerFindFileA, 10 );
44+
defineProxy( VerFindFileW, 11 );
45+
defineProxy( VerInstallFileA, 12 );
46+
defineProxy( VerInstallFileW, 13 );
47+
defineProxy( VerLanguageNameA, 14 );
48+
defineProxy( VerLanguageNameW, 15 );
49+
defineProxy( VerQueryValueA, 16 );
50+
defineProxy( VerQueryValueW, 17 );
51+
52+
void versionProxyInit( void ) {
53+
if ( ( realVersionDll = LoadLibraryW( L"c:\\windows\\system32\\version.dll" ) ) != NULL ) {
54+
initProxy( GetFileVersionInfoA );
55+
initProxy( GetFileVersionInfoByHandle );
56+
initProxy( GetFileVersionInfoExA );
57+
initProxy( GetFileVersionInfoExW );
58+
initProxy( GetFileVersionInfoSizeA );
59+
initProxy( GetFileVersionInfoSizeExA );
60+
initProxy( GetFileVersionInfoSizeExW );
61+
initProxy( GetFileVersionInfoSizeW );
62+
initProxy( GetFileVersionInfoW );
63+
initProxy( VerFindFileA );
64+
initProxy( VerFindFileW );
65+
initProxy( VerInstallFileA );
66+
initProxy( VerInstallFileW );
67+
initProxy( VerLanguageNameA );
68+
initProxy( VerLanguageNameW );
69+
initProxy( VerQueryValueA );
70+
initProxy( VerQueryValueW );
71+
}
72+
}
73+
74+
/*
75+
EXPORTS
76+
proxyGetFileVersionInfoA
77+
proxyGetFileVersionInfoByHandle
78+
proxyGetFileVersionInfoExA
79+
proxyGetFileVersionInfoExW
80+
proxyGetFileVersionInfoSizeA
81+
proxyGetFileVersionInfoSizeExA
82+
proxyGetFileVersionInfoSizeExW
83+
proxyGetFileVersionInfoSizeW
84+
proxyGetFileVersionInfoW
85+
proxyVerFindFileA
86+
proxyVerFindFileW
87+
proxyVerInstallFileA
88+
proxyVerInstallFileW
89+
proxyVerLanguageNameA
90+
proxyVerLanguageNameW
91+
proxyVerQueryValueA
92+
proxyVerQueryValueW
93+
*/

0 commit comments

Comments
 (0)