Proper reference counting

Update to VS2019
Added IDirect3DVertexBuffer9 but not used (strange crash)
This commit is contained in:
Robert Krawczyk 2019-08-31 20:58:56 +02:00
parent 8088b424ef
commit dbc6ff9390
18 changed files with 399 additions and 102 deletions

View file

@ -6,14 +6,16 @@
#include <memory>
#include <string>
#include "NonCopyable.h"
#include "StringUtil.h"
#include "WinUtil.h"
#ifndef LOGGER_DISABLE
class Logger : NonCopyable
class Logger
{
public:
Logger(const Logger&) = delete;
const Logger& operator=(Logger& other) = delete;
Logger() : m_systime(), m_console(INVALID_HANDLE_VALUE), m_file(INVALID_HANDLE_VALUE) {}
Logger::~Logger()

View file

@ -1,12 +0,0 @@
#pragma once
// An inheritable class to disallow the copy constructor and operator= functions
class NonCopyable
{
protected:
NonCopyable() {}
~NonCopyable() {}
private:
NonCopyable( const NonCopyable& );
const NonCopyable& operator=( NonCopyable& other );
};

View file

@ -22,30 +22,30 @@
<ProjectGuid>{F142A341-5EE0-442D-A15F-98AE9B48DBAE}</ProjectGuid>
<RootNamespace>libMinHook</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@ -83,12 +83,8 @@
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>None</DebugInformationFormat>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Lib />
</ItemDefinitionGroup>
@ -122,6 +118,7 @@
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<CompileAs>CompileAsC</CompileAs>
<WholeProgramOptimization>true</WholeProgramOptimization>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Lib />
</ItemDefinitionGroup>

View file

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 16
VisualStudioVersion = 16.0.29215.179
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OneTweakNG", "d3d9ex\d3d9ex.vcxproj", "{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}"
EndProject
@ -9,7 +9,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{5DB3A8
ProjectSection(SolutionItems) = preProject
Common\Defines.h = Common\Defines.h
Common\Logger.h = Common\Logger.h
Common\NonCopyable.h = Common\NonCopyable.h
Common\SimpleIni.h = Common\SimpleIni.h
Common\StringUtil.h = Common\StringUtil.h
Common\Timer.h = Common\Timer.h
@ -30,7 +29,8 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Debug|Win32.ActiveCfg = Debug|Win32
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Debug|Win32.Build.0 = Debug|Win32
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Debug|x64.ActiveCfg = Debug|Win32
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Debug|x64.ActiveCfg = Debug|x64
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Debug|x64.Build.0 = Debug|x64
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Release|Win32.ActiveCfg = Release|Win32
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Release|Win32.Build.0 = Release|Win32
{6C397640-B1A0-4DEF-8657-0EB21DC2FEA5}.Release|x64.ActiveCfg = Release|x64

View file

@ -1,6 +1,7 @@
#include "stdafx.h"
#include "Context.h"
#include "IDirect3DVertexBuffer9.h"
void MainContext::EnableAutoFix()
{
@ -65,15 +66,26 @@ bool MainContext::ApplyBehaviorFlagsFix(DWORD* flags)
return false;
}
bool MainContext::ApplyVertexBufferFix(UINT& Length, DWORD& Usage, DWORD& FVF, D3DPOOL& Pool)
HRESULT APIENTRY MainContext::ApplyVertexBufferFix(IDirect3DDevice9 *pIDirect3DDevice9, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle)
{
if (autofix == AutoFixes::NONE) return false;
if (autofix == AutoFixes::NONE) return pIDirect3DDevice9->CreateVertexBuffer(Length,Usage,FVF,Pool,ppVertexBuffer,pSharedHandle);
// Final Fantasy XIII
if (autofix == FINAL_FANTASY_XIII)
{
if (Length == 358400 && FVF == 0 && Pool == D3DPOOL_MANAGED) { Usage = D3DUSAGE_DYNAMIC; Pool = D3DPOOL_SYSTEMMEM; }
return true;
if (Length == 358400 && FVF == 0 && Pool == D3DPOOL_MANAGED) {
Usage = D3DUSAGE_DYNAMIC; Pool = D3DPOOL_SYSTEMMEM;
//IDirect3DVertexBuffer9* buffer = nullptr;
//HRESULT hr = pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, &buffer, NULL);
//if (FAILED(hr))
//{
// return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle);
//}
//if(ppVertexBuffer) *ppVertexBuffer = new hkIDirect3DVertexBuffer9(pIDirect3DDevice9, buffer);
//return hr;
}
}
return false;
return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle);
}

View file

@ -37,7 +37,7 @@ Config::Config()
#undef SETTING
}
MainContext::MainContext()
MainContext::MainContext() : oldWndProc(nullptr)
{
LogFile("OneTweakNG.log");
@ -170,7 +170,7 @@ bool MainContext::CheckWindow(HWND hWnd)
void MainContext::ApplyWndProc(HWND hWnd)
{
if (config.GetAlwaysActive())
if (config.GetAlwaysActive() || config.GetHideCursor())
{
context.oldWndProc = (WNDPROC)context.TrueSetWindowLongA(hWnd, GWLP_WNDPROC, (LONG_PTR)context.WindowProc);
}
@ -218,7 +218,8 @@ LRESULT CALLBACK MainContext::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP
if (context.config.GetAlwaysActive())
return TRUE;
while (::ShowCursor(TRUE) < 0);
if (!context.config.GetForceHideCursor())
while (::ShowCursor(TRUE) < 0);
break;
}
@ -227,6 +228,10 @@ LRESULT CALLBACK MainContext::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP
return TRUE;
}
if (context.config.GetForceHideCursor())
while (::ShowCursor(FALSE) >= 0);
return CallWindowProc(context.oldWndProc, hWnd, uMsg, wParam, lParam);
}

