Вы компилируете функцию в двоичный код и на месте же вызываете. Так что есть вопросы.
1. Функции обеспечили правильное соглашение вызова?
Мне что-то кажется, что при подобной ручной компиляции проще работать с соглашением PASCAL или STDCALL — ну, шут его знает.
2. VirtualProtect работает с целыми страницами. Так что на куске памяти из сегмента данных (ну или из стека, полного кода не вижу) она в лучшем случае откажет, в худшем ничего не сделает. Проверьте, была ли ошибка.
3. Первый параметр должен быть source, а не &source.