lo he mirado por encima, pero dudo que funcione asi como lo planteas. en ningun caso estas verificando el resultado de las otras funciones y todo el proceso depende de ese resultado.
Otra cosa:
Inyectar ProcessHandle, GetAddr(AddressOf SMain)
Private Function Inyectar(ProcessHandle As Long, ByVal EntryPoint As Long)
....
..
CreateRemoteThread ProcessHandle, ByVal 0, 0, ByVal EntryPoint, ByVal Module, 0, TID
El thread lo lanzas en una direccion que si se da el caso que exista no sabes que contiene.
dale un ojo a esto
http://msdn.microsoft.com/en-us/library/ms682437%28v=vs.85%29.aspxy a esto
http://msdn.microsoft.com/en-us/library/aa366890%28VS.85%29.aspx