You get it from the DllMain() entrypoint, 1st argument. Write one, store it in a global variable:
HMODULE DllHandle;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) DllHandle = hModule;
return TRUE;
}
There's an undocumented hack that works on any version of 32-bit and 64-bit Windows that I've seen. The HMODULE of a DLL is the same value as the module's base address:
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;
}