diff --git a/qemu-timer.c b/qemu-timer.c
index 95814af..86d77a6 100644
--- a/qemu-timer.c
+++ b/qemu-timer.c
@@ -972,7 +972,10 @@ static int win32_start_timer(struct qemu_alarm_timer *t)
     timeGetDevCaps(&tc, sizeof(tc));
 
     data->period = tc.wPeriodMin;
-    timeBeginPeriod(data->period);
+    if (timeBeginPeriod(data->period) != TIMERR_NOERROR) {
+        fprintf(stderr, "Failed to initialize win32 alarm timer\n");
+        return -1;
+    }
 
     flags = TIME_CALLBACK_FUNCTION;
     if (alarm_has_dynticks(t))
@@ -990,6 +993,7 @@ static int win32_start_timer(struct qemu_alarm_timer *t)
         fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n",
                 GetLastError());
         timeEndPeriod(data->period);
+        data->period = 0;
         return -1;
     }
 
@@ -1000,8 +1004,12 @@ static void win32_stop_timer(struct qemu_alarm_timer *t)
 {
     struct qemu_alarm_win32 *data = t->priv;
 
-    timeKillEvent(data->timerId);
-    timeEndPeriod(data->period);
+    if (data->timerId) {
+        timeKillEvent(data->timerId);
+    }
+    if (data->period) {
+        timeEndPeriod(data->period);
+    }
 }
 
 static void win32_rearm_timer(struct qemu_alarm_timer *t)
@@ -1027,6 +1035,7 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t)
                 GetLastError());
 
         timeEndPeriod(data->period);
+        data->period = 0;
         exit(1);
     }
 }
@@ -1061,6 +1070,7 @@ int init_timer_alarm(void)
     t->pending = 1;
     alarm_timer = t;
     qemu_add_vm_change_state_handler(alarm_timer_on_change_state_rearm, t);
+    atexit(quit_timers);
 
     return 0;
 
diff --git a/vl.c b/vl.c
index 0292184..c4b25b0 100644
--- a/vl.c
+++ b/vl.c
@@ -3118,7 +3118,6 @@ int main(int argc, char **argv, char **envp)
     os_setup_post();
 
     main_loop();
-    quit_timers();
     net_cleanup();
 
     return 0;
