Globals are guaranteed to exist from the moment the code enters main/wmain/WinMain/wWinMain/DllMain and are guaranteed to exist until the code exits the main function.
While it isn't accurate, the startup code essentially does:
void execute_main()
{
//Other stuff
initialise_globals();
invoke_main();
cleanup_globals();
exit();
}
If there is a major concern that the handler may use something that gets destroyed, use SetConsoleCtlHandler again just before the main funtion returns to remove the handler. Passing in the same pointer to the handler function as was used when the handler was registered, but use FALSE for the second parameter should remove the handler.