diff --git a/windows/init.c b/windows/init.c
index d4533f9b478009dbc269a201078883cfdffd5cbc..669092347837772f4efbc8ff1f31625ee10d4263 100644
--- a/windows/init.c
+++ b/windows/init.c
@@ -27,11 +27,31 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <windows.h>
+#ifdef _MSC_VER
+#include <crtdbg.h>
+#endif
 #include "sleep.h"
 
 extern BOOL WINAPI console_sighandler(DWORD evt);
 
+#ifdef _MSC_VER
+void invalid_param_handler(const wchar_t *expr, const wchar_t *fun, const wchar_t *file, unsigned int line, uintptr_t p) {
+}
+#endif
+
 void init() {
+#ifdef _MSC_VER
+    // Disable the 'Debug Error!' dialog for assertions failures and the likes,
+    // instead write messages to the debugger output and terminate.
+    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
+    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
+    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
+
+    // Disable 'invalid parameter handling' which is for instance invoked when
+    // passing invalid file descriptors to functions like lseek() and make the
+    // functions called behave properly by setting errno to EBADF/EINVAL/..
+    _set_invalid_parameter_handler(invalid_param_handler);
+#endif
     SetConsoleCtrlHandler(console_sighandler, TRUE);
     init_sleep();
 #ifdef __MINGW32__