View file

@ -10,9 +10,12 @@ struct hkIDirect3D9;
static const char* inifilename = "OneTweakNG.ini";
#define CONFIG_VERSION 3
class Config : NonCopyable
class Config
{
public:
Config(const Config&) = delete;
const Config& operator=(Config& other) = delete;
Config();
#define SETTING(_type, _func, _var, _section, _defaultval) \
@ -26,8 +29,11 @@ public:
public: type(callconv* True##name)(__VA_ARGS__); \
private: static type callconv Hook##name(__VA_ARGS__);
class MainContext : NonCopyable
class MainContext
{
MainContext(const MainContext&) = delete;
const MainContext& operator=(MainContext& other) = delete;
DECLARE_HOOK(IDirect3D9*, WINAPI, Direct3DCreate9, UINT SDKVersion);
DECLARE_HOOK(LONG, WINAPI, SetWindowLongA, HWND hWnd, int nIndex, LONG dwNewLong);
DECLARE_HOOK(LONG, WINAPI, SetWindowLongW, HWND hWnd, int nIndex, LONG dwNewLong);
@ -42,7 +48,7 @@ public:
bool ApplyPresentationParameters(D3DPRESENT_PARAMETERS* pPresentationParameters);
bool ApplyBehaviorFlagsFix(DWORD* flags);
bool ApplyVertexBufferFix(UINT& Length, DWORD& Usage, DWORD& FVF, D3DPOOL& Pool);
HRESULT APIENTRY ApplyVertexBufferFix(IDirect3DDevice9* pIDirect3DDevice9, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle);
bool BehaviorFlagsToString(DWORD BehaviorFlags, std::string* BehaviorFlagsString);
bool CheckWindow(HWND hWnd);

View file

@ -9,31 +9,35 @@
#define IDirect3D9_PrintLog(format, ...) //PrintLog(format, __VA_ARGS__);
hkIDirect3D9::hkIDirect3D9(IDirect3D9 *pIDirect3D9) {
PrintLog(__FUNCTION__);
m_pWrapped = pIDirect3D9;
}
hkIDirect3D9::~hkIDirect3D9()
{
PrintLog(__FUNCTION__);
}
HRESULT APIENTRY hkIDirect3D9::QueryInterface(REFIID riid, void** ppvObj) {
PrintLog(__FUNCTION__);
return m_pWrapped->QueryInterface(riid, ppvObj);
if (ppvObj == nullptr) return E_POINTER;
if (riid == __uuidof(IUnknown) ||
riid == __uuidof(IDirect3D9))
{
*ppvObj = static_cast<IDirect3D9*>(this);
AddRef();
return S_OK;
}
*ppvObj = nullptr;
return E_NOINTERFACE;
}
ULONG APIENTRY hkIDirect3D9::AddRef() {
PrintLog(__FUNCTION__);
return m_pWrapped->AddRef();
return _InterlockedIncrement(&m_refCount);
}
ULONG APIENTRY hkIDirect3D9::Release() {
ULONG ref_count = m_pWrapped->Release();
PrintLog(__FUNCTION__ " return = %lu", ref_count);
if (ref_count == 0) delete this;
return ref_count;
PrintLog(__FUNCTION__);
const LONG ref = _InterlockedDecrement(&m_refCount);
if (ref == 0)
{
delete this;
}
return ref;
}
HRESULT APIENTRY hkIDirect3D9::RegisterSoftwareDevice(void* pInitializeFunction) {
@ -131,18 +135,22 @@ HRESULT APIENTRY hkIDirect3D9::CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType,
if (hFocusWindow == NULL) hFocusWindow = pPresentationParameters->hDeviceWindow;
context.ApplyPresentationParameters(pPresentationParameters);
HRESULT hr = m_pWrapped->CreateDevice(Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
if (SUCCEEDED(hr) && ppReturnedDeviceInterface && *ppReturnedDeviceInterface)
{
hkIDirect3DDevice9* pIDirect3DDevice9 = new hkIDirect3DDevice9(*ppReturnedDeviceInterface);
*ppReturnedDeviceInterface = pIDirect3DDevice9;
}
if (OriginalBehaviorFlags != BehaviorFlags)
{
std::string BehaviorFlagsString;
context.BehaviorFlagsToString(BehaviorFlags, &BehaviorFlagsString);
PrintLog("BehaviorFlags changed: %08X %s", BehaviorFlags, BehaviorFlagsString.c_str());
}
IDirect3DDevice9* device = nullptr;
HRESULT hr = m_pWrapped->CreateDevice(Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, &device);
if (FAILED(hr))
{
PrintLog("CreateDevice fail with HRESULT: %08X", hr);
*ppReturnedDeviceInterface = nullptr;
return hr;
}
*ppReturnedDeviceInterface = new hkIDirect3DDevice9(device);
return hr;
}

View file

@ -4,13 +4,8 @@
#include "d3d9.h"
#include "IDirect3DDevice9.h"
interface hkIDirect3D9 : public IDirect3D9 {
IDirect3D9* m_pWrapped;
interface hkIDirect3D9 final : public IDirect3D9 {
public:
hkIDirect3D9(IDirect3D9 *pIDirect3D9);
~hkIDirect3D9();
// original interface
STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj);
STDMETHOD_(ULONG, AddRef)();
@ -29,5 +24,21 @@ public:
STDMETHOD(GetDeviceCaps)(UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps);
STDMETHOD_(HMONITOR, GetAdapterMonitor)(UINT Adapter);
STDMETHOD(CreateDevice)(UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface);
public:
hkIDirect3D9(IDirect3D9 *pIDirect3D9)
: m_pWrapped(pIDirect3D9)
{
}
private:
~hkIDirect3D9()
{
m_pWrapped->Release();
}
LONG m_refCount = 1;
IDirect3D9 *m_pWrapped;
};

View file

@ -11,31 +11,34 @@
#define IDirect3DDevice9_PrintLog(...) //PrintLog(format, __VA_ARGS__);
hkIDirect3DDevice9::hkIDirect3DDevice9(IDirect3DDevice9 *pIDirect3DDevice9) {
PrintLog(__FUNCTION__);
m_pWrapped = pIDirect3DDevice9;
}
hkIDirect3DDevice9::~hkIDirect3DDevice9()
{
PrintLog(__FUNCTION__);
}
HRESULT APIENTRY hkIDirect3DDevice9::QueryInterface(REFIID riid, void** ppvObj) {
IDirect3DDevice9_PrintLog(__FUNCTION__);
return m_pWrapped->QueryInterface(riid, ppvObj);
if (ppvObj == nullptr) return E_POINTER;
if (riid == __uuidof(IUnknown) ||
riid == __uuidof(IDirect3DDevice9))
{
*ppvObj = static_cast<IDirect3DDevice9*>(this);
AddRef();
return S_OK;
}
*ppvObj = nullptr;
return E_NOINTERFACE;
}
ULONG APIENTRY hkIDirect3DDevice9::AddRef() {
IDirect3DDevice9_PrintLog(__FUNCTION__);
return m_pWrapped->AddRef();
return _InterlockedIncrement(&m_refCount);
}
ULONG APIENTRY hkIDirect3DDevice9::Release() {
ULONG ref_count = m_pWrapped->Release();
PrintLog(__FUNCTION__ " return = %lu", ref_count);
if (ref_count == 0) delete this;
return ref_count;
const LONG ref = _InterlockedDecrement(&m_refCount);
if (ref == 0)
{
delete this;
}
return ref;
}
HRESULT APIENTRY hkIDirect3DDevice9::TestCooperativeLevel() {
@ -178,8 +181,7 @@ HRESULT APIENTRY hkIDirect3DDevice9::CreateCubeTexture(UINT EdgeLength, UINT Lev
HRESULT APIENTRY hkIDirect3DDevice9::CreateVertexBuffer(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) {
//PrintLog("hkIDirect3DDevice9::CreateVertexBuffer %08u %x %x %x %p %p", Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle);
context.ApplyVertexBufferFix(Length, Usage, FVF, Pool);
return m_pWrapped->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle);
return context.ApplyVertexBufferFix(m_pWrapped, Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle);
}
HRESULT APIENTRY hkIDirect3DDevice9::CreateIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle) {

View file

@ -4,13 +4,8 @@
#pragma once
#include "d3d9.h"
interface hkIDirect3DDevice9 : public IDirect3DDevice9 {
IDirect3DDevice9* m_pWrapped;
interface hkIDirect3DDevice9 final : public IDirect3DDevice9 {
public:
hkIDirect3DDevice9(IDirect3DDevice9 *pIDirect3DDevice9);
~hkIDirect3DDevice9();
// original interface
STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj);
STDMETHOD_(ULONG, AddRef)();
@ -131,5 +126,20 @@ public:
STDMETHOD(DrawTriPatch)(UINT Handle, CONST float* pNumSegs, CONST D3DTRIPATCH_INFO* pTriPatchInfo);
STDMETHOD(DeletePatch)(UINT Handle);
STDMETHOD(CreateQuery)(D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery);
public:
hkIDirect3DDevice9(IDirect3DDevice9 *pIDirect3DDevice9)
: m_pWrapped(pIDirect3DDevice9)
{
}
private:
~hkIDirect3DDevice9()
{
m_pWrapped->Release();
}
LONG m_refCount = 1;
IDirect3DDevice9* m_pWrapped;
};

View file

@ -0,0 +1,102 @@
// wrapper for IDirect3DVertexBuffer9 in d3d9.h
// generated using wrapper_gen.rb
#include "stdafx.h"
#include "Context.h"
#include "IDirect3D9.h"
#include "IDirect3DDevice9.h"
#include "IDirect3DVertexBuffer9.h"
#define IDirect3DVertexBuffer9_PrintLog(format, ...) //PrintLog(format, __VA_ARGS__);
HRESULT APIENTRY hkIDirect3DVertexBuffer9::QueryInterface(REFIID riid, void** ppvObj) {
if (ppvObj == nullptr) return E_POINTER;
if (riid == __uuidof(IUnknown) ||
riid == __uuidof(IDirect3DResource9) ||
riid == __uuidof(IDirect3DVertexBuffer9))
{
*ppvObj = static_cast<IDirect3DVertexBuffer9*>(this);
AddRef();
return S_OK;
}
*ppvObj = nullptr;
return E_NOINTERFACE;
}
ULONG APIENTRY hkIDirect3DVertexBuffer9::AddRef() {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return _InterlockedIncrement(&m_refCount);
}
ULONG APIENTRY hkIDirect3DVertexBuffer9::Release() {
const LONG ref = _InterlockedDecrement(&m_refCount);
if (ref == 0)
{
delete this;
}
return ref;
}
HRESULT APIENTRY hkIDirect3DVertexBuffer9::GetDevice(IDirect3DDevice9** ppDevice) {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
if (ppDevice == nullptr)
return D3DERR_INVALIDCALL;
m_pIDirect3DDevice9->AddRef();
*ppDevice = m_pIDirect3DDevice9;
return D3D_OK;
}
HRESULT APIENTRY hkIDirect3DVertexBuffer9::SetPrivateData(REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->SetPrivateData(refguid, pData, SizeOfData, Flags);
}
HRESULT APIENTRY hkIDirect3DVertexBuffer9::GetPrivateData(REFGUID refguid, void* pData, DWORD* pSizeOfData) {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->GetPrivateData(refguid, pData, pSizeOfData);
}
HRESULT APIENTRY hkIDirect3DVertexBuffer9::FreePrivateData(REFGUID refguid) {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->FreePrivateData(refguid);
}
DWORD APIENTRY hkIDirect3DVertexBuffer9::SetPriority(DWORD PriorityNew) {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->SetPriority(PriorityNew);
}
DWORD APIENTRY hkIDirect3DVertexBuffer9::GetPriority() {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->GetPriority();
}
void APIENTRY hkIDirect3DVertexBuffer9::PreLoad() {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->PreLoad();
}
D3DRESOURCETYPE APIENTRY hkIDirect3DVertexBuffer9::GetType() {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->GetType();
}
HRESULT APIENTRY hkIDirect3DVertexBuffer9::Lock(UINT OffsetToLock, UINT SizeToLock, void** ppbData, DWORD Flags) {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->Lock(OffsetToLock, SizeToLock, ppbData, Flags);
}
HRESULT APIENTRY hkIDirect3DVertexBuffer9::Unlock() {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->Unlock();
}
HRESULT APIENTRY hkIDirect3DVertexBuffer9::GetDesc(D3DVERTEXBUFFER_DESC *pDesc) {
IDirect3DVertexBuffer9_PrintLog(__FUNCTION__);
return m_pWrapped->GetDesc(pDesc);
}

View file

@ -0,0 +1,40 @@
// wrapper for IDirect3DVertexBuffer9 in d3d9.h
// generated using wrapper_gen.rb
#pragma once
#include "d3d9.h"
interface hkIDirect3DVertexBuffer9 final : public IDirect3DVertexBuffer9 {
public:
// original interface
STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(GetDevice)(IDirect3DDevice9** ppDevice);
STDMETHOD(SetPrivateData)(REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags);
STDMETHOD(GetPrivateData)(REFGUID refguid, void* pData, DWORD* pSizeOfData);
STDMETHOD(FreePrivateData)(REFGUID refguid);
STDMETHOD_(DWORD, SetPriority)(DWORD PriorityNew);
STDMETHOD_(DWORD, GetPriority)();
STDMETHOD_(void, PreLoad)();
STDMETHOD_(D3DRESOURCETYPE, GetType)();
STDMETHOD(Lock)(UINT OffsetToLock, UINT SizeToLock, void** ppbData, DWORD Flags);
STDMETHOD(Unlock)();
STDMETHOD(GetDesc)(D3DVERTEXBUFFER_DESC *pDesc);
public:
hkIDirect3DVertexBuffer9(IDirect3DDevice9* pIDirect3DDevice9, IDirect3DVertexBuffer9* pIDirect3DVertexBuffer9)
: m_pWrapped(pIDirect3DVertexBuffer9), m_pIDirect3DDevice9(pIDirect3DDevice9)
{}
private:
~hkIDirect3DVertexBuffer9()
{
m_pWrapped->Release();
}
LONG m_refCount = 1;
IDirect3DVertexBuffer9 *m_pWrapped;
IDirect3DDevice9* m_pIDirect3DDevice9;
};

View file

@ -5,6 +5,7 @@ SETTING(bool, BoolValue, AlwaysActive, Options, false);
SETTING(bool, BoolValue, AutoFix, Options, true);
SETTING(u32, LongValue, Multisample, Options, 0);
SETTING(bool, BoolValue, HideCursor, Options, false);
SETTING(bool, BoolValue, ForceHideCursor, Options, false);
SETTING(u32, LongValue, BehaviorFlags, Options, 0);
SETTING(bool, BoolValue, Adapter, Adapter, false);

View file

@ -4,12 +4,16 @@
#include "d3d9.h"
#include "dinput.h"
#include "xinput.h"
template <class T>
class WrapperBase : NonCopyable
class WrapperBase
{
public:
WrapperBase() {}
WrapperBase(const WrapperBase&) = delete;
const WrapperBase& operator=(WrapperBase& other) = delete;
WrapperBase(): m_module(nullptr) {}
~WrapperBase()
{
@ -161,3 +165,96 @@ extern "C"
return DINPUT8DLL::Get().DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter);
}
}
class XINPUTDLL : public WrapperBase<XINPUTDLL>
{
public:
// XInput 1.3 and older functions
DWORD(WINAPI* XInputGetState)(DWORD dwUserIndex, XINPUT_STATE* pState);
DWORD(WINAPI* XInputSetState)(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration);
DWORD(WINAPI* XInputGetCapabilities)(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities);
VOID(WINAPI* XInputEnable)(BOOL enable);
DWORD(WINAPI* XInputGetDSoundAudioDeviceGuids)(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid);
DWORD(WINAPI* XInputGetBatteryInformation)(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation);
DWORD(WINAPI* XInputGetKeystroke)(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke);
// XInput 1.3 undocumented functions
DWORD(WINAPI* XInputGetStateEx)(DWORD dwUserIndex, XINPUT_STATE *pState); // 100
DWORD(WINAPI* XInputWaitForGuideButton)(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid); // 101
DWORD(WINAPI* XInputCancelGuideButtonWait)(DWORD dwUserIndex); // 102
DWORD(WINAPI* XInputPowerOffController)(DWORD dwUserIndex); // 103
// XInput 1.4 functions
DWORD(WINAPI* XInputGetAudioDeviceIds)(DWORD dwUserIndex, LPWSTR pRenderDeviceId, UINT* pRenderCount, LPWSTR pCaptureDeviceId, UINT* pCaptureCount);
// XInput 1.4 undocumented functionss
DWORD(WINAPI* XInputGetBaseBusInformation)(DWORD dwUserIndex, struct XINPUT_BUSINFO* pBusinfo); // 104
DWORD(WINAPI* XInputGetCapabilitiesEx)(DWORD unk1, DWORD dwUserIndex, DWORD dwFlags, struct XINPUT_CAPABILITIESEX* pCapabilitiesEx); // 108
XINPUTDLL()
{
WrapperLoad("xinput1_3.dll");
// XInput 1.3 and older functions
StoreAddress(&XInputGetState, "XInputGetState");
StoreAddress(&XInputSetState, "XInputSetState");
StoreAddress(&XInputGetCapabilities, "XInputGetCapabilities");
StoreAddress(&XInputEnable, "XInputEnable");
StoreAddress(&XInputGetDSoundAudioDeviceGuids, "XInputGetDSoundAudioDeviceGuids");
StoreAddress(&XInputGetBatteryInformation, "XInputGetBatteryInformation");
StoreAddress(&XInputGetKeystroke, "XInputGetKeystroke");
// XInput 1.3 undocumented functions
StoreAddress(&XInputGetStateEx, (const char*)100);
StoreAddress(&XInputWaitForGuideButton, (const char*)101);
StoreAddress(&XInputCancelGuideButtonWait, (const char*)102);
StoreAddress(&XInputPowerOffController, (const char*)103);
// XInput 1.4 functions
StoreAddress(&XInputGetAudioDeviceIds, "XInputGetAudioDeviceIds");
// XInput 1.4 undocumented functionss
StoreAddress(&XInputGetBaseBusInformation, (const char*)104);
StoreAddress(&XInputGetCapabilitiesEx, (const char*)108);
}
};
extern "C"
{
// XInput 1.3 and older functions
DWORD WINAPI _XInputGetState(DWORD dwUserIndex, XINPUT_STATE* pState)
{
return XINPUTDLL::Get().XInputGetState(dwUserIndex, pState);
}
DWORD WINAPI _XInputSetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration)
{
return XINPUTDLL::Get().XInputSetState(dwUserIndex, pVibration);
}
DWORD WINAPI _XInputGetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities)
{
return XINPUTDLL::Get().XInputGetCapabilities(dwUserIndex, dwFlags, pCapabilities);
}
VOID WINAPI _XInputEnable(BOOL enable)
{
return XINPUTDLL::Get().XInputEnable(enable);
}
DWORD WINAPI _XInputGetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid)
{
return XINPUTDLL::Get().XInputGetDSoundAudioDeviceGuids(dwUserIndex, pDSoundRenderGuid, pDSoundCaptureGuid);
}
DWORD WINAPI _XInputGetBatteryInformation(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation)
{
return XINPUTDLL::Get().XInputGetBatteryInformation(dwUserIndex, devType, pBatteryInformation);
}
DWORD WINAPI _XInputGetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke)
{
return XINPUTDLL::Get().XInputGetKeystroke(dwUserIndex, dwReserved, pKeystroke);
}
}

