mirror of
https://github.com/taviso/loadlibrary
synced 2026-06-08 17:42:38 +00:00
116 lines
3.1 KiB
C
116 lines
3.1 KiB
C
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
#include <search.h>
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "winnt_types.h"
|
|
#include "pe_linker.h"
|
|
#include "ntoskernel.h"
|
|
#include "log.h"
|
|
#include "winexports.h"
|
|
#include "util.h"
|
|
#include "winstrings.h"
|
|
|
|
|
|
static HANDLE WINAPI LoadLibraryExW(PVOID lpFileName, HANDLE hFile, DWORD dwFlags)
|
|
{
|
|
char *name = CreateAnsiFromWide(lpFileName);
|
|
|
|
DebugLog("%p [%s], %p, %#x", lpFileName, name, hFile, dwFlags);
|
|
|
|
free(name);
|
|
|
|
return (HANDLE) 'LOAD';
|
|
}
|
|
|
|
static HANDLE WINAPI LoadLibraryW(PVOID lpFileName)
|
|
{
|
|
DebugLog("%p", lpFileName);
|
|
|
|
return (HANDLE) 'LOAD';
|
|
}
|
|
|
|
static PVOID WINAPI GetProcAddress(HANDLE hModule, PCHAR lpProcName)
|
|
{
|
|
ENTRY key = { lpProcName }, *item;
|
|
|
|
assert(hModule == (HANDLE) NULL || hModule == (HANDLE) 'LOAD' || hModule == (HANDLE) 'MPEN' || hModule == (HANDLE) 'VERS' || hModule == (HANDLE) 'KERN');
|
|
|
|
if (hsearch_r(key, FIND, &item, &crtexports)) {
|
|
return item->data;
|
|
}
|
|
|
|
DebugLog("FIXME: %s unresolved", lpProcName);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static HANDLE WINAPI GetModuleHandleW(PVOID lpModuleName)
|
|
{
|
|
char *name = CreateAnsiFromWide(lpModuleName);
|
|
|
|
DebugLog("%p [%s]", lpModuleName, name);
|
|
|
|
free(name);
|
|
|
|
if (lpModuleName && memcmp(lpModuleName, L"mpengine.dll", sizeof(L"mpengine.dll")) == 0)
|
|
return (HANDLE) 'MPEN';
|
|
|
|
if (lpModuleName && memcmp(lpModuleName, L"bcrypt.dll", sizeof(L"bcrypt.dll")) == 0)
|
|
return (HANDLE) 'LOAD';
|
|
|
|
if (lpModuleName && memcmp(lpModuleName, L"KERNEL32.DLL", sizeof(L"KERNEL32.DLL")) == 0)
|
|
return (HANDLE) 'KERN';
|
|
|
|
if (lpModuleName && memcmp(lpModuleName, L"kernel32.dll", sizeof(L"kernel32.dll")) == 0)
|
|
return (HANDLE) 'KERN';
|
|
|
|
if (lpModuleName && memcmp(lpModuleName, L"version.dll", sizeof(L"version.dll")) == 0)
|
|
return (HANDLE) 'VERS';
|
|
return (HANDLE) NULL;
|
|
}
|
|
|
|
static DWORD WINAPI GetModuleFileNameA(HANDLE hModule, PCHAR lpFilename, DWORD nSize)
|
|
{
|
|
DebugLog("%p, %p, %u", hModule, lpFilename, nSize);
|
|
|
|
strncpy(lpFilename, "C:\\dummy\\fakename.exe", nSize);
|
|
|
|
return strlen(lpFilename);
|
|
}
|
|
|
|
static DWORD WINAPI GetModuleFileNameW(HANDLE hModule, PWCHAR lpFilename, DWORD nSize)
|
|
{
|
|
DebugLog("%p, %p, %u", hModule, lpFilename, nSize);
|
|
|
|
if (nSize > strlen("C:\\dummy\\fakename.exe")) {
|
|
memcpy(lpFilename, L"C:\\dummy\\fakename.exe", sizeof(L"C:\\dummy\\fakename.exe"));
|
|
}
|
|
|
|
return strlen("C:\\dummy\\fakename.exe");
|
|
}
|
|
|
|
static HANDLE WINAPI GetModuleHandleA(PCHAR lpModuleName)
|
|
{
|
|
DebugLog("%p [%s]", lpModuleName, lpModuleName);
|
|
|
|
return (HANDLE) NULL;
|
|
}
|
|
|
|
static VOID WINAPI FreeLibrary(PVOID hLibModule)
|
|
{
|
|
DebugLog("FreeLibrary(%p)", hLibModule);
|
|
}
|
|
|
|
DECLARE_CRT_EXPORT("FreeLibrary", FreeLibrary);
|
|
DECLARE_CRT_EXPORT("LoadLibraryExW", LoadLibraryExW);
|
|
DECLARE_CRT_EXPORT("LoadLibraryW", LoadLibraryW);
|
|
DECLARE_CRT_EXPORT("GetProcAddress", GetProcAddress);
|
|
DECLARE_CRT_EXPORT("GetModuleHandleW", GetModuleHandleW);
|
|
DECLARE_CRT_EXPORT("GetModuleHandleA", GetModuleHandleA);
|
|
DECLARE_CRT_EXPORT("GetModuleFileNameA", GetModuleFileNameA);
|
|
DECLARE_CRT_EXPORT("GetModuleFileNameW", GetModuleFileNameW);
|