179 lines
3.9 KiB
C
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;
|
|
|
|
} |