Вы получаете это из точки входа DllMain(), первого аргумента. Написать один, сохранить его в глобальной переменной:
HMODULE DllHandle;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) DllHandle = hModule;
return TRUE;
}
Там в недокументированная хак, который работает на любой версии 32-битных и 64-битных Windows, которые я видел. HMODULE из DLL имеет то же значение, как базовый адрес модуля:
static HMODULE GetThisDllHandle()
{
MEMORY_BASIC_INFORMATION info;
size_t len = VirtualQueryEx(GetCurrentProcess(), (void*)GetThisDllHandle, &info, sizeof(info));
assert(len == sizeof(info));
return len ? (HMODULE)info.AllocationBase : NULL;
}