[C++] 纯文本查看 复制代码
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
static HMODULE g_realDll = NULL;
static void LoadRealDll(void) {
if (g_realDll) return;
char sysPath[MAX_PATH];
GetSystemDirectoryA(sysPath, MAX_PATH);
char dllPath[MAX_PATH];
wsprintfA(dllPath, "%s\\version.dll", sysPath);
g_realDll = LoadLibraryA(dllPath);
}
#define DECLARE_PROXY(ret, name, args, callargs) \
typedef ret (WINAPI *PFN_##name) args; \
static PFN_##name g_##name = NULL; \
extern "C" ret WINAPI Proxy_##name args \
{ \
__pragma(comment(linker, "/EXPORT:" #name "=" __FUNCDNAME__)) \
LoadRealDll(); \
if (!g_##name && g_realDll) \
g_##name = (PFN_##name)GetProcAddress(g_realDll, #name); \
if (!g_##name) { \
SetLastError(ERROR_PROC_NOT_FOUND); \
return (ret)0; \
} \
return g_##name callargs; \
}
DECLARE_PROXY(BOOL, GetFileVersionInfoA, (LPCSTR a, DWORD b, DWORD c, LPVOID d), (a, b, c, d))
DECLARE_PROXY(BOOL, GetFileVersionInfoW, (LPCWSTR a, DWORD b, DWORD c, LPVOID d), (a, b, c, d))
DECLARE_PROXY(DWORD, GetFileVersionInfoSizeA, (LPCSTR a, LPDWORD b), (a, b))
DECLARE_PROXY(DWORD, GetFileVersionInfoSizeW, (LPCWSTR a, LPDWORD b), (a, b))
DECLARE_PROXY(BOOL, VerQueryValueA, (LPCVOID a, LPCSTR b, LPVOID* c, PUINT d), (a, b, c, d))
DECLARE_PROXY(BOOL, VerQueryValueW, (LPCVOID a, LPCWSTR b, LPVOID* c, PUINT d), (a, b, c, d))
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
LoadRealDll();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}