Skip to content

Commit c5b9782

Browse files
committed
properly handle D3DCreate calls
do not reload things, just route call and hope it works properly
1 parent b2850db commit c5b9782

File tree

3 files changed

+27
-31
lines changed

3 files changed

+27
-31
lines changed

loader_core/gw2al_api_impl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ gw2al_hashed_name gw2al_core__hash_name(wchar_t * name)
3939

4040
void gw2al_core__client_unload()
4141
{
42+
LOG_DEBUG(L"core", L"client unload recived");
4243
loader_core::instance.SignalUnload();
4344

4445
if (logFile)

loader_core/loader_core.cpp

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -87,39 +87,18 @@ void loader_core::log_text_fmt(gw2al_log_level level, const wchar_t * source, co
8787
gw2al_core__log_text(level, (wchar_t*)source, buf);
8888
}
8989

90-
IDirect3D9 * loader_core::OnD3DCreate(UINT sdkVer)
90+
IDirect3D9* loader_core::RouteD3DCreate(UINT sdkVer)
9191
{
92-
if (SwitchState(LDR_ADDON_LOAD))
93-
{
94-
bool isFirstLoad = gw2al_core__init();
95-
96-
LOG_INFO(L"core", L"Addon loader v%u.%u (%S) %S", LOADER_CORE_VER_MAJOR, LOADER_CORE_VER_MINOR, LOADER_CORE_VER_NAME,
97-
isFirstLoad ? "initialized" : "reinit");
98-
}
99-
else {
100-
LOG_WARNING(L"core", L"D3DCreate called twice without proper unload. Trying to unload addons.");
101-
102-
SignalUnload();
103-
104-
if (!SwitchState(LDR_ADDON_LOAD))
105-
{
106-
LOG_ERROR(L"core", L"Failed to unload addons, failing D3DCreate call");
107-
return nullptr;
108-
}
109-
110-
}
111-
112-
LoadAddonsFromDir(L"addons");
113-
114-
IDirect3D9* (*d3d9_create_hook)() = (IDirect3D9* (*)())gw2al_core__query_function(GW2AL_CORE_FUNN_D3DCREATE_HOOK);
92+
IDirect3D9* (*d3d9_create_hook)() = (IDirect3D9 * (*)())gw2al_core__query_function(GW2AL_CORE_FUNN_D3DCREATE_HOOK);
11593

11694
IDirect3D9* ret = NULL;
11795

11896
if (d3d9_create_hook)
11997
{
12098
LOG_DEBUG(L"core", L"Calling D3D9Create, hook = 0x%016llX", d3d9_create_hook);
12199
ret = d3d9_create_hook();
122-
} else
100+
}
101+
else
123102
{
124103
LOG_DEBUG(L"core", L"Loading system d3d9.dll");
125104

@@ -132,18 +111,33 @@ IDirect3D9 * loader_core::OnD3DCreate(UINT sdkVer)
132111
typedef IDirect3D9* (WINAPI* Direct3DCreate9Func)(UINT sdkver);
133112

134113
Direct3DCreate9Func origDirect3DCreate9 = (Direct3DCreate9Func)GetProcAddress(sys_d3d9, "Direct3DCreate9");
135-
IDirect3D9* res = origDirect3DCreate9(sdkVer);
136-
137-
ret = res;
138-
}
139-
140-
SwitchState(LDR_INGAME);
114+
ret = origDirect3DCreate9(sdkVer);
115+
}
141116

142117
LOG_DEBUG(L"core", L"ID3D9 = 0x%016llX", ret);
143118

144119
return ret;
145120
}
146121

122+
IDirect3D9 * loader_core::OnD3DCreate(UINT sdkVer)
123+
{
124+
if (SwitchState(LDR_ADDON_LOAD))
125+
{
126+
bool isFirstLoad = gw2al_core__init();
127+
128+
LOG_INFO(L"core", L"Addon loader v%u.%u (%S) %S", LOADER_CORE_VER_MAJOR, LOADER_CORE_VER_MINOR, LOADER_CORE_VER_NAME,
129+
isFirstLoad ? "initialized" : "reinit");
130+
131+
LoadAddonsFromDir(L"addons");
132+
133+
SwitchState(LDR_INGAME);
134+
}
135+
else
136+
LOG_WARNING(L"core", L"D3DCreate called twice without proper unload. If your addon is not working, make sure you handle this situation!");
137+
138+
return RouteD3DCreate(sdkVer);
139+
}
140+
147141
void loader_core::SignalUnload()
148142
{
149143
if (SwitchState(LDR_UNLOAD))

loader_core/loader_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class loader_core {
2020
loader_core();
2121
~loader_core();
2222

23+
IDirect3D9* RouteD3DCreate(UINT sdkVer);
2324
IDirect3D9* OnD3DCreate(UINT sdkVer);
2425
void SignalUnload();
2526

0 commit comments

Comments
 (0)