View file

@ -23,19 +23,19 @@
<Keyword>Win32Proj</Keyword>
<RootNamespace>d3d9ex</RootNamespace>
<ProjectName>OneTweakNG</ProjectName>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@ -44,7 +44,7 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<InterproceduralOptimization>true</InterproceduralOptimization>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
@ -52,7 +52,7 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<InterproceduralOptimization>true</InterproceduralOptimization>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@ -72,8 +72,8 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<TargetName>d3d9</TargetName>
<IncludePath>$(SolutionDir)\Common;$(SolutionDir)\MinHook\include;$(IncludePath)</IncludePath>
<TargetName>dinput8</TargetName>
<IncludePath>$(SolutionDir)\Common;$(SolutionDir)\MinHook\include;$(DXSDK_DIR)\Include;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
@ -83,12 +83,12 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>dinput8</TargetName>
<IncludePath>$(SolutionDir)\Common;$(SolutionDir)\MinHook\include;$(IncludePath)</IncludePath>
<IncludePath>$(SolutionDir)\Common;$(SolutionDir)\MinHook\include;$(DXSDK_DIR)\Include;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>dinput8</TargetName>
<IncludePath>$(SolutionDir)\Common;$(SolutionDir)\MinHook\include;$(IncludePath)</IncludePath>
<IncludePath>$(SolutionDir)\Common;$(SolutionDir)\MinHook\include;$(DXSDK_DIR)\Include;$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
@ -129,6 +129,7 @@
<SDLCheck>true</SDLCheck>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -163,6 +164,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="Context.h" />
<ClInclude Include="IDirect3DVertexBuffer9.h" />
<ClInclude Include="Wrapper.h" />
<ClInclude Include="IDirect3D9.h" />
<ClInclude Include="IDirect3DDevice9.h" />
@ -189,6 +191,7 @@
</ClCompile>
<ClCompile Include="IDirect3D9.cpp" />
<ClCompile Include="IDirect3DDevice9.cpp" />
<ClCompile Include="IDirect3DVertexBuffer9.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>

View file

@ -39,6 +39,9 @@
<ClInclude Include="Wrapper.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="IDirect3DVertexBuffer9.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
@ -59,6 +62,9 @@
<ClCompile Include="Context.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="IDirect3DVertexBuffer9.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="exports.def">

View file

@ -13,3 +13,10 @@ D3DPERF_SetRegion=_D3DPERF_SetRegion @26
DirectInput8Create=_DirectInput8Create
XInputGetState=_XInputGetState @2
XInputSetState=_XInputSetState @3
XInputGetCapabilities=_XInputGetCapabilities @4
XInputEnable=_XInputEnable @5
XInputGetDSoundAudioDeviceGuids=_XInputGetDSoundAudioDeviceGuids @6
XInputGetBatteryInformation=_XInputGetBatteryInformation @7
XInputGetKeystroke=_XInputGetKeystroke @8