Skip to content

Commit

Permalink
Hijacked dinput8.dll instead of msimg32.dll
Browse files Browse the repository at this point in the history
  • Loading branch information
zziger committed Aug 22, 2022
1 parent ba8f46a commit 18fb8b3
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 68 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./BUILD/Release/msimg32.dll
asset_name: msimg32.dll
asset_path: ./BUILD/Release/dinput8.dll
asset_name: dinput8.dll
asset_content_type: application/octet-stream
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ set(DEFS
-DVERSION="${VERSION}"
)

file(GLOB_RECURSE PROJECT_SOURCE_FILES "src/*.h" "src/*.cpp" "src/proxy/msimg32.def")
file(GLOB_RECURSE PROJECT_SOURCE_FILES "src/*.h" "src/*.cpp" "src/proxy/dinput8.def")

if(WIN32 AND (MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
add_definitions(/MT)
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
- CMake 3.8 или новее

Для сборки нужно выполнить `build.bat` в корне проекта.<br>
Итоговая DLL будет находиться по пути `BUILD\Release\msimg32.dll`
Итоговая DLL будет находиться по пути `BUILD\Release\dinput8.dll`

## Установка

- Скачать последнюю версию мода со страницы [Releases](https://github.com/zziger/supercow-mod/releases/latest). (качать файл `msimg32.dll`)
- Поместить файл `msimg32.dll` в папку с игрой. Название файла менять нельзя.
- Скачать последнюю версию мода [тут](https://github.com/zziger/supercow-mod/releases/latest/download/dinput8.dll).
- Поместить скачанный файл `dinput8.dll` в папку с игрой. Название файла менять нельзя.

## Функции

Expand Down
4 changes: 2 additions & 2 deletions build.bat
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake -BBUILD . -A Win32 -DVERSION="%1"
cmake --build BUILD --config Release
IF EXIST BUILD\Release\msimg32.dll DEL /f BUILD\Release\msimg32.dll
copy BUILD\Release\supercow-mod.dll BUILD\Release\msimg32.dll
IF EXIST BUILD\Release\dinput8.dll DEL /f BUILD\Release\dinput8.dll
copy BUILD\Release\supercow-mod.dll BUILD\Release\dinput8.dll
57 changes: 57 additions & 0 deletions src/proxy/dinput8.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#include <string>
#include <windows.h>

#include "main.h"

struct dinput8_dll {
HMODULE dll;
FARPROC OrignalDirectInput8Create;
FARPROC OrignalDllCanUnloadNow;
FARPROC OrignalDllGetClassObject;
FARPROC OrignalDllRegisterServer;
FARPROC OrignalDllUnregisterServer;
FARPROC OrignalGetdfDIJoystick;
} dinput8;

extern "C"
{
__declspec(naked) void __stdcall FakeDirectInput8Create() { _asm { jmp[dinput8.OrignalDirectInput8Create] } }
__declspec(naked) void __stdcall FakeDllCanUnloadNow() { _asm { jmp[dinput8.OrignalDllCanUnloadNow] } }
__declspec(naked) void __stdcall FakeDllGetClassObject() { _asm { jmp[dinput8.OrignalDllGetClassObject] } }
__declspec(naked) void __stdcall FakeDllRegisterServer() { _asm { jmp[dinput8.OrignalDllRegisterServer] } }
__declspec(naked) void __stdcall FakeDllUnregisterServer() { _asm { jmp[dinput8.OrignalDllUnregisterServer] } }
__declspec(naked) void __stdcall FakeGetdfDIJoystick() { _asm { jmp[dinput8.OrignalGetdfDIJoystick] } }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
char path[MAX_PATH];
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
wchar_t path[MAX_PATH];
GetSystemDirectory(path, MAX_PATH);
std::wstring pathname = path + std::wstring(L"\\dinput8.dll");
dinput8.dll = LoadLibrary(pathname.c_str());
if (dinput8.dll == false)
{
MessageBox(0, L"Cannot load original dinput8.dll library", L"Proxy", MB_ICONERROR);
ExitProcess(0);
}
dinput8.OrignalDirectInput8Create = GetProcAddress(dinput8.dll, "DirectInput8Create");
dinput8.OrignalDllCanUnloadNow = GetProcAddress(dinput8.dll, "DllCanUnloadNow");
dinput8.OrignalDllGetClassObject = GetProcAddress(dinput8.dll, "DllGetClassObject");
dinput8.OrignalDllRegisterServer = GetProcAddress(dinput8.dll, "DllRegisterServer");
dinput8.OrignalDllUnregisterServer = GetProcAddress(dinput8.dll, "DllUnregisterServer");
dinput8.OrignalGetdfDIJoystick = GetProcAddress(dinput8.dll, "GetdfDIJoystick");

break;
}
case DLL_PROCESS_DETACH:
{
FreeLibrary(dinput8.dll);
}
break;
}
return main(hModule, ul_reason_for_call, lpReserved);
}
8 changes: 8 additions & 0 deletions src/proxy/dinput8.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
LIBRARY dinput8
EXPORTS
DirectInput8Create=FakeDirectInput8Create @1
DllCanUnloadNow=FakeDllCanUnloadNow @2
DllGetClassObject=FakeDllGetClassObject @3
DllRegisterServer=FakeDllRegisterServer @4
DllUnregisterServer=FakeDllUnregisterServer @5
GetdfDIJoystick=FakeGetdfDIJoystick @6
53 changes: 0 additions & 53 deletions src/proxy/msimg32.cpp

This file was deleted.

7 changes: 0 additions & 7 deletions src/proxy/msimg32.def

This file was deleted.

0 comments on commit 18fb8b3

Please sign in to comment.