По какой-то причине я не могу ответить прямо на ответ Сума, но вы также можете просто сделать следующее:
extern "C" struct IMAGE_DOS_HEADER __ImageBase; // On platforms other than Win32/Win64, this MAY be a different header type...
...
printf_s("base: %p", &__ImageBase);
__ ImageBase определяется компоновщиком (по крайней мере, VC ++), и его адрес даст вам базовый адрес модуля (EXE / DLL), даже если он перемещен во время выполнения.
Там также
printf_s("calling module's base: %p\n", GetModuleHandle(NULL));
, который может дать вам то же базовое значение адреса ... но есть и другие предостережения для GetModuleHandle (плюс для этого требуется windows.h), поэтому я рекомендую просто придерживаться __ImageBase.
Как уже упоминали другие, ваша проблема, вероятно, связана с перемещением Windows вашего модуля. Если в файле модуля нет секции .reloc, то этот файл нельзя перемещать, и в этом случае это похоже на то, что вы бегаете на батутах или что-то вроде предложенного rwong.