Well, I think as you point out those functions should be able to handle re-entrancy.  By moving the setting of m_OnSuspend you avoid callback->OnSleep() being executed twice for example.

But I should think that your code that you add should also be able to handle re-entrancy.  It seems the idea is quite simple:

1. The ping/wake to the network server has to be waited on (plus any bringing up of the network) so the function needs to be blocking.
2. The app thread loop should still be processed periodically to both display a progress bar to the user, and also to allow messages etc. to be processed as required.

Thus, if on app thread, you need to spin a while loop, periodically running the app loop.  If not on app thread you can just wait on a condition. This type of handling is done in CDirectory::GetDirectory() and elsewhere.  I'm not sure why this wouldn't work in this case.  You could well get some sort of deadlock I guess, where app thread is waiting on some other thread/critical section which is waiting on your ping/wake event.  In that case it's a problem with that thread holding a critical section while doing something that takes time, not your code, however.