Hola, mira yo entiendo en ese codigo que la segunda vez que se ejecuta, queres autoescrivir la aplicacion en ejecución, deverias hacer una comprovación de donde se encuentra el ejecutable, es decir si se ejecuta en una carpeta que no sea Environ("APPDATA") , lo copias en Environ("APPDATA") y lo pones en el registro, de lo contrario si estan en Environ("APPDATA"), saltas todos estos paso.
vi en el hacker.net que pusiste appdata en vez de temp, y si tengo entendido que es mejor.
Saludos.
PD: cuando escribas en el registro el path, ponelo entre comillas porque si el path donde esta el ejecutable tiene espacios no va a andar, o bien usa shortpath.