progwrp/module.c
2025-12-13 23:37:26 +01:00

179 lines
3.9 KiB
C

#include "progwrp.h"
#include "export.h"
#include "implementations.h"
#include "strsafe.h"
UNICODE_STRING g_DllPath;
HMODULE WINAPI Implementation_LoadLibraryA(LPCSTR lpLibFileName)
{
return Implementation_LoadLibraryExA(lpLibFileName, 0, 0);
}
HMODULE WINAPI Implementation_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
{
HMODULE hModule;
ANSI_STRING DllPathA;
UNICODE_STRING DllPath;
ULONG LoadFlags;
hModule = NULL;
RtlInitAnsiString(&DllPathA, lpLibFileName);
RtlAnsiStringToUnicodeString(&DllPath, &DllPathA, TRUE);
LoadFlags = 0;
if (dwFlags & DONT_RESOLVE_DLL_REFERENCES)
LoadFlags |= DONT_RESOLVE_DLL_REFERENCES;
if (dwFlags & LOAD_LIBRARY_AS_DATAFILE)
LoadFlags |= DONT_RESOLVE_DLL_REFERENCES;
LdrLoadDll(NULL, &LoadFlags, &DllPath, &hModule);
if (hModule)
TLSInit_DllMain_ProcessAttach_Internal(hModule);
else
{
if (g_strstr(lpLibFileName, "dxgi") ||
g_strstr(lpLibFileName, "bcryptprimitives") ||
g_strstr(lpLibFileName, "api-ms-win-core-fibers-l1-1-0") ||
g_strstr(lpLibFileName, "api-ms-win-core-fibers-l1-1-1"))
return GetModuleHandleA("progwrp.dll");
}
RtlFreeUnicodeString(&DllPath);
return hModule;
}
HMODULE WINAPI Implementation_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
{
UNICODE_STRING DllPath;
HMODULE hModule = 0;
ULONG LoadFlags;
RtlInitUnicodeString(&DllPath, lpLibFileName);
LoadFlags = 0;
if (dwFlags & DONT_RESOLVE_DLL_REFERENCES)
LoadFlags |= DONT_RESOLVE_DLL_REFERENCES;
if (dwFlags & LOAD_LIBRARY_AS_DATAFILE)
LoadFlags |= DONT_RESOLVE_DLL_REFERENCES;
LdrLoadDll(NULL, &LoadFlags, &DllPath, &hModule);
if (hModule)
TLSInit_DllMain_ProcessAttach_Internal(hModule);
else
{
if (g_wcsstr(lpLibFileName, L"dxgi") ||
g_wcsstr(lpLibFileName, L"bcryptprimitives") ||
g_wcsstr(lpLibFileName, L"api-ms-win-core-fibers-l1-1-0") ||
g_wcsstr(lpLibFileName, L"api-ms-win-core-fibers-l1-1-1"))
return GetModuleHandleA("progwrp.dll");
}
return hModule;
}
HMODULE WINAPI Implementation_LoadLibraryW(LPCWSTR lpLibFileName)
{
return Implementation_LoadLibraryExW(lpLibFileName, 0, 0);
}
FARPROC WINAPI Implementation_GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
)
{
ANSI_STRING ProcNameStr;
PANSI_STRING pStr;
ULONG_PTR pfnFunc = NULL;
ULONG Ordinal = 0;
if(lpProcName > 0x10000)
{
RtlInitAnsiString(&ProcNameStr, lpProcName);
pStr = &ProcNameStr;
}
else
{
pStr = NULL;
if(lpProcName > 0)
Ordinal = lpProcName;
}
if(LdrGetProcedureAddress(hModule, pStr, Ordinal, &pfnFunc) != 0)
{
LdrGetProcedureAddress(GetModuleHandleA("progwrp.dll"), pStr, Ordinal, &pfnFunc);
}
return pfnFunc;
}
BOOL WINAPI Implementation_GetModuleHandleExA(
DWORD dwFlags,
LPCSTR lpModuleName,
HMODULE *phModule
)
{
if (phModule) {
if (lpModuleName)
*phModule = Implementation_LoadLibraryA(lpModuleName);
else
*phModule = GetModuleHandleA(NULL);
}
else
return FALSE;
return TRUE;
}
BOOL WINAPI Implementation_GetModuleHandleExW(
DWORD dwFlags,
LPCWSTR lpModuleName,
HMODULE *phModule
)
{
if (phModule) {
if (lpModuleName)
*phModule = Implementation_LoadLibraryW(lpModuleName);
else
*phModule = GetModuleHandleA(NULL);
}
else
return FALSE;
return TRUE;
}
BOOL WINAPI Implementation_SetDllDirectoryW(
LPCWSTR lpPathName
)
{
/* PWSTR PathStr;
DWORD PathLen;
PathLen = GetEnvironmentVariableW(L"PATH", NULL, 0);
PathStr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (PathLen + MAX_PATH + 1)*sizeof(WCHAR));
if(PathStr)
{
EnterCriticalSection(&SrwSharedCs2);
GetEnvironmentVariableW(L"PATH", PathStr, (PathLen + MAX_PATH + 1));
StringCchCatW(PathStr, (PathLen + MAX_PATH + 1), L';');
StringCchCatW(PathStr, (PathLen + MAX_PATH + 1), lpPathName);
SetEnvironmentVariableW(L"PATH", PathStr);
LeaveCriticalSection(&SrwSharedCs2);
HeapFree(GetProcessHeap(), 0, PathStr);
return TRUE;
}
else*/
return FALSE;
}