diff --git a/src/conio/ansi_cio.c b/src/conio/ansi_cio.c
index b4e47878bc3e141d5937ef6ca8a74aa028ff091d..1cfd4dc56a111cf9aa5651d3ce812c084c0ddda0 100644
--- a/src/conio/ansi_cio.c
+++ b/src/conio/ansi_cio.c
@@ -68,6 +68,12 @@ static int		ansi_raw_inch;
 static WORD	*ansivmem;
 static int		force_move=1;
 
+static DWORD orig_in_mode;
+static DWORD orig_out_mode;
+static CONSOLE_SCREEN_BUFFER_INFOEX orig_sbiex = {
+	.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX),
+};
+
 /* Control sequence table definitions. */
 typedef struct
 {
@@ -908,12 +914,20 @@ void ansi_textmode(int mode)
 	ansiy=1;
 }
 
-#ifdef __unix__
 void ansi_fixterm(void)
 {
+#ifdef _WIN32
+	if (isatty(fileno(stdin)))
+		SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), orig_in_mode);
+	if (isatty(fileno(stdout))) {
+		HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
+		SetConsoleMode(h, orig_out_mode);
+		SetConsoleScreenBufferInfoEx(h, &orig_sbiex);
+	}
+#else
 	tcsetattr(STDIN_FILENO,TCSANOW,&tio_default);
-}
 #endif
+}
 
 #ifndef ENABLE_EXTENDED_FLAGS
 #define ENABLE_INSERT_MODE		0x0020
@@ -951,6 +965,7 @@ int ansi_initio_cb(void)
 	HANDLE h;
 	if(isatty(fileno(stdin))) {
 		h = GetStdHandle(STD_INPUT_HANDLE);
+		GetConsoleMode(h, &orig_in_mode);
 		conmode = ENABLE_VIRTUAL_TERMINAL_INPUT;
 		if(!SetConsoleMode(h, conmode))
 			return(0);
@@ -958,6 +973,11 @@ int ansi_initio_cb(void)
 
 	if(isatty(fileno(stdout))) {
 		h = GetStdHandle(STD_OUTPUT_HANDLE);
+		GetConsoleMode(h, &orig_out_mode);
+		GetConsoleScreenBufferInfoEx(h, &orig_sbiex);
+		// FFS Microsoft, get your shut together.
+		orig_sbiex.srWindow.Bottom++;
+		orig_sbiex.srWindow.Right++;
 		conmode = ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_PROCESSED_OUTPUT;
 		if(!SetConsoleMode(h, conmode))
 			return(0);
@@ -984,6 +1004,7 @@ int ansi_initio_cb(void)
 				ansi_writestr_cb(seq, slen);
 		}
 	}
+	atexit(ansi_fixterm);
 #else
 	struct termios tio_raw;
 
diff --git a/src/conio/win32cio.c b/src/conio/win32cio.c
index b7a820704ff1ddf9ac85f03497011840122c2716..feae83dedbd3c3b43d74c5ab9b52548522eb9ee9 100644
--- a/src/conio/win32cio.c
+++ b/src/conio/win32cio.c
@@ -390,6 +390,9 @@ int win32_getch(void)
 
 static DWORD	orig_in_conmode=0;
 static DWORD	orig_out_conmode=0;
+static CONSOLE_SCREEN_BUFFER_INFOEX orig_sbiex = {
+	.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX),
+};
 static void *	win32_suspendbuf=NULL;
 
 #ifndef CONSOLE_FULLSCREEN_MODE
@@ -484,12 +487,6 @@ BOOL NT_GetConsoleDisplayMode(DWORD* mode)
 }
 
 
-void RestoreDisplayMode(void)
-{
-	if(orig_display_mode==0)
-		NT_SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE),CONSOLE_WINDOWED_MODE);
-}
-
 void win32_suspend(void)
 {
 	HANDLE h;
@@ -500,6 +497,16 @@ void win32_suspend(void)
 		SetConsoleMode(h, orig_in_conmode);
 }
 
+void RestoreDisplayMode(void)
+{
+	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
+	if(orig_display_mode==0)
+		NT_SetConsoleDisplayMode(h,CONSOLE_WINDOWED_MODE);
+	win32_suspend();
+	SetConsoleScreenBufferInfoEx(h, &orig_sbiex);
+	SetConsoleScreenBufferInfoEx(h, &orig_sbiex);
+}
+
 void win32_resume(void)
 {
 	DWORD	conmode;
@@ -545,6 +552,10 @@ int win32_initciolib(int inmode)
 	if((h=GetStdHandle(STD_OUTPUT_HANDLE))==INVALID_HANDLE_VALUE
 		|| !GetConsoleMode(h, &orig_out_conmode))
 		return(0);
+	GetConsoleScreenBufferInfoEx(h, &orig_sbiex);
+	// FFS Microsoft, get your shut together.
+	orig_sbiex.srWindow.Bottom++;
+	orig_sbiex.srWindow.Right++;
 	conmode=orig_out_conmode;
 	conmode&=~ENABLE_PROCESSED_OUTPUT;
 	conmode&=~ENABLE_WRAP_AT_EOL_OUTPUT;
@@ -623,8 +634,8 @@ int win32_initciolib(int inmode)
 	NT_GetConsoleDisplayMode(&orig_display_mode);
 	if(inmode==CIOLIB_MODE_CONIO_FULLSCREEN) {
 		NT_SetConsoleDisplayMode(h,CONSOLE_FULLSCREEN_MODE);
-		atexit(RestoreDisplayMode);
 	}
+	atexit(RestoreDisplayMode);
 	cio_api.mouse=1;
 	cio_api.options = CONIO_OPT_BRIGHT_BACKGROUND | CONIO_OPT_CUSTOM_CURSOR | CONIO_OPT_SET_TITLE;
 	return(1);