Как правильно выполнить перезапуск программы?
Цель такая: нужно обновить программу.
Алгоритм такой: программа скачивает обновление, проверяет на валидность, обозначает как-то что доступно обновление (например пишет ключ в реестр) и перезапускает себя (как firefox, например). При запуске программа проверяет ключ в реестре, и, если доступно обновление — заменяет файлы новыми и дальше работает в штатном режиме.
Остается два узких места: как обновить сам exe-шник?
и как организовать перезагрузку?
но если первую проблему можно как-то обойти: сам exe-шник представляет из себя лоадер, который умеет обновлять основную программу и загружать ее и сам не обновляется. А во-вторых, его можно переименовать во время работы и записать новую версию (не знаю только всегда и везде ли это будет работать?),
то со второй что-то никак не справиться.
Подскажите пожалуйста, как решить данную проблему или укажите как правильно делают обновления программ. Не обязательно подробно объяснять, главное дать пинок в нужном направлении

Заранее благодарен.