changeset 10264:c036c0f636d5 v8.0.0029

commit https://github.com/vim/vim/commit/cea912af725c54f4727a0565e31661f6b29c6bb1 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Oct 12 14:20:24 2016 +0200 patch 8.0.0029 Problem: Code for MS-Windows is complicated because of the exceptions for old systems. Solution: Drop support for MS-Windows older than Windows XP. (Ken Takata)
author Christian Brabandt <cb@256bit.org>
date Wed, 12 Oct 2016 14:30:05 +0200
parents b758a787983a
children d1b0148ea13e
files runtime/doc/gui_w32.txt runtime/doc/os_win32.txt runtime/doc/todo.txt src/GvimExt/Makefile src/Make_mvc.mak src/evalfunc.c src/ex_cmds.c src/ex_docmd.c src/gui_w32.c src/if_cscope.c src/misc1.c src/misc2.c src/option.c src/os_mswin.c src/os_win32.c src/os_win32.h src/proto/os_mswin.pro src/proto/os_win32.pro src/version.c
diffstat 19 files changed, 390 insertions(+), 1313 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/gui_w32.txt
+++ b/runtime/doc/gui_w32.txt
@@ -49,10 +49,6 @@ If you want Vim to start with a maximize
 vimrc or gvimrc file: >
 	au GUIEnter * simalt ~x
 <
-								*gui-w32s*
-There is a specific version of gvim.exe that runs under the Win32s subsystem
-of Windows 3.1 or 3.11.  See |win32s|.
-
 
 Using Vim as a plugin					*gui-w32-windowid*
 
@@ -100,9 +96,10 @@ 7. <OK>
 You can also install Vim in the "Send To" menu:
 1. Start a Windows Explorer
 2. Navigate to your sendto directory:
-   Windows 95: %windir%\sendto (e.g. "c:\windows\sendto")
    Windows NT: %windir%\profiles\%user%\sendto (e.g.
-	       "c:\winnt\profiles\mattha\sendto").
+	       "c:\winnt\profiles\mattha\sendto")
+   Windows XP: C:\Documents and Settings\%user%\SendTo
+   Windows Vista: C:\Users\%user%\AppData\Roaming\Microsoft\Windows\SendTo .
 3. Right-click in the file pane and select New->Shortcut
 4. Follow the shortcut wizard, using the full path to VIM/GVIM.
 
@@ -274,35 +271,17 @@ WARNING: If you close this window with t
 question if you really want to kill the application, Vim may be killed too!
 (This does not apply to commands run asynchronously with ":!start".)
 
-In Windows 95, the window in which the commands are executed is always 25x80
-characters, to be as DOS compatible as possible (this matters!).  The default
-system font is used.  On NT, the window will be the default you have set up for
-"Console" in Control Panel.  On Win32s, the properties of the DOS box are
-determined by _default.pif in the windows directory.
-
-							*msdos-mode*
-If you get a dialog that says "This program is set to run in MS-DOS mode..."
-when you run an external program, you can solve this by changing the
-properties of the associated shortcut:
-- Use a Windows Explorer to find the command.com that is used.  It can be
-  c:\command.com, c:\dos\command.com, c:\windows\command.com, etc.
-- With the right mouse button, select properties of this command.com.
-- In the Program tab select "Advanced".
-- Unselect "MS-DOS mode".
-- Click "OK" twice.
+The window in which the commands are executed will be the default you have set
+up for "Console" in Control Panel.
 
 							*win32-!start*
 Normally, Vim waits for a command to complete before continuing (this makes
 sense for most shell commands which produce output for Vim to use).  If you
 want Vim to start a program and return immediately, you can use the following
-syntax on W95 & NT: >
+syntax: >
 	:!start [/min] {command}
 The optional "/min" causes the window to be minimized.
 
-On Win32s, you will have to go to another window instead.  Don't forget that
-you must tell Windows 3.1x to keep executing a DOS command in the background
-while you switch back to Vim.
-
 ==============================================================================
 5. Special colors					*win32-colors*
 
@@ -311,7 +290,7 @@ On Win32, the normal DOS colors can be u
 Additionally the system configured colors can also be used.  These are known
 by the names Sys_XXX, where XXX is the appropriate system color name, from the
 following list (see the Win32 documentation for full descriptions).  Case is
-ignored.  Note: On Win32s not all of these colors are supported.
+ignored.
 
 Sys_3DDKShadow		Sys_3DFace			Sys_BTNFace
 Sys_3DHilight		Sys_3DHighlight			Sys_BTNHilight
--- a/runtime/doc/os_win32.txt
+++ b/runtime/doc/os_win32.txt
@@ -1,4 +1,4 @@
-*os_win32.txt*  For Vim version 8.0.  Last change: 2016 Aug 28
+*os_win32.txt*  For Vim version 8.0.  Last change: 2016 Oct 12
 
 
 		  VIM REFERENCE MANUAL    by George Reilly
@@ -7,20 +7,18 @@
 						*win32* *Win32* *MS-Windows*
 This file documents the idiosyncrasies of the Win32 version of Vim.
 
-The Win32 version of Vim works on Windows NT, 95, 98, ME, XP, Vista and
-Windows 7.  There are both console and GUI versions.
+The Win32 version of Vim works on Windows XP, Vista, 7, 8 and 10.  There are
+both console and GUI versions.
 
 The 32 bit version also runs on 64 bit MS-Windows systems.
 
-There is GUI version for use in the Win32s subsystem in Windows 3.1[1].  You
-can also use the 32-bit DOS version of Vim instead.  See |os_msdos.txt|.
-
 1. Known problems		|win32-problems|
 2. Startup			|win32-startup|
 3. Restore screen contents	|win32-restore|
 4. Using the mouse		|win32-mouse|
-5. Running under Windows 3.1	|win32-win3.1|
-6. Win32 mini FAQ		|win32-faq|
+5. Running under Windows 95	|win32-win95|
+6. Running under Windows 3.1	|win32-win3.1|
+7. Win32 mini FAQ		|win32-faq|
 
 Additionally, there are a number of common Win32 and DOS items:
 File locations			|dos-locations|
@@ -43,20 +41,7 @@ The GUI version was made by George V. Re
 For compiling see "src/INSTALLpc.txt".			*win32-compiling*
 
 ==============================================================================
-1. Known problems				*windows95* *win32-problems*
-
-There are a few known problems with running in a console on Windows 95.  As
-far as we know, this is the same in Windows 98 and Windows ME.
-
-Comments from somebody working at Microsoft: "Win95 console support has always
-been and will always be flaky".
-1.  Dead key support doesn't work.
-2.  Resizing the window with ":set columns=nn lines=nn" works, but executing
-    external commands MAY CAUSE THE SYSTEM TO HANG OR CRASH.
-3.  Screen updating is slow, unless you change 'columns' or 'lines' to a
-    non-DOS value.  But then the second problem applies!
-
-If this bothers you, use the 32 bit MS-DOS version or the Win32 GUI version.
+1. Known problems					*win32-problems*
 
 When doing file name completion, Vim also finds matches for the short file
 name.  But Vim will still find and use the corresponding long file name.  For
@@ -141,60 +126,20 @@ When the mouse doesn't work, try disabli
 the console.
 
 ==============================================================================
-5. Running under Windows 3.1				*win32-win3.1*
+5. Running under Windows 95				*win32-win95*
+					*windows95* *windows98* *windowsme*
+Windows 95/98/ME support was removed in patch 8.0.0029  If you want to use it
+you will need to get a version older than that.
 
-						*win32s* *windows-3.1*
+==============================================================================
+6. Running under Windows 3.1				*win32-win3.1*
+
+					*win32s* *windows-3.1* *gui-w32s*
 There was a special version of Gvim that runs under Windows 3.1 and 3.11.
 Support was removed in patch 7.4.1363.
 
 ==============================================================================
-6. Win32 mini FAQ					*win32-faq*
-
-Q. Why does the Win32 version of Vim update the screen so slowly on Windows 95?
-A. The support for Win32 console mode applications is very buggy in Win95.
-   For some unknown reason, the screen updates very slowly when Vim is run at
-   one of the standard resolutions (80x25, 80x43, or 80x50) and the 16-bit DOS
-   version updates the screen much more quickly than the Win32 version.
-   However, if the screen is set to some other resolution, such as by ":set
-   columns=100" or ":set lines=40", screen updating becomes about as fast as
-   it is with the 16-bit version.
-
-   WARNING: Changing 'columns' may make Windows 95 crash while updating the
-   window (complaints --> Microsoft).  Since this mostly works, this has not
-   been disabled, but be careful with changing 'columns'.
-
-   Changing the screen resolution makes updates faster, but it brings
-   additional problems.  External commands (e.g., ":!dir") can cause Vim to
-   freeze when the screen is set to a non-standard resolution, particularly
-   when 'columns' is not equal to 80.  It is not possible for Vim to reliably
-   set the screen resolution back to the value it had upon startup before
-   running external commands, so if you change the number of 'lines' or
-   'columns', be very, very careful.  In fact, Vim will not allow you to
-   execute external commands when 'columns' is not equal to 80, because it is
-   so likely to freeze up afterwards.
-
-   None of the above applies on Windows NT.  Screen updates are fast, no
-   matter how many 'lines' or 'columns' the window has, and external commands
-   do not cause Vim to freeze.
-
-Q. So if the Win32 version updates the screen so slowly on Windows 95 and the
-   16-bit DOS version updates the screen quickly, why would I want to run the
-   Win32 version?
-A. Firstly, the Win32 version isn't that slow, especially when the screen is
-   set to some non-standard number of 'lines' or 'columns'.  Secondly, the
-   16-bit DOS version has some severe limitations: It can't do big changes and
-   it doesn't know about long file names.  The Win32 version doesn't have these
-   limitations and it's faster overall (the same is true for the 32-bit DJGPP
-   DOS version of Vim).  The Win32 version is smarter about handling the
-   screen, the mouse, and the keyboard than the DJGPP version is.
-
-Q. And what about the 16-bit DOS version versus the Win32 version on NT?
-A. There are no good reasons to run the 16-bit DOS version on NT.  The Win32
-   version updates the screen just as fast as the 16-bit version does when
-   running on NT.  All of the above disadvantages apply.  Finally, DOS
-   applications can take a long time to start up and will run more slowly.  On
-   non-Intel NT platforms, the DOS version is almost unusably slow, because it
-   runs on top of an 80x86 emulator.
+7. Win32 mini FAQ					*win32-faq*
 
 Q. How do I change the font?
 A. In the GUI version, you can use the 'guifont' option.  Example: >
@@ -202,47 +147,6 @@ A. In the GUI version, you can use the '
 <  In the console version, you need to set the font of the console itself.
    You cannot do this from within Vim.
 
-Q. When I change the size of the console window with ':set lines=xx' or
-   similar, the font changes! (Win95)
-A. You have the console font set to 'Auto' in Vim's (or your MS-DOS prompt's)
-   properties.  This makes W95 guess (badly!) what font is best.  Set an explicit
-   font instead.
-
-Q. Why can't I paste into Vim when running Windows 95?
-A. In the properties dialog box for the MS-DOS window, go to "MS-DOS
-   Prompt/Misc/Fast pasting" and make sure that it is NOT checked.  You should
-   also do ":set paste" in Vim to avoid unexpected effects.	|'paste'|
-
-Q. How do I type dead keys on Windows 95, in the console version?
-   (A dead key is an accent key, such as acute, grave, or umlaut, that doesn't
-   produce a character by itself, but when followed by another key, produces
-   an accented character, such as a-acute, e-grave, u-umlaut, n-tilde, and so
-   on.  Very useful for most European languages.  English-language keyboard
-   layouts don't use dead keys, as far as we know.)
-A. You don't.  The console mode input routines simply do not work correctly in
-   Windows 95, and I have not been able to work around them.  In the words
-   of a senior developer at Microsoft:
-	Win95 console support has always been and will always be flaky.
-
-	The flakiness is unavoidable because we are stuck between the world of
-	MS-DOS keyboard TSRs like KEYB (which wants to cook the data;
-	important for international) and the world of Win32.
-
-	So keys that don't "exist" in MS-DOS land (like dead keys) have a
-	very tenuous existence in Win32 console land.  Keys that act
-	differently between MS-DOS land and Win32 console land (like
-	capslock) will act flaky.
-
-	Don't even _mention_ the problems with multiple language keyboard
-	layouts...
-
-   You may be able to fashion some sort of workaround with the digraphs
-   mechanism.							|digraphs|
-
-   The best solution is to use the Win32 GUI version gvim.exe.  Alternatively,
-   you can try one of the DOS versions of Vim where dead keys reportedly do
-   work.
-
 Q. How do I type dead keys on Windows NT?
 A. Dead keys work on NT 3.51.  Just type them as you would in any other
    application.
@@ -349,28 +253,6 @@ A. You have two possible solutions depen
 <  The first command runs notepad minimized and the second one runs it
    normally.
 
-Q. I'm using Win32s, and when I try to run an external command like "make",
-   Vim doesn't wait for it to finish!  Help!
-A. The problem is that a 32-bit application (Vim) can't get notification from
-   Windows that a 16-bit application (your DOS session) has finished.  Vim
-   includes a work-around for this, but you must set up your DOS commands to
-   run in a window, not full-screen.  Unfortunately the default when you
-   install Windows is full-screen.  To change this:
-   1) Start PIF editor (in the Main program group).
-   2) Open the file "_DEFAULT.PIF" in your Windows directory.
-   3) Changes the display option from "Full Screen" to "Windowed".
-   4) Save and exit.
-
-   To test, start Vim and type >
-	:!dir C:\<CR>".
-<  You should see a DOS box window appear briefly with the directory listing.
-
-Q. I use Vim under Win32s and NT.  In NT, I can define the console to default to
-   50 lines, so that I get a 80x50 shell when I ':sh'.  Can I do the same in
-   W3.1x, or am I stuck with 80x25?
-A. Edit SYSTEM.INI and add 'ScreenLines=50' to the [NonWindowsApp] section.  DOS
-   prompts and external DOS commands will now run in a 50-line window.
-
 						*windows-icon*
 Q. I don't like the Vim icon, can I change it?
 A. Yes, place your favorite icon in bitmaps/vim.ico in a directory of
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 8.0.  Last change: 2016 Oct 09
+*todo.txt*      For Vim version 8.0.  Last change: 2016 Oct 12
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -34,10 +34,6 @@ not be repeated below, unless there is e
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
-After 8.0 is released:
-- Drop support for older MS-Windows systems, before XP.
-  Patch from Ken Takata, updated 2016 Sep 12.
-
 +channel:
 - Problem with stderr on Windows? (Vincent Rischmann, 2016 Aug 31, #1026)
 - Add 'cwd' argument to start_job(): directory to change to in the child.
@@ -1809,10 +1805,6 @@ popup menu over it, first draw the new p
 size and then redraw the text, skipping the characters under the popup menu.
 This should avoid flicker.  Other solution by A.Politz, 2007 Aug 22.
 
-Windows 98: pasting from the clipboard with text from another application has
-a trailing NUL.  (Joachim Hofmann)  Perhaps the length specified for CF_TEXT
-isn't right?
-
 When a register contains illegal bytes, writing viminfo in utf-8 and reading
 it back doesn't result in utf-8. (Devin Bayer)
 
@@ -2418,8 +2410,6 @@ 9   Can't paste a Visual selection from 
 Win32 GUI known bugs:
 -   Win32: tearoff menu window should have a scrollbar when it's taller than
     the screen.
-8   On Windows 98 the unicows library is needed to support functions with UCS2
-    file names.  Can we load unicows.dll dynamically?
 8   The -P argument doesn't work very well with many MDI applications.
     The last argument of CreateWindowEx() should be used, see MSDN docs.
     Tutorial: http://win32assembly.online.fr/tut32.html
--- a/src/GvimExt/Makefile
+++ b/src/GvimExt/Makefile
@@ -3,7 +3,7 @@
 #   DEBUG=yes		Build debug version (for VC7 and maybe later)
 #
 
-TARGETOS=BOTH
+TARGETOS=WINNT
 !ifndef APPVER
 APPVER=5.0
 !endif
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -1,7 +1,7 @@
-# Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me)
-# and Win64, using the Microsoft Visual C++ compilers. Known to work with
-# VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005),
-# VC9 (VS2008), VC10 (VS2010) and VC11 (VS2012)
+# Makefile for Vim on Win32 (Windows XP/2003/Vista/7/8/10) and Win64,
+# using the Microsoft Visual C++ compilers. Known to work with VC5, VC6 (VS98),
+# VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005), VC9 (VS2008), VC10 (VS2010),
+# VC11 (VS2012), VC12 (VS2013) and VC14 (VS2015)
 #
 # To build using other Windows compilers, see INSTALLpc.txt
 #
@@ -119,7 +119,7 @@
 #	  yes:   Write a normal mapfile.
 #	  lines: Write a mapfile with line numbers (only for VC6 and later)
 #
-#	Static Code Analysis: ANALYZE=yes (works with VS2012 only)
+#	Static Code Analysis: ANALYZE=yes (works with VS2012 or later)
 #
 # You can combine any of these interfaces
 #
@@ -162,9 +162,9 @@
 # you can set DEFINES on the command line, e.g.,
 #	nmake -f Make_mvc.mvc "DEFINES=-DEMACS_TAGS"
 
-# Build on both Windows NT/XP and Windows 9x
+# Build on Windows NT/XP
 
-TARGETOS = BOTH
+TARGETOS = WINNT
 
 # Select one of eight object code directories, depends on GUI, OLE, DEBUG and
 # interfaces.
@@ -436,13 +436,7 @@ CFLAGS = -c /W3 /nologo $(CVARS) -I. -Ip
 #>>>>> end of choices
 ###########################################################################
 
-!ifdef OS
-OS_TYPE	= winnt
 DEL_TREE = rmdir /s /q
-!else
-OS_TYPE	= win95
-DEL_TREE = deltree /y
-!endif
 
 INTDIR=$(OBJDIR)
 OUTDIR=$(OBJDIR)
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6017,7 +6017,7 @@ f_has(typval_T *argvars, typval_T *rettv
 #endif
 #if defined(WIN3264)
 	else if (STRICMP(name, "win95") == 0)
-	    n = mch_windows95();
+	    n = FALSE;		/* Win9x is no more supported. */
 #endif
 #ifdef FEAT_NETBEANS_INTG
 	else if (STRICMP(name, "netbeans_enabled") == 0)
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1175,14 +1175,6 @@ do_filter(
     if (*cmd == NUL)	    /* no filter command */
 	return;
 
-#ifdef WIN3264
-    /*
-     * Check if external commands are allowed now.
-     */
-    if (can_end_termcap_mode(TRUE) == FALSE)
-	return;
-#endif
-
     cursor_save = curwin->w_cursor;
     linecount = line2 - line1 + 1;
     curwin->w_cursor.lnum = line1;
@@ -1460,12 +1452,6 @@ do_shell(
 
 #ifdef MSWIN
     /*
-     * Check if external commands are allowed now.
-     */
-    if (can_end_termcap_mode(TRUE) == FALSE)
-	return;
-
-    /*
      * Check if ":!start" is used.
      */
     if (cmd != NULL)
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -7611,14 +7611,7 @@ ex_stop(exarg_T *eap)
     /*
      * Disallow suspending for "rvim".
      */
-    if (!check_restricted()
-#ifdef WIN3264
-	/*
-	 * Check if external commands are allowed now.
-	 */
-	&& can_end_termcap_mode(TRUE)
-#endif
-					)
+    if (!check_restricted())
     {
 	if (!eap->forceit)
 	    autowrite_all();
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -319,7 +319,7 @@ static int		destroying = FALSE;	/* call 
 #ifdef MSWIN_FIND_REPLACE
 static UINT		s_findrep_msg = 0;	/* set in gui_w[16/32].c */
 static FINDREPLACE	s_findrep_struct;
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 static FINDREPLACEW	s_findrep_struct_w;
 # endif
 static HWND		s_findrep_hwnd = NULL;
@@ -369,7 +369,7 @@ static int allow_scrollbar = FALSE;
 # define MyTranslateMessage(x) TranslateMessage(x)
 #endif
 
-#if (defined(WIN3264) && defined(FEAT_MBYTE)) || defined(GLOBAL_IME)
+#if defined(FEAT_MBYTE) || defined(GLOBAL_IME)
   /* use of WindowProc depends on wide_WindowProc */
 # define MyWindowProc vim_WindowProc
 #else
@@ -473,10 +473,6 @@ static UINT	s_wait_timer = 0;   /* Timer
 static int	s_timed_out = FALSE;
 static int	dead_key = 0;	/* 0: no dead key, 1: dead key pressed */
 
-#ifdef WIN3264
-static OSVERSIONINFO os_version;    /* like it says.  Init in gui_mch_init() */
-#endif
-
 #ifdef FEAT_BEVAL
 /* balloon-eval WM_NOTIFY_HANDLER */
 static void Handle_WM_Notify(HWND hwnd, LPNMHDR pnmh);
@@ -695,61 +691,41 @@ char_to_string(int ch, char_u *string, i
     WCHAR	wstring[2];
     char_u	*ws = NULL;
 
-    if (os_version.dwPlatformId != VER_PLATFORM_WIN32_NT)
-    {
-	/* On Windows 95/98 we apparently get the character in the active
-	 * codepage, not in UCS-2.  If conversion is needed convert it to
-	 * UCS-2 first. */
-	if ((int)GetACP() == enc_codepage)
-	    len = 0;	    /* no conversion required */
-	else
-	{
-	    string[0] = ch;
-	    len = MultiByteToWideChar(GetACP(), 0, (LPCSTR)string,
-		    1, wstring, 2);
+    wstring[0] = ch;
+    len = 1;
+
+    /* "ch" is a UTF-16 character.  Convert it to a string of bytes.  When
+     * "enc_codepage" is non-zero use the standard Win32 function,
+     * otherwise use our own conversion function (e.g., for UTF-8). */
+    if (enc_codepage > 0)
+    {
+	len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
+		(LPSTR)string, slen, 0, NULL);
+	/* If we had included the ALT key into the character but now the
+	 * upper bit is no longer set, that probably means the conversion
+	 * failed.  Convert the original character and set the upper bit
+	 * afterwards. */
+	if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80)
+	{
+	    wstring[0] = ch & 0x7f;
+	    len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
+		    (LPSTR)string, slen, 0, NULL);
+	    if (len == 1) /* safety check */
+		string[0] |= 0x80;
 	}
     }
     else
     {
-	wstring[0] = ch;
 	len = 1;
-    }
-
-    if (len > 0)
-    {
-	/* "ch" is a UTF-16 character.  Convert it to a string of bytes.  When
-	 * "enc_codepage" is non-zero use the standard Win32 function,
-	 * otherwise use our own conversion function (e.g., for UTF-8). */
-	if (enc_codepage > 0)
-	{
-	    len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
-					       (LPSTR)string, slen, 0, NULL);
-	    /* If we had included the ALT key into the character but now the
-	     * upper bit is no longer set, that probably means the conversion
-	     * failed.  Convert the original character and set the upper bit
-	     * afterwards. */
-	    if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80)
-	    {
-		wstring[0] = ch & 0x7f;
-		len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
-					       (LPSTR)string, slen, 0, NULL);
-		if (len == 1) /* safety check */
-		    string[0] |= 0x80;
-	    }
-	}
+	ws = utf16_to_enc(wstring, &len);
+	if (ws == NULL)
+	    len = 0;
 	else
 	{
-	    len = 1;
-	    ws = utf16_to_enc(wstring, &len);
-	    if (ws == NULL)
-		len = 0;
-	    else
-	    {
-		if (len > slen)	/* just in case */
-		    len = slen;
-		mch_memmove(string, ws, len);
-		vim_free(ws);
-	    }
+	    if (len > slen)	/* just in case */
+		len = slen;
+	    mch_memmove(string, ws, len);
+	    vim_free(ws);
 	}
     }
 
@@ -1079,7 +1055,7 @@ gui_mswin_find_menu(
 #endif
 
 #ifdef MSWIN_FIND_REPLACE
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 /*
  * copy useful data from structure LPFINDREPLACE to structure LPFINDREPLACEW
  */
@@ -1127,11 +1103,10 @@ findrep_wtoa(LPFINDREPLACE lpfr, LPFINDR
     int	    flags = 0;
     int	    down;
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
     /* If the OS is Windows NT, and 'encoding' differs from active codepage:
      * convert text from wide string. */
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-			&& enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 	findrep_wtoa(&s_findrep_struct, &s_findrep_struct_w);
     }
@@ -1279,7 +1254,7 @@ HandleMouseHide(UINT uMsg, LPARAM lParam
     }
 }
 
-#if (defined(WIN3264) && defined(FEAT_MBYTE)) \
+#if defined(FEAT_MBYTE) \
 	|| defined(GLOBAL_IME) \
 	|| defined(PROTO)
 # ifdef PROTO
@@ -1586,10 +1561,9 @@ gui_mch_get_color(char_u *name)
 
     static SysColorTable sys_table[] =
     {
-#ifdef WIN3264
 	{"SYS_3DDKSHADOW", COLOR_3DDKSHADOW},
 	{"SYS_3DHILIGHT", COLOR_3DHILIGHT},
-#ifndef __MINGW32__
+#ifdef COLOR_3DHIGHLIGHT
 	{"SYS_3DHIGHLIGHT", COLOR_3DHIGHLIGHT},
 #endif
 	{"SYS_BTNHILIGHT", COLOR_BTNHILIGHT},
@@ -1600,7 +1574,6 @@ gui_mch_get_color(char_u *name)
 	{"SYS_INFOBK", COLOR_INFOBK},
 	{"SYS_INFOTEXT", COLOR_INFOTEXT},
 	{"SYS_3DFACE", COLOR_3DFACE},
-#endif
 	{"SYS_BTNFACE", COLOR_BTNFACE},
 	{"SYS_BTNSHADOW", COLOR_BTNSHADOW},
 	{"SYS_ACTIVEBORDER", COLOR_ACTIVEBORDER},
@@ -2094,11 +2067,7 @@ gui_mch_wait_for_chars(int wtime)
 
 	if (s_need_activate)
 	{
-#ifdef WIN32
 	    (void)SetForegroundWindow(s_hwnd);
-#else
-	    (void)SetActiveWindow(s_hwnd);
-#endif
 	    s_need_activate = FALSE;
 	}
 
@@ -2421,7 +2390,6 @@ add_tabline_popup_menu_entry(HMENU pmenu
 {
 #ifdef FEAT_MBYTE
     WCHAR	*wn = NULL;
-    int		n;
 
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
@@ -2438,11 +2406,8 @@ add_tabline_popup_menu_entry(HMENU pmenu
 	    infow.fType = MFT_STRING;
 	    infow.dwTypeData = wn;
 	    infow.cch = (UINT)wcslen(wn);
-	    n = InsertMenuItemW(pmenu, item_id, FALSE, &infow);
+	    InsertMenuItemW(pmenu, item_id, FALSE, &infow);
 	    vim_free(wn);
-	    if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-		/* Failed, try using non-wide function. */
-		wn = NULL;
 	}
     }
 
@@ -2563,7 +2528,7 @@ gui_mch_update_tabline(void)
     if (s_tabhwnd == NULL)
 	return;
 
-#if defined(FEAT_MBYTE)
+#ifdef FEAT_MBYTE
 # ifndef CCM_SETUNICODEFORMAT
     /* For older compilers.  We assume this never changes. */
 #  define CCM_SETUNICODEFORMAT 0x2005
@@ -2708,18 +2673,15 @@ set_window_title(HWND hwnd, char *title)
     if (title != NULL && enc_codepage >= 0 && enc_codepage != (int)GetACP())
     {
 	WCHAR	*wbuf;
-	int	n;
 
 	/* Convert the title from 'encoding' to UTF-16. */
 	wbuf = (WCHAR *)enc_to_utf16((char_u *)title, NULL);
 	if (wbuf != NULL)
 	{
-	    n = SetWindowTextW(hwnd, wbuf);
+	    SetWindowTextW(hwnd, wbuf);
 	    vim_free(wbuf);
-	    if (n != 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return;
-	    /* Retry with non-wide function (for Windows 98). */
-	}
+	}
+	return;
     }
 #endif
     (void)SetWindowText(hwnd, (LPCSTR)title);
@@ -2737,11 +2699,10 @@ gui_mch_find_dialog(exarg_T *eap)
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 	    /* If the OS is Windows NT, and 'encoding' differs from active
 	     * codepage: convert text and use wide function. */
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
 		s_findrep_hwnd = FindTextW(
@@ -2774,9 +2735,8 @@ gui_mch_replace_dialog(exarg_T *eap)
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-# if defined(FEAT_MBYTE) && defined(WIN3264)
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+# ifdef FEAT_MBYTE
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
 		s_findrep_hwnd = ReplaceTextW(
@@ -3466,11 +3426,7 @@ static LPCSTR mshape_idcs[] =
     IDC_SIZEWE,			/* leftright */
     IDC_SIZEWE,			/* lrsizing */
     IDC_WAIT,			/* busy */
-#ifdef WIN3264
     IDC_NO,			/* no */
-#else
-    IDC_ICON,			/* no */
-#endif
     IDC_ARROW,			/* crosshair */
     IDC_ARROW,			/* hand1 */
     IDC_ARROW,			/* hand2 */
@@ -3497,11 +3453,7 @@ mch_set_mouse_shape(int shape)
 #ifdef SetClassLongPtr
 	SetClassLongPtr(s_textArea, GCLP_HCURSOR, (__int3264)(LONG_PTR)LoadCursor(NULL, idc));
 #else
-# ifdef WIN32
 	SetClassLong(s_textArea, GCL_HCURSOR, (long_u)LoadCursor(NULL, idc));
-# else /* Win16 */
-	SetClassWord(s_textArea, GCW_HCURSOR, (WORD)LoadCursor(NULL, idc));
-# endif
 #endif
 	if (!p_mh)
 	{
@@ -3523,7 +3475,7 @@ mch_set_mouse_shape(int shape)
  * Windows NT/2000/XP the "W" functions are used.
  */
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 /*
  * Wide version of convert_filter().
  */
@@ -3728,17 +3680,15 @@ gui_mch_browse(
 	char_u *initdir,
 	char_u *filter)
 {
+# ifdef FEAT_MBYTE
+    return gui_mch_browseW(saving, title, dflt, ext, initdir, filter);
+# else
     OPENFILENAME	fileStruct;
     char_u		fileBuf[MAXPATHL];
     char_u		*initdirp = NULL;
     char_u		*filterp;
     char_u		*p;
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
-	return gui_mch_browseW(saving, title, dflt, ext, initdir, filter);
-# endif
-
     if (dflt == NULL)
 	fileBuf[0] = NUL;
     else
@@ -3748,12 +3698,12 @@ gui_mch_browse(
     filterp = convert_filter(filter);
 
     vim_memset(&fileStruct, 0, sizeof(OPENFILENAME));
-#ifdef OPENFILENAME_SIZE_VERSION_400
+#  ifdef OPENFILENAME_SIZE_VERSION_400
     /* be compatible with Windows NT 4.0 */
     fileStruct.lStructSize = OPENFILENAME_SIZE_VERSION_400;
-#else
+#  else
     fileStruct.lStructSize = sizeof(fileStruct);
-#endif
+#  endif
 
     fileStruct.lpstrTitle = (LPSTR)title;
     fileStruct.lpstrDefExt = (LPSTR)ext;
@@ -3783,10 +3733,10 @@ gui_mch_browse(
      * Don't use OFN_OVERWRITEPROMPT, Vim has its own ":confirm" dialog.
      */
     fileStruct.Flags = (OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY);
-#ifdef FEAT_SHORTCUT
+#  ifdef FEAT_SHORTCUT
     if (curbuf->b_p_bin)
 	fileStruct.Flags |= OFN_NODEREFERENCELINKS;
-#endif
+#  endif
     if (saving)
     {
 	if (!GetSaveFileName(&fileStruct))
@@ -3806,6 +3756,7 @@ gui_mch_browse(
 
     /* Shorten the file name if possible */
     return vim_strsave(shorten_fname1((char_u *)fileBuf));
+# endif
 }
 #endif /* FEAT_BROWSE */
 
@@ -3816,16 +3767,11 @@ gui_mch_browse(
     HDROP hDrop)
 {
 #ifdef FEAT_WINDOWS
-#ifdef WIN3264
 # define BUFPATHLEN _MAX_PATH
 # define DRAGQVAL 0xFFFFFFFF
-#else
-# define BUFPATHLEN MAXPATHL
-# define DRAGQVAL 0xFFFF
-#endif
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
     WCHAR   wszFile[BUFPATHLEN];
-#endif
+# endif
     char    szFile[BUFPATHLEN];
     UINT    cFiles = DragQueryFile(hDrop, DRAGQVAL, NULL, 0);
     UINT    i;
@@ -3846,11 +3792,11 @@ gui_mch_browse(
     if (fnames != NULL)
 	for (i = 0; i < cFiles; ++i)
 	{
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
 	    if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0)
 		fnames[i] = utf16_to_enc(wszFile, NULL);
 	    else
-#endif
+# endif
 	    {
 		DragQueryFile(hDrop, i, szFile, BUFPATHLEN);
 		fnames[i] = vim_strsave((char_u *)szFile);
@@ -3888,14 +3834,10 @@ gui_mch_browse(
     long	val;
     int		dragging = FALSE;
     int		dont_scroll_save = dont_scroll;
-#ifndef WIN3264
-    int		nPos;
-#else
     SCROLLINFO	si;
 
     si.cbSize = sizeof(si);
     si.fMask = SIF_POS;
-#endif
 
     sb = gui_mswin_find_scrollbar(hwndCtl);
     if (sb == NULL)
@@ -3960,13 +3902,8 @@ gui_mch_browse(
     }
     prev_code = code;
 
-#ifdef WIN3264
     si.nPos = (sb->scroll_shift > 0) ? val >> sb->scroll_shift : val;
     SetScrollInfo(hwndCtl, SB_CTL, &si, TRUE);
-#else
-    nPos = (sb->scroll_shift > 0) ? val >> sb->scroll_shift : val;
-    SetScrollPos(hwndCtl, SB_CTL, nPos, TRUE);
-#endif
 
     /*
      * When moving a vertical scrollbar, move the other vertical scrollbar too.
@@ -3976,11 +3913,7 @@ gui_mch_browse(
 	scrollbar_T *sba = sb->wp->w_scrollbars;
 	HWND    id = sba[ (sb == sba + SBAR_LEFT) ? SBAR_RIGHT : SBAR_LEFT].id;
 
-#ifdef WIN3264
 	SetScrollInfo(id, SB_CTL, &si, TRUE);
-#else
-	SetScrollPos(id, SB_CTL, nPos, TRUE);
-#endif
     }
 
     /* Don't let us be interrupted here by another message. */
@@ -4448,7 +4381,6 @@ static int dialog_default_button = -1;
 
 /* Intellimouse support */
 static int mouse_scroll_lines = 0;
-static UINT msh_msgmousewheel = 0;
 
 static int	s_usenewlook;	    /* emulate W95/NT4 non-bold dialogs */
 #ifdef FEAT_TOOLBAR
@@ -4505,34 +4437,6 @@ static void dyn_imm_load(void);
 # define pImmSetConversionStatus  ImmSetConversionStatus
 #endif
 
-/* multi monitor support */
-typedef struct _MONITORINFOstruct
-{
-    DWORD cbSize;
-    RECT rcMonitor;
-    RECT rcWork;
-    DWORD dwFlags;
-} _MONITORINFO;
-
-typedef HANDLE _HMONITOR;
-typedef _HMONITOR (WINAPI *TMonitorFromWindow)(HWND, DWORD);
-typedef BOOL (WINAPI *TGetMonitorInfo)(_HMONITOR, _MONITORINFO *);
-
-static TMonitorFromWindow   pMonitorFromWindow = NULL;
-static TGetMonitorInfo	    pGetMonitorInfo = NULL;
-static HANDLE		    user32_lib = NULL;
-/*
- * Return TRUE when running under Windows NT 3.x or Win32s, both of which have
- * less fancy GUI APIs.
- */
-    static int
-is_winnt_3(void)
-{
-    return ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion == 3)
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32s));
-}
-
 #ifdef FEAT_MENU
 /*
  * Figure out how high the menu bar is at the moment.
@@ -4564,45 +4468,20 @@ gui_mswin_get_menu_height(
     }
     else
     {
-	if (is_winnt_3())	/* for NT 3.xx */
-	{
-	    if (gui.starting)
-		menu_height = GetSystemMetrics(SM_CYMENU);
-	    else
-	    {
-		RECT r1, r2;
-		int frameht = GetSystemMetrics(SM_CYFRAME);
-		int capht = GetSystemMetrics(SM_CYCAPTION);
-
-		/* get window rect of s_hwnd
-		 * get client rect of s_hwnd
-		 * get cap height
-		 * subtract from window rect, the sum of client height,
-		 * (if not maximized)frame thickness, and caption height.
-		 */
-		GetWindowRect(s_hwnd, &r1);
-		GetClientRect(s_hwnd, &r2);
-		menu_height = r1.bottom - r1.top - (r2.bottom - r2.top
-				 + 2 * frameht * (!IsZoomed(s_hwnd)) + capht);
-	    }
-	}
-	else			/* win95 and variants (NT 4.0, I guess) */
-	{
-	    /*
-	     * In case 'lines' is set in _vimrc/_gvimrc window width doesn't
-	     * seem to have been set yet, so menu wraps in default window
-	     * width which is very narrow.  Instead just return height of a
-	     * single menu item.  Will still be wrong when the menu really
-	     * should wrap over more than one line.
-	     */
-	    GetMenuItemRect(s_hwnd, s_menuBar, 0, &rc1);
-	    if (gui.starting)
-		menu_height = rc1.bottom - rc1.top + 1;
-	    else
-	    {
-		GetMenuItemRect(s_hwnd, s_menuBar, num - 1, &rc2);
-		menu_height = rc2.bottom - rc1.top + 1;
-	    }
+	/*
+	 * In case 'lines' is set in _vimrc/_gvimrc window width doesn't
+	 * seem to have been set yet, so menu wraps in default window
+	 * width which is very narrow.  Instead just return height of a
+	 * single menu item.  Will still be wrong when the menu really
+	 * should wrap over more than one line.
+	 */
+	GetMenuItemRect(s_hwnd, s_menuBar, 0, &rc1);
+	if (gui.starting)
+	    menu_height = rc1.bottom - rc1.top + 1;
+	else
+	{
+	    GetMenuItemRect(s_hwnd, s_menuBar, num - 1, &rc2);
+	    menu_height = rc2.bottom - rc1.top + 1;
 	}
     }
 
@@ -4636,42 +4515,11 @@ init_mouse_wheel(void)
 #define VMSH_MOUSEWHEEL    "MSWHEEL_ROLLMSG"
 #define VMSH_SCROLL_LINES  "MSH_SCROLL_LINES_MSG"
 
-    HWND hdl_mswheel;
-    UINT msh_msgscrolllines;
-
-    msh_msgmousewheel = 0;
     mouse_scroll_lines = 3;	/* reasonable default */
 
-    if ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion >= 4)
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-		&& ((os_version.dwMajorVersion == 4
-			&& os_version.dwMinorVersion >= 10)
-		    || os_version.dwMajorVersion >= 5)))
-    {
-	/* if NT 4.0+ (or Win98) get scroll lines directly from system */
-	SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
-		&mouse_scroll_lines, 0);
-    }
-    else if (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion < 4))
-    {	/*
-	 * If Win95 or NT 3.51,
-	 * try to find the hidden point32 window.
-	 */
-	hdl_mswheel = FindWindow(VMOUSEZ_CLASSNAME, VMOUSEZ_TITLE);
-	if (hdl_mswheel)
-	{
-	    msh_msgscrolllines = RegisterWindowMessage(VMSH_SCROLL_LINES);
-	    if (msh_msgscrolllines)
-	    {
-		mouse_scroll_lines = (int)SendMessage(hdl_mswheel,
-			msh_msgscrolllines, 0, 0);
-		msh_msgmousewheel  = RegisterWindowMessage(VMSH_MOUSEWHEEL);
-	    }
-	}
-    }
+    /* if NT 4.0+ (or Win98) get scroll lines directly from system */
+    SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
+	    &mouse_scroll_lines, 0);
 }
 
 
@@ -5210,13 +5058,8 @@ set_tabline_font(void)
 #endif
 
     default:
-	if (uMsg == msh_msgmousewheel && msh_msgmousewheel != 0)
-	{   /* handle MSH_MOUSEWHEEL messages for Intellimouse */
-	    _OnMouseWheel(hwnd, HIWORD(wParam));
-	    return 0L;
-	}
 #ifdef MSWIN_FIND_REPLACE
-	else if (uMsg == s_findrep_msg && s_findrep_msg != 0)
+	if (uMsg == s_findrep_msg && s_findrep_msg != 0)
 	{
 	    _OnFindRepl();
 	}
@@ -5376,42 +5219,6 @@ gui_mch_prepare(int *argc, char **argv)
 	    }
     }
 #endif
-
-    /* get the OS version info */
-    os_version.dwOSVersionInfoSize = sizeof(os_version);
-    GetVersionEx(&os_version); /* this call works on Win32s, Win95 and WinNT */
-
-    /* try and load the user32.dll library and get the entry points for
-     * multi-monitor-support. */
-    if ((user32_lib = vimLoadLib("User32.dll")) != NULL)
-    {
-	pMonitorFromWindow = (TMonitorFromWindow)GetProcAddress(user32_lib,
-							 "MonitorFromWindow");
-
-	/* there are ...A and ...W version of GetMonitorInfo - looking at
-	 * winuser.h, they have exactly the same declaration. */
-	pGetMonitorInfo = (TGetMonitorInfo)GetProcAddress(user32_lib,
-							  "GetMonitorInfoA");
-    }
-
-#ifdef FEAT_MBYTE
-    /* If the OS is Windows NT, use wide functions;
-     * this enables common dialogs input unicode from IME. */
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
-    {
-	pDispatchMessage = DispatchMessageW;
-	pGetMessage = GetMessageW;
-	pIsDialogMessage = IsDialogMessageW;
-	pPeekMessage = PeekMessageW;
-    }
-    else
-    {
-	pDispatchMessage = DispatchMessageA;
-	pGetMessage = GetMessageA;
-	pIsDialogMessage = IsDialogMessageA;
-	pPeekMessage = PeekMessageA;
-    }
-#endif
 }
 
 /*
@@ -5475,12 +5282,7 @@ gui_mch_init(void)
 		    atom =
 #endif
 		    RegisterClassW(&wndclassw)) == 0)
-	{
-	    if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return FAIL;
-
-	    /* Must be Windows 98, fall back to non-wide function. */
-	}
+	    return FAIL;
 	else
 	    wide_WindowProc = TRUE;
     }
@@ -5710,7 +5512,7 @@ gui_mch_init(void)
     s_findrep_struct.lpstrReplaceWith[0] = NUL;
     s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE;
     s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE;
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
     s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w);
     s_findrep_struct_w.lpstrFindWhat =
 			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
@@ -5753,22 +5555,18 @@ theend:
     static void
 get_work_area(RECT *spi_rect)
 {
-    _HMONITOR	    mon;
-    _MONITORINFO    moninfo;
-
-    /* use these functions only if available */
-    if (pMonitorFromWindow != NULL && pGetMonitorInfo != NULL)
-    {
-	/* work out which monitor the window is on, and get *it's* work area */
-	mon = pMonitorFromWindow(s_hwnd, 1 /*MONITOR_DEFAULTTOPRIMARY*/);
-	if (mon != NULL)
-	{
-	    moninfo.cbSize = sizeof(_MONITORINFO);
-	    if (pGetMonitorInfo(mon, &moninfo))
-	    {
-		*spi_rect = moninfo.rcWork;
-		return;
-	    }
+    HMONITOR	    mon;
+    MONITORINFO	    moninfo;
+
+    /* work out which monitor the window is on, and get *it's* work area */
+    mon = MonitorFromWindow(s_hwnd, 1 /*MONITOR_DEFAULTTOPRIMARY*/);
+    if (mon != NULL)
+    {
+	moninfo.cbSize = sizeof(MONITORINFO);
+	if (GetMonitorInfo(mon, &moninfo))
+	{
+	    *spi_rect = moninfo.rcWork;
+	    return;
 	}
     }
     /* this is the old method... */
@@ -6307,29 +6105,10 @@ RevOut( HDC s_hdc,
 	CONST INT *padding)
 {
     int		ix;
-    static int	special = -1;
-
-    if (special == -1)
-    {
-	/* Check windows version: special treatment is needed if it is NT 5 or
-	 * Win98 or higher. */
-	if  ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && os_version.dwMajorVersion >= 5)
-		|| (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-		    && (os_version.dwMajorVersion > 4
-			|| (os_version.dwMajorVersion == 4
-			    && os_version.dwMinorVersion > 0))))
-	    special = 1;
-	else
-	    special = 0;
-    }
-
-    if (special)
-	for (ix = 0; ix < (int)len; ++ix)
-	    ExtTextOut(s_hdc, col + TEXT_X(ix), row, foptions,
-					    pcliprect, text + ix, 1, padding);
-    else
-	ExtTextOut(s_hdc, col, row, foptions, pcliprect, text, len, padding);
+
+    for (ix = 0; ix < (int)len; ++ix)
+	ExtTextOut(s_hdc, col + TEXT_X(ix), row, foptions,
+					pcliprect, text + ix, 1, padding);
 }
 #endif
 
@@ -6718,63 +6497,50 @@ gui_mch_add_menu(
 
     if (menu_is_menubar(menu->name))
     {
-	if (is_winnt_3())
-	{
-	    InsertMenu((parent == NULL) ? s_menuBar : parent->submenu_id,
-		    (UINT)pos, MF_POPUP | MF_STRING | MF_BYPOSITION,
-		    (long_u)menu->submenu_id, (LPCTSTR) menu->name);
-	}
-	else
-	{
 #ifdef FEAT_MBYTE
-	    WCHAR	*wn = NULL;
-	    int		n;
-
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	WCHAR	*wn = NULL;
+
+	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	{
+	    /* 'encoding' differs from active codepage: convert menu name
+	     * and use wide function */
+	    wn = enc_to_utf16(menu->name, NULL);
+	    if (wn != NULL)
 	    {
-		/* 'encoding' differs from active codepage: convert menu name
-		 * and use wide function */
-		wn = enc_to_utf16(menu->name, NULL);
-		if (wn != NULL)
-		{
-		    MENUITEMINFOW	infow;
-
-		    infow.cbSize = sizeof(infow);
-		    infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
-							       | MIIM_SUBMENU;
-		    infow.dwItemData = (long_u)menu;
-		    infow.wID = menu->id;
-		    infow.fType = MFT_STRING;
-		    infow.dwTypeData = wn;
-		    infow.cch = (UINT)wcslen(wn);
-		    infow.hSubMenu = menu->submenu_id;
-		    n = InsertMenuItemW((parent == NULL)
-					    ? s_menuBar : parent->submenu_id,
-					    (UINT)pos, TRUE, &infow);
-		    vim_free(wn);
-		    if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-			/* Failed, try using non-wide function. */
-			wn = NULL;
-		}
+		MENUITEMINFOW	infow;
+
+		infow.cbSize = sizeof(infow);
+		infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
+		    | MIIM_SUBMENU;
+		infow.dwItemData = (long_u)menu;
+		infow.wID = menu->id;
+		infow.fType = MFT_STRING;
+		infow.dwTypeData = wn;
+		infow.cch = (UINT)wcslen(wn);
+		infow.hSubMenu = menu->submenu_id;
+		InsertMenuItemW((parent == NULL)
+			? s_menuBar : parent->submenu_id,
+			(UINT)pos, TRUE, &infow);
+		vim_free(wn);
 	    }
-
-	    if (wn == NULL)
-#endif
-	    {
-		MENUITEMINFO	info;
-
-		info.cbSize = sizeof(info);
-		info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
-		info.dwItemData = (long_u)menu;
-		info.wID = menu->id;
-		info.fType = MFT_STRING;
-		info.dwTypeData = (LPTSTR)menu->name;
-		info.cch = (UINT)STRLEN(menu->name);
-		info.hSubMenu = menu->submenu_id;
-		InsertMenuItem((parent == NULL)
-					? s_menuBar : parent->submenu_id,
-					(UINT)pos, TRUE, &info);
-	    }
+	}
+
+	if (wn == NULL)
+#endif
+	{
+	    MENUITEMINFO	info;
+
+	    info.cbSize = sizeof(info);
+	    info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
+	    info.dwItemData = (long_u)menu;
+	    info.wID = menu->id;
+	    info.fType = MFT_STRING;
+	    info.dwTypeData = (LPTSTR)menu->name;
+	    info.cch = (UINT)STRLEN(menu->name);
+	    info.hSubMenu = menu->submenu_id;
+	    InsertMenuItem((parent == NULL)
+		    ? s_menuBar : parent->submenu_id,
+		    (UINT)pos, TRUE, &info);
 	}
     }
 
@@ -6890,7 +6656,6 @@ gui_mch_add_menu_item(
     {
 #ifdef FEAT_MBYTE
 	WCHAR	*wn = NULL;
-	int	n;
 
 	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	{
@@ -6899,14 +6664,11 @@ gui_mch_add_menu_item(
 	    wn = enc_to_utf16(menu->name, NULL);
 	    if (wn != NULL)
 	    {
-		n = InsertMenuW(parent->submenu_id, (UINT)idx,
+		InsertMenuW(parent->submenu_id, (UINT)idx,
 			(menu_is_separator(menu->name)
 				 ? MF_SEPARATOR : MF_STRING) | MF_BYPOSITION,
 			(UINT)menu->id, wn);
 		vim_free(wn);
-		if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-		    /* Failed, try using non-wide function. */
-		    wn = NULL;
 	    }
 	}
 	if (wn == NULL)
@@ -7105,11 +6867,10 @@ dialog_callback(
 	/* If the edit box exists, copy the string. */
 	if (s_textfield != NULL)
 	{
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 	    /* If the OS is Windows NT, and 'encoding' differs from active
 	     * codepage: use wide function and convert text. */
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 	       WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
 	       char_u *p;
@@ -7866,38 +7627,31 @@ get_dialog_font_metrics(void)
 
     s_usenewlook = FALSE;
 
-    /*
-     * For NT3.51 and Win32s, we stick with the old look
-     * because it matches everything else.
-     */
-    if (!is_winnt_3())
-    {
 #ifdef USE_SYSMENU_FONT
-	if (gui_w32_get_menu_font(&lfSysmenu) == OK)
-	    hfontTools = CreateFontIndirect(&lfSysmenu);
-	else
+    if (gui_w32_get_menu_font(&lfSysmenu) == OK)
+	hfontTools = CreateFontIndirect(&lfSysmenu);
+    else
 #endif
 	hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, VARIABLE_PITCH , DLG_FONT_NAME);
 
-	if (hfontTools)
-	{
-	    hdc = GetDC(s_hwnd);
-	    SelectObject(hdc, hfontTools);
-	    /*
-	     * GetTextMetrics() doesn't return the right value in
-	     * tmAveCharWidth, so we have to figure out the dialog base units
-	     * ourselves.
-	     */
-	    GetTextExtentPoint(hdc,
-		    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
-		    52, &size);
-	    ReleaseDC(s_hwnd, hdc);
-
-	    s_dlgfntwidth = (WORD)((size.cx / 26 + 1) / 2);
-	    s_dlgfntheight = (WORD)size.cy;
-	    s_usenewlook = TRUE;
-	}
+    if (hfontTools)
+    {
+	hdc = GetDC(s_hwnd);
+	SelectObject(hdc, hfontTools);
+	/*
+	 * GetTextMetrics() doesn't return the right value in
+	 * tmAveCharWidth, so we have to figure out the dialog base units
+	 * ourselves.
+	 */
+	GetTextExtentPoint(hdc,
+		"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+		52, &size);
+	ReleaseDC(s_hwnd, hdc);
+
+	s_dlgfntwidth = (WORD)((size.cx / 26 + 1) / 2);
+	s_dlgfntheight = (WORD)size.cy;
+	s_usenewlook = TRUE;
     }
 
     if (!s_usenewlook)
@@ -8044,10 +7798,6 @@ gui_mch_tearoff(
 	dlgwidth = textWidth;
     dlgwidth += 2 * TEAROFF_PADDING_X + TEAROFF_BUTTON_PAD_X;
 
-    /* W95 can't do thin dialogs, they look v. weird! */
-    if (mch_windows95() && dlgwidth < TEAROFF_MIN_WIDTH)
-	dlgwidth = TEAROFF_MIN_WIDTH;
-
     /* start to fill in the dlgtemplate information.  addressing by WORDs */
     if (s_usenewlook)
 	lStyle = DS_MODALFRAME | WS_CAPTION| WS_SYSMENU |DS_SETFONT| WS_VISIBLE;
@@ -8299,7 +8049,7 @@ get_toolbar_bitmap(vimmenu_T *menu)
     /*
      * Check user bitmaps first, unless builtin is specified.
      */
-    if (!is_winnt_3() && !menu->icon_builtin)
+    if (!menu->icon_builtin)
     {
 	char_u fname[MAXPATHL];
 	HANDLE hbitmap = NULL;
@@ -8556,12 +8306,6 @@ gui_mch_register_sign(char_u *signfile)
     signicon_t	sign, *psign;
     char_u	*ext;
 
-    if (is_winnt_3())
-    {
-	EMSG(_(e_signdata));
-	return NULL;
-    }
-
     sign.hImage = NULL;
     ext = signfile + STRLEN(signfile) - 4; /* get extension */
     if (ext > signfile)
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -839,14 +839,10 @@ cs_create_connection(int i)
     HANDLE	stdin_rd, stdout_rd;
     HANDLE	stdout_wr, stdin_wr;
     BOOL	created;
-# ifdef __BORLANDC__
-#  define OPEN_OH_ARGTYPE long
+# if (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)
+#  define OPEN_OH_ARGTYPE intptr_t
 # else
-#  if (_MSC_VER >= 1300) || defined(__MINGW32__)
-#   define OPEN_OH_ARGTYPE intptr_t
-#  else
-#   define OPEN_OH_ARGTYPE long
-#  endif
+#  define OPEN_OH_ARGTYPE long
 # endif
 #endif
 
@@ -1427,11 +1423,8 @@ cs_insert_filelist(
 #ifndef UNIX
     BY_HANDLE_FILE_INFORMATION bhfi;
 
-    /* On windows 9x GetFileInformationByHandle doesn't work, so skip it */
-    if (!mch_windows95())
+    switch (win32_fileinfo((char_u *)fname, &bhfi))
     {
-	switch (win32_fileinfo((char_u *)fname, &bhfi))
-	{
 	case FILEINFO_ENC_FAIL:		/* enc_to_utf16() failed */
 	case FILEINFO_READ_FAIL:	/* CreateFile() failed */
 	    if (p_csverbose)
@@ -1454,7 +1447,6 @@ cs_insert_filelist(
 	    if (p_csverbose)
 		(void)EMSG(_("E626: cannot get cscope database information"));
 	    return -1;
-	}
     }
 #endif
 
@@ -1468,9 +1460,8 @@ cs_insert_filelist(
 	    /* compare pathnames first */
 	    && ((fullpathcmp((char_u *)csinfo[j].fname,
 			(char_u *)fname, FALSE) & FPC_SAME)
-		/* if not Windows 9x, test index file attributes too */
-		|| (!mch_windows95()
-		    && csinfo[j].nVolume == bhfi.dwVolumeSerialNumber
+		/* test index file attributes too */
+		|| (csinfo[j].nVolume == bhfi.dwVolumeSerialNumber
 		    && csinfo[j].nIndexHigh == bhfi.nFileIndexHigh
 		    && csinfo[j].nIndexLow == bhfi.nFileIndexLow))
 #endif
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -9450,10 +9450,7 @@ prepare_to_exit(void)
 	 * screen (if there are two screens).
 	 */
 	settmode(TMODE_COOK);
-#ifdef WIN3264
-	if (can_end_termcap_mode(FALSE) == TRUE)
-#endif
-	    stoptermcap();
+	stoptermcap();
 	out_flush();
     }
 }
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1420,7 +1420,7 @@ vim_strsave_shellescape(char_u *string, 
     length = (unsigned)STRLEN(string) + 3;  /* two quotes and a trailing NUL */
     for (p = string; *p != NUL; mb_ptr_adv(p))
     {
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	if (!p_ssl)
 	{
 	    if (*p == '"')
@@ -1451,7 +1451,7 @@ vim_strsave_shellescape(char_u *string, 
 	d = escaped_string;
 
 	/* add opening quote */
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	if (!p_ssl)
 	    *d++ = '"';
 	else
@@ -1460,7 +1460,7 @@ vim_strsave_shellescape(char_u *string, 
 
 	for (p = string; *p != NUL; )
 	{
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	    if (!p_ssl)
 	    {
 		if (*p == '"')
@@ -1503,7 +1503,7 @@ vim_strsave_shellescape(char_u *string, 
 	}
 
 	/* add terminating quote and finish with a NUL */
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	if (!p_ssl)
 	    *d++ = '"';
 	else
--- a/src/option.c
+++ b/src/option.c
@@ -22,7 +22,7 @@
  * - If it's a list of flags, add some code in do_set(), search for WW_ALL.
  * - When adding an option with expansion (P_EXPAND), but with a different
  *   default for Vi and Vim (no P_VI_DEF), add some code at VIMEXP.
- * - Add documentation!  One line in doc/help.txt, full description in
+ * - Add documentation!  One line in doc/quickref.txt, full description in
  *   options.txt, and any other related places.
  * - Add an entry in runtime/optwin.vim.
  * When making changes:
@@ -9944,13 +9944,7 @@ clear_termoptions(void)
     if (gui.starting)
 	clear_xterm_clip();
 #endif
-#ifdef WIN3264
-    /*
-     * Check if this is allowed now.
-     */
-    if (can_end_termcap_mode(FALSE) == TRUE)
-#endif
-	stoptermcap();			/* stop termcap mode */
+    stoptermcap();			/* stop termcap mode */
 
     free_termoptions();
 }
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -38,11 +38,7 @@
 
 # if defined(FEAT_PRINTER) && !defined(FEAT_POSTSCRIPT)
 #  include <dlgs.h>
-#  ifdef WIN3264
-#   include <winspool.h>
-#  else
-#   include <print.h>
-#  endif
+#  include <winspool.h>
 #  include <commdlg.h>
 #endif
 
@@ -130,10 +126,6 @@ typedef void VOID;
 FILE* fdDump = NULL;
 #endif
 
-#ifdef WIN3264
-extern DWORD g_PlatformId;
-#endif
-
 #ifndef FEAT_GUI_MSWIN
 extern char g_szOrigTitle[];
 #endif
@@ -248,20 +240,13 @@ mch_early_init(void)
 {
     int		i;
 
-#ifdef WIN3264
     PlatformId();
-#endif
 
     /* Init the tables for toupper() and tolower() */
     for (i = 0; i < 256; ++i)
 	toupper_tab[i] = tolower_tab[i] = i;
-#ifdef WIN3264
     CharUpperBuff((LPSTR)toupper_tab, 256);
     CharLowerBuff((LPSTR)tolower_tab, 256);
-#else
-    AnsiUpperBuff((LPSTR)toupper_tab, 256);
-    AnsiLowerBuff((LPSTR)tolower_tab, 256);
-#endif
 }
 
 
@@ -299,14 +284,12 @@ mch_settitle(
 	{
 	    /* Convert the title from 'encoding' to the active codepage. */
 	    WCHAR	*wp = enc_to_utf16(title, NULL);
-	    int	n;
 
 	    if (wp != NULL)
 	    {
-		n = SetConsoleTitleW(wp);
+		SetConsoleTitleW(wp);
 		vim_free(wp);
-		if (n != 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		    return;
+		return;
 	    }
 	}
 #  endif
@@ -379,12 +362,7 @@ mch_FullName(
 #endif
     {
 #ifdef FEAT_MBYTE
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage
-# ifdef __BORLANDC__
-		/* Wide functions of Borland C 5.5 do not work on Windows 98. */
-		&& g_PlatformId == VER_PLATFORM_WIN32_NT
-# endif
-	   )
+	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	{
 	    WCHAR	*wname;
 	    WCHAR	wbuf[MAX_PATH];
@@ -641,12 +619,7 @@ vim_stat(const char *name, stat_T *stp)
 	}
     }
 #ifdef FEAT_MBYTE
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage
-# ifdef __BORLANDC__
-	    /* Wide functions of Borland C 5.5 do not work on Windows 98. */
-	    && g_PlatformId == VER_PLATFORM_WIN32_NT
-# endif
-       )
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 	WCHAR	*wp = enc_to_utf16(buf, NULL);
 	int	n;
@@ -655,11 +628,7 @@ vim_stat(const char *name, stat_T *stp)
 	{
 	    n = wstat_symlink_aware(wp, stp);
 	    vim_free(wp);
-	    if (n >= 0 || g_PlatformId == VER_PLATFORM_WIN32_NT)
-		return n;
-	    /* Retry with non-wide function (for Windows 98). Can't use
-	     * GetLastError() here and it's unclear what errno gets set to if
-	     * the _wstat() fails for missing wide functions. */
+	    return n;
 	}
     }
 #endif
@@ -823,9 +792,7 @@ mch_chdir(char *path)
 	{
 	    n = _wchdir(p);
 	    vim_free(p);
-	    if (n == 0 || g_PlatformId == VER_PLATFORM_WIN32_NT)
-		return n;
-	    /* Retry with non-wide function (for Windows 98). */
+	    return n;
 	}
     }
 #endif
@@ -834,27 +801,6 @@ mch_chdir(char *path)
 }
 
 
-/*
- * Switching off termcap mode is only allowed when Columns is 80, otherwise a
- * crash may result.  It's always allowed on NT or when running the GUI.
- */
-/*ARGSUSED*/
-    int
-can_end_termcap_mode(
-    int give_msg)
-{
-#ifdef FEAT_GUI_MSWIN
-    return TRUE;	/* GUI starts a new console anyway */
-#else
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT || Columns == 80)
-	return TRUE;
-    if (give_msg)
-	msg((char_u *)
-		_("'columns' is not 80, cannot execute external commands"));
-    return FALSE;
-#endif
-}
-
 #ifdef FEAT_GUI_MSWIN
 /*
  * return non-zero if a character is available
@@ -887,17 +833,10 @@ mch_screenmode(
  * and returns an allocated string.
  * Return OK if it worked, FAIL if not.
  */
-# ifdef WIN3264
 typedef LPTSTR (*MYSTRPROCSTR)(LPTSTR);
 typedef LPTSTR (*MYINTPROCSTR)(int);
 typedef int (*MYSTRPROCINT)(LPTSTR);
 typedef int (*MYINTPROCINT)(int);
-# else
-typedef LPSTR (*MYSTRPROCSTR)(LPSTR);
-typedef LPSTR (*MYINTPROCSTR)(int);
-typedef int (*MYSTRPROCINT)(LPSTR);
-typedef int (*MYINTPROCINT)(int);
-# endif
 
 /*
  * Check if a pointer points to a valid NUL terminated string.
@@ -1093,7 +1032,7 @@ Trace(
 #endif //_DEBUG
 
 #if !defined(FEAT_GUI) || defined(PROTO)
-# if defined(FEAT_TITLE) && defined(WIN3264)
+# ifdef FEAT_TITLE
 extern HWND g_hWnd;	/* This is in os_win32.c. */
 # endif
 
@@ -1114,7 +1053,7 @@ GetConsoleHwnd(void)
     if (s_hwnd != 0)
 	return;
 
-# if defined(FEAT_TITLE) && defined(WIN3264)
+# ifdef FEAT_TITLE
     /* Window handle may have been found by init code (Windows NT only) */
     if (g_hWnd != 0)
     {
@@ -1539,7 +1478,6 @@ mch_print_init(prt_settings_T *psettings
 	    )
     {
 	prt_dlg.Flags |= PD_RETURNDEFAULT;
-#ifdef WIN3264
 	/*
 	 * MSDN suggests setting the first parameter to WINSPOOL for
 	 * NT, but NULL appears to work just as well.
@@ -1547,7 +1485,6 @@ mch_print_init(prt_settings_T *psettings
 	if (*p_pdev != NUL)
 	    prt_dlg.hDC = CreateDC(NULL, (LPCSTR)p_pdev, NULL, NULL);
 	else
-#endif
 	{
 	    prt_dlg.Flags |= PD_RETURNDEFAULT;
 	    if (PrintDlg(&prt_dlg) == 0)
@@ -1593,10 +1530,8 @@ mch_print_init(prt_settings_T *psettings
     mem = (DEVMODE *)GlobalLock(prt_dlg.hDevMode);
     if (mem != NULL)
     {
-#ifdef WIN3264
 	if (mem->dmCopies != 1)
 	    stored_nCopies = mem->dmCopies;
-#endif
 	if ((mem->dmFields & DM_DUPLEX) && (mem->dmDuplex & ~DMDUP_SIMPLEX))
 	    psettings->duplex = TRUE;
 	if ((mem->dmFields & DM_COLOR) && (mem->dmColor & DMCOLOR_COLOR))
@@ -1953,7 +1888,7 @@ shortcut_errorw:
 		goto shortcut_end;
 	    }
 	}
-	/* Retry with non-wide function (for Windows 98). */
+	goto shortcut_end;
     }
 # endif
     // create a link manager object and request its interface
@@ -2681,7 +2616,6 @@ charset_pairs[] =
     {"OEM",		OEM_CHARSET},
     {"SHIFTJIS",	SHIFTJIS_CHARSET},
     {"SYMBOL",		SYMBOL_CHARSET},
-#ifdef WIN3264
     {"ARABIC",		ARABIC_CHARSET},
     {"BALTIC",		BALTIC_CHARSET},
     {"EASTEUROPE",	EASTEUROPE_CHARSET},
@@ -2693,10 +2627,8 @@ charset_pairs[] =
     {"RUSSIAN",		RUSSIAN_CHARSET},
     {"THAI",		THAI_CHARSET},
     {"TURKISH",		TURKISH_CHARSET},
-# if (!defined(_MSC_VER) || (_MSC_VER > 1010)) \
-	&& (!defined(__BORLANDC__) || (__BORLANDC__ > 0x0500))
+#ifdef VIETNAMESE_CHARSET
     {"VIETNAMESE",	VIETNAMESE_CHARSET},
-# endif
 #endif
     {NULL,		0}
 };
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -141,43 +141,11 @@ typedef int LPSECURITY_ATTRIBUTES;
 # define __stdcall /* empty */
 #endif
 
-#ifndef FEAT_GUI_W32
-/* Undocumented API in kernel32.dll needed to work around dead key bug in
- * console-mode applications in NT 4.0.  If you switch keyboard layouts
- * in a console app to a layout that includes dead keys and then hit a
- * dead key, a call to ToAscii will trash the stack.  My thanks to Ian James
- * and Michael Dietrich for helping me figure out this workaround.
- */
-
-/* WINAPI BOOL WINAPI GetConsoleKeyboardLayoutNameA(LPSTR); */
-#ifndef WINAPI
-# define WINAPI __stdcall
-#endif
-#if defined(__BORLANDC__)
-typedef BOOL (__stdcall *PFNGCKLN)(LPSTR);
-#else
-typedef BOOL (WINAPI *PFNGCKLN)(LPSTR);
-#endif
-static PFNGCKLN    s_pfnGetConsoleKeyboardLayoutName = NULL;
-#endif
-
 #if defined(__BORLANDC__)
 /* Strangely Borland uses a non-standard name. */
 # define wcsicmp(a, b) wcscmpi((a), (b))
 #endif
 
-#ifndef PROTO
-
-/* Enable common dialogs input unicode from IME if possible. */
-#ifdef FEAT_MBYTE
-LRESULT (WINAPI *pDispatchMessage)(CONST MSG *) = DispatchMessage;
-BOOL (WINAPI *pGetMessage)(LPMSG, HWND, UINT, UINT) = GetMessage;
-BOOL (WINAPI *pIsDialogMessage)(HWND, LPMSG) = IsDialogMessage;
-BOOL (WINAPI *pPeekMessage)(LPMSG, HWND, UINT, UINT, UINT) = PeekMessage;
-#endif
-
-#endif /* PROTO */
-
 #ifndef FEAT_GUI_W32
 /* Win32 Console handles for input and output */
 static HANDLE g_hConIn  = INVALID_HANDLE_VALUE;
@@ -430,7 +398,6 @@ unescape_shellxquote(char_u *p, char_u *
 vimLoadLib(char *name)
 {
     HINSTANCE	dll = NULL;
-    char	old_dir[MAXPATHL];
 
     /* NOTE: Do not use mch_dirname() and mch_chdir() here, they may call
      * vimLoadLib() recursively, which causes a stack overflow. */
@@ -438,7 +405,6 @@ vimLoadLib(char *name)
 	get_exe_name();
     if (exe_path != NULL)
     {
-#ifdef FEAT_MBYTE
 	WCHAR old_dirw[MAXPATHL];
 
 	if (GetCurrentDirectoryW(MAXPATHL, old_dirw) != 0)
@@ -451,18 +417,6 @@ vimLoadLib(char *name)
 	    SetCurrentDirectoryW(old_dirw);
 	    return dll;
 	}
-	/* Retry with non-wide function (for Windows 98). */
-	if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-#endif
-	    if (GetCurrentDirectory(MAXPATHL, old_dir) != 0)
-	    {
-		/* Change directory to where the executable is, both to make
-		 * sure we find a .dll there and to avoid looking for a .dll
-		 * in the current directory. */
-		SetCurrentDirectory((LPCSTR)exe_path);
-		dll = LoadLibrary(name);
-		SetCurrentDirectory(old_dir);
-	    }
     }
     return dll;
 }
@@ -621,38 +575,8 @@ DWORD g_PlatformId;
 # ifndef PROTECTED_DACL_SECURITY_INFORMATION
 #  define PROTECTED_DACL_SECURITY_INFORMATION	0x80000000L
 # endif
-
-/*
- * These are needed to dynamically load the ADVAPI DLL, which is not
- * implemented under Windows 95 (and causes VIM to crash)
- */
-typedef DWORD (WINAPI *PSNSECINFO) (LPSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID, PSID, PACL, PACL);
-typedef DWORD (WINAPI *PGNSECINFO) (LPSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *,
-	PSECURITY_DESCRIPTOR *);
-# ifdef FEAT_MBYTE
-typedef DWORD (WINAPI *PSNSECINFOW) (LPWSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID, PSID, PACL, PACL);
-typedef DWORD (WINAPI *PGNSECINFOW) (LPWSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *,
-	PSECURITY_DESCRIPTOR *);
-# endif
-
-static HANDLE advapi_lib = NULL;	/* Handle for ADVAPI library */
-static PSNSECINFO pSetNamedSecurityInfo;
-static PGNSECINFO pGetNamedSecurityInfo;
-# ifdef FEAT_MBYTE
-static PSNSECINFOW pSetNamedSecurityInfoW;
-static PGNSECINFOW pGetNamedSecurityInfoW;
-# endif
 #endif
 
-typedef BOOL (WINAPI *PSETHANDLEINFORMATION)(HANDLE, DWORD, DWORD);
-
-static BOOL allowPiping = FALSE;
-static PSETHANDLEINFORMATION pSetHandleInformation;
-
 #ifdef HAVE_ACL
 /*
  * Enables or disables the specified privilege.
@@ -712,93 +636,13 @@ PlatformId(void)
 	    win8_or_later = TRUE;
 
 #ifdef HAVE_ACL
-	/*
-	 * Load the ADVAPI runtime if we are on anything
-	 * other than Windows 95
-	 */
-	if (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	{
-	    /*
-	     * do this load.  Problems: Doesn't unload at end of run (this is
-	     * theoretically okay, since Windows should unload it when VIM
-	     * terminates).  Should we be using the 'mch_libcall' routines?
-	     * Seems like a lot of overhead to load/unload ADVAPI32.DLL each
-	     * time we verify security...
-	     */
-	    advapi_lib = vimLoadLib("ADVAPI32.DLL");
-	    if (advapi_lib != NULL)
-	    {
-		pSetNamedSecurityInfo = (PSNSECINFO)GetProcAddress(advapi_lib,
-						      "SetNamedSecurityInfoA");
-		pGetNamedSecurityInfo = (PGNSECINFO)GetProcAddress(advapi_lib,
-						      "GetNamedSecurityInfoA");
-# ifdef FEAT_MBYTE
-		pSetNamedSecurityInfoW = (PSNSECINFOW)GetProcAddress(advapi_lib,
-						      "SetNamedSecurityInfoW");
-		pGetNamedSecurityInfoW = (PGNSECINFOW)GetProcAddress(advapi_lib,
-						      "GetNamedSecurityInfoW");
-# endif
-		if (pSetNamedSecurityInfo == NULL
-			|| pGetNamedSecurityInfo == NULL
-# ifdef FEAT_MBYTE
-			|| pSetNamedSecurityInfoW == NULL
-			|| pGetNamedSecurityInfoW == NULL
-# endif
-			)
-		{
-		    /* If we can't get the function addresses, set advapi_lib
-		     * to NULL so that we don't use them. */
-		    FreeLibrary(advapi_lib);
-		    advapi_lib = NULL;
-		}
-		/* Enable privilege for getting or setting SACLs. */
-		win32_enable_privilege(SE_SECURITY_NAME, TRUE);
-	    }
-	}
+	/* Enable privilege for getting or setting SACLs. */
+	win32_enable_privilege(SE_SECURITY_NAME, TRUE);
 #endif
-	/*
-	 * If we are on windows NT, try to load the pipe functions, only
-	 * available from Win2K.
-	 */
-	if (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	{
-	    HANDLE kernel32 = GetModuleHandle("kernel32");
-	    pSetHandleInformation = (PSETHANDLEINFORMATION)GetProcAddress(
-					    kernel32, "SetHandleInformation");
-
-	    allowPiping = pSetHandleInformation != NULL;
-	}
 	done = TRUE;
     }
 }
 
-/*
- * Return TRUE when running on Windows 95 (or 98 or ME).
- * Only to be used after mch_init().
- */
-    int
-mch_windows95(void)
-{
-    return g_PlatformId == VER_PLATFORM_WIN32_WINDOWS;
-}
-
-#ifdef FEAT_GUI_W32
-/*
- * Used to work around the "can't do synchronous spawn"
- * problem on Win32s, without resorting to Universal Thunk.
- */
-static int old_num_windows;
-static int num_windows;
-
-/*ARGSUSED*/
-    static BOOL CALLBACK
-win32ssynch_cb(HWND hwnd, LPARAM lparam)
-{
-    num_windows++;
-    return TRUE;
-}
-#endif
-
 #ifndef FEAT_GUI_W32
 
 #define SHIFT  (SHIFT_PRESSED)
@@ -926,15 +770,6 @@ win32_kbd_patch_key(
 
     vim_memset(abKeystate, 0, sizeof (abKeystate));
 
-    // Should only be non-NULL on NT 4.0
-    if (s_pfnGetConsoleKeyboardLayoutName != NULL)
-    {
-	CHAR szKLID[KL_NAMELENGTH];
-
-	if ((*s_pfnGetConsoleKeyboardLayoutName)(szKLID))
-	    (void)LoadKeyboardLayout(szKLID, KLF_ACTIVATE);
-    }
-
     /* Clear any pending dead keys */
     ToUnicode(VK_SPACE, MapVirtualKey(VK_SPACE, 0), abKeystate, awAnsiCode, 2, 0);
 
@@ -1977,17 +1812,13 @@ executable_exists(char *name, char_u **p
 	    n = (long)SearchPathW(wnewpath, p, NULL, _MAX_PATH, fnamew, &dumw);
 	    vim_free(wnewpath);
 	    vim_free(p);
-	    if (n > 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    {
-		if (n == 0)
-		    return FALSE;
-		if (GetFileAttributesW(fnamew) & FILE_ATTRIBUTE_DIRECTORY)
-		    return FALSE;
-		if (path != NULL)
-		    *path = utf16_to_enc(fnamew, NULL);
-		return TRUE;
-	    }
-	    /* Retry with non-wide function (for Windows 98). */
+	    if (n == 0)
+		return FALSE;
+	    if (GetFileAttributesW(fnamew) & FILE_ATTRIBUTE_DIRECTORY)
+		return FALSE;
+	    if (path != NULL)
+		*path = utf16_to_enc(fnamew, NULL);
+	    return TRUE;
 	}
     }
 #endif
@@ -2462,8 +2293,6 @@ SetConsoleIcon(
     static void
 SaveConsoleTitleAndIcon(void)
 {
-    GETCONSOLEWINDOWPROC GetConsoleWindowProc;
-
     /* Save the original title. */
     if (!GetConsoleTitle(g_szOrigTitle, sizeof(g_szOrigTitle)))
 	return;
@@ -2475,12 +2304,7 @@ SaveConsoleTitleAndIcon(void)
      * 2000.  On older operating systems, we can't change the window icon
      * anyway.
      */
-    if ((GetConsoleWindowProc = (GETCONSOLEWINDOWPROC)
-	    GetProcAddress(GetModuleHandle("KERNEL32.DLL"),
-		    "GetConsoleWindow")) != NULL)
-    {
-	g_hWnd = (*GetConsoleWindowProc)();
-    }
+    g_hWnd = GetConsoleWindow();
     if (g_hWnd == NULL)
 	return;
 
@@ -2589,11 +2413,6 @@ mch_init(void)
 #ifdef FEAT_CLIPBOARD
     win_clip_init();
 #endif
-
-    /* This will be NULL on anything but NT 4.0 */
-    s_pfnGetConsoleKeyboardLayoutName =
-	(PFNGCKLN) GetProcAddress(GetModuleHandle("kernel32.dll"),
-				  "GetConsoleKeyboardLayoutNameA");
 }
 
 /*
@@ -2775,9 +2594,6 @@ fname_casew(
 	    *porig = c;
 	    ptrue = ptruePrev + wcslen(ptruePrev);
 	}
-	else if (hFind == INVALID_HANDLE_VALUE
-		&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	    return FAIL;
     }
 
     wcscpy(name, szTrueName);
@@ -2836,7 +2652,7 @@ fname_case(
 		}
 	    }
 	}
-	/* Retry with non-wide function (for Windows 98). */
+	return;
     }
 #endif
 
@@ -2966,9 +2782,6 @@ mch_get_user_name(
 		return OK;
 	    }
 	}
-	else if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return FAIL;
-	/* Retry with non-wide function (for Windows 98). */
     }
 #endif
     if (GetUserName(szUserName, &cch))
@@ -3008,9 +2821,6 @@ mch_get_host_name(
 		return;
 	    }
 	}
-	else if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return;
-	/* Retry with non-wide function (for Windows 98). */
     }
 #endif
     if (!GetComputerName((LPSTR)s, &cch))
@@ -3059,9 +2869,7 @@ mch_dirname(
 		return OK;
 	    }
 	}
-	else if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return FAIL;
-	/* Retry with non-wide function (for Windows 98). */
+	return FAIL;
     }
 #endif
     return (GetCurrentDirectory(len, (LPSTR)buf) != 0 ? OK : FAIL);
@@ -3101,9 +2909,8 @@ mch_setperm(char_u *name, long perm)
 	{
 	    n = _wchmod(p, perm);
 	    vim_free(p);
-	    if (n == -1 && g_PlatformId == VER_PLATFORM_WIN32_NT)
+	    if (n == -1)
 		return FAIL;
-	    /* Retry with non-wide function (for Windows 98). */
 	}
     }
     if (n == -1)
@@ -3251,18 +3058,7 @@ mch_is_symbolic_link(char_u *name)
     {
 	hFind = FindFirstFileW(wn, &findDataW);
 	vim_free(wn);
-	if (hFind == INVALID_HANDLE_VALUE
-		&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    hFind = FindFirstFile((LPCSTR)name, &findDataA);
-	    if (hFind != INVALID_HANDLE_VALUE)
-	    {
-		fileFlags = findDataA.dwFileAttributes;
-		reparseTag = findDataA.dwReserved0;
-	    }
-	}
-	else
+	if (hFind != INVALID_HANDLE_VALUE)
 	{
 	    fileFlags = findDataW.dwFileAttributes;
 	    reparseTag = findDataW.dwReserved0;
@@ -3321,7 +3117,7 @@ win32_fileinfo(char_u *fname, BY_HANDLE_
     {
 	wn = enc_to_utf16(fname, NULL);
 	if (wn == NULL)
-	    res = FILEINFO_ENC_FAIL;
+	    return FILEINFO_ENC_FAIL;
     }
     if (wn != NULL)
     {
@@ -3332,15 +3128,9 @@ win32_fileinfo(char_u *fname, BY_HANDLE_
 		    OPEN_EXISTING,	/* creation disposition */
 		    FILE_FLAG_BACKUP_SEMANTICS,	/* file attributes */
 		    NULL);		/* handle to template file */
-	if (hFile == INVALID_HANDLE_VALUE
-			      && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    vim_free(wn);
-	    wn = NULL;
-	}
+	vim_free(wn);
     }
-    if (wn == NULL)
+    else
 #endif
 	hFile = CreateFile((LPCSTR)fname,    /* file name */
 		    GENERIC_READ,	    /* access mode */
@@ -3359,9 +3149,6 @@ win32_fileinfo(char_u *fname, BY_HANDLE_
 	CloseHandle(hFile);
     }
 
-#ifdef FEAT_MBYTE
-    vim_free(wn);
-#endif
     return res;
 }
 
@@ -3383,19 +3170,12 @@ win32_getattrs(char_u *name)
     if (p != NULL)
     {
 	attr = GetFileAttributesW(p);
-	if (attr < 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    vim_free(p);
-	    p = NULL;
-	}
+	vim_free(p);
     }
-    if (p == NULL)
+    else
 #endif
 	attr = GetFileAttributes((char *)name);
-#ifdef FEAT_MBYTE
-    vim_free(p);
-#endif
+
     return attr;
 }
 
@@ -3418,20 +3198,12 @@ win32_setattrs(char_u *name, int attrs)
     if (p != NULL)
     {
 	res = SetFileAttributesW(p, attrs);
-	if (res == FALSE
-	    && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    vim_free(p);
-	    p = NULL;
-	}
+	vim_free(p);
     }
-    if (p == NULL)
+    else
 #endif
 	res = SetFileAttributes((char *)name, attrs);
-#ifdef FEAT_MBYTE
-    vim_free(p);
-#endif
+
     return res ? 0 : -1;
 }
 
@@ -3539,27 +3311,20 @@ mch_nodetype(char_u *name)
 
 #ifdef FEAT_MBYTE
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	wn = enc_to_utf16(name, NULL);
+
+    if (wn != NULL)
     {
-	wn = enc_to_utf16(name, NULL);
-	if (wn != NULL)
-	{
-	    hFile = CreateFileW(wn,	/* file name */
-			GENERIC_WRITE,	/* access mode */
-			0,		/* share mode */
-			NULL,		/* security descriptor */
-			OPEN_EXISTING,	/* creation disposition */
-			0,		/* file attributes */
-			NULL);		/* handle to template file */
-	    if (hFile == INVALID_HANDLE_VALUE
-			      && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	    {
-		/* Retry with non-wide function (for Windows 98). */
-		vim_free(wn);
-		wn = NULL;
-	    }
-	}
+	hFile = CreateFileW(wn,		    /* file name */
+		    GENERIC_WRITE,	    /* access mode */
+		    0,			    /* share mode */
+		    NULL,		    /* security descriptor */
+		    OPEN_EXISTING,	    /* creation disposition */
+		    0,			    /* file attributes */
+		    NULL);		    /* handle to template file */
+	vim_free(wn);
     }
-    if (wn == NULL)
+    else
 #endif
 	hFile = CreateFile((LPCSTR)name,    /* file name */
 		    GENERIC_WRITE,	    /* access mode */
@@ -3569,9 +3334,6 @@ mch_nodetype(char_u *name)
 		    0,			    /* file attributes */
 		    NULL);		    /* handle to template file */
 
-#ifdef FEAT_MBYTE
-    vim_free(wn);
-#endif
     if (hFile == INVALID_HANDLE_VALUE)
 	return NODE_NORMAL;
 
@@ -3608,88 +3370,84 @@ mch_get_acl(char_u *fname)
     struct my_acl   *p = NULL;
     DWORD   err;
 
-    /* This only works on Windows NT and 2000. */
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT && advapi_lib != NULL)
+    p = (struct my_acl *)alloc_clear((unsigned)sizeof(struct my_acl));
+    if (p != NULL)
     {
-	p = (struct my_acl *)alloc_clear((unsigned)sizeof(struct my_acl));
-	if (p != NULL)
+# ifdef FEAT_MBYTE
+	WCHAR	*wn = NULL;
+
+	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    wn = enc_to_utf16(fname, NULL);
+	if (wn != NULL)
 	{
-# ifdef FEAT_MBYTE
-	    WCHAR	*wn = NULL;
-
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-		wn = enc_to_utf16(fname, NULL);
-	    if (wn != NULL)
+	    /* Try to retrieve the entire security descriptor. */
+	    err = GetNamedSecurityInfoW(
+		    wn,			// Abstract filename
+		    SE_FILE_OBJECT,	// File Object
+		    OWNER_SECURITY_INFORMATION |
+		    GROUP_SECURITY_INFORMATION |
+		    DACL_SECURITY_INFORMATION |
+		    SACL_SECURITY_INFORMATION,
+		    &p->pSidOwner,	// Ownership information.
+		    &p->pSidGroup,	// Group membership.
+		    &p->pDacl,		// Discretionary information.
+		    &p->pSacl,		// For auditing purposes.
+		    &p->pSecurityDescriptor);
+	    if (err == ERROR_ACCESS_DENIED ||
+		    err == ERROR_PRIVILEGE_NOT_HELD)
+	    {
+		/* Retrieve only DACL. */
+		(void)GetNamedSecurityInfoW(
+			wn,
+			SE_FILE_OBJECT,
+			DACL_SECURITY_INFORMATION,
+			NULL,
+			NULL,
+			&p->pDacl,
+			NULL,
+			&p->pSecurityDescriptor);
+	    }
+	    if (p->pSecurityDescriptor == NULL)
 	    {
-		/* Try to retrieve the entire security descriptor. */
-		err = pGetNamedSecurityInfoW(
-			    wn,			// Abstract filename
-			    SE_FILE_OBJECT,	// File Object
-			    OWNER_SECURITY_INFORMATION |
-			    GROUP_SECURITY_INFORMATION |
-			    DACL_SECURITY_INFORMATION |
-			    SACL_SECURITY_INFORMATION,
-			    &p->pSidOwner,	// Ownership information.
-			    &p->pSidGroup,	// Group membership.
-			    &p->pDacl,		// Discretionary information.
-			    &p->pSacl,		// For auditing purposes.
-			    &p->pSecurityDescriptor);
-		if (err == ERROR_ACCESS_DENIED ||
-			err == ERROR_PRIVILEGE_NOT_HELD)
-		{
-		    /* Retrieve only DACL. */
-		    (void)pGetNamedSecurityInfoW(
-			    wn,
-			    SE_FILE_OBJECT,
-			    DACL_SECURITY_INFORMATION,
-			    NULL,
-			    NULL,
-			    &p->pDacl,
-			    NULL,
-			    &p->pSecurityDescriptor);
-		}
-		if (p->pSecurityDescriptor == NULL)
-		{
-		    mch_free_acl((vim_acl_T)p);
-		    p = NULL;
-		}
-		vim_free(wn);
+		mch_free_acl((vim_acl_T)p);
+		p = NULL;
 	    }
-	    else
+	    vim_free(wn);
+	}
+	else
 # endif
+	{
+	    /* Try to retrieve the entire security descriptor. */
+	    err = GetNamedSecurityInfo(
+		    (LPSTR)fname,	// Abstract filename
+		    SE_FILE_OBJECT,	// File Object
+		    OWNER_SECURITY_INFORMATION |
+		    GROUP_SECURITY_INFORMATION |
+		    DACL_SECURITY_INFORMATION |
+		    SACL_SECURITY_INFORMATION,
+		    &p->pSidOwner,	// Ownership information.
+		    &p->pSidGroup,	// Group membership.
+		    &p->pDacl,		// Discretionary information.
+		    &p->pSacl,		// For auditing purposes.
+		    &p->pSecurityDescriptor);
+	    if (err == ERROR_ACCESS_DENIED ||
+		    err == ERROR_PRIVILEGE_NOT_HELD)
 	    {
-		/* Try to retrieve the entire security descriptor. */
-		err = pGetNamedSecurityInfo(
-			    (LPSTR)fname,	// Abstract filename
-			    SE_FILE_OBJECT,	// File Object
-			    OWNER_SECURITY_INFORMATION |
-			    GROUP_SECURITY_INFORMATION |
-			    DACL_SECURITY_INFORMATION |
-			    SACL_SECURITY_INFORMATION,
-			    &p->pSidOwner,	// Ownership information.
-			    &p->pSidGroup,	// Group membership.
-			    &p->pDacl,		// Discretionary information.
-			    &p->pSacl,		// For auditing purposes.
-			    &p->pSecurityDescriptor);
-		if (err == ERROR_ACCESS_DENIED ||
-			err == ERROR_PRIVILEGE_NOT_HELD)
-		{
-		    /* Retrieve only DACL. */
-		    (void)pGetNamedSecurityInfo(
-			    (LPSTR)fname,
-			    SE_FILE_OBJECT,
-			    DACL_SECURITY_INFORMATION,
-			    NULL,
-			    NULL,
-			    &p->pDacl,
-			    NULL,
-			    &p->pSecurityDescriptor);
-		}
-		if (p->pSecurityDescriptor == NULL)
-		{
-		    mch_free_acl((vim_acl_T)p);
-		    p = NULL;
-		}
+		/* Retrieve only DACL. */
+		(void)GetNamedSecurityInfo(
+			(LPSTR)fname,
+			SE_FILE_OBJECT,
+			DACL_SECURITY_INFORMATION,
+			NULL,
+			NULL,
+			&p->pDacl,
+			NULL,
+			&p->pSecurityDescriptor);
+	    }
+	    if (p->pSecurityDescriptor == NULL)
+	    {
+		mch_free_acl((vim_acl_T)p);
+		p = NULL;
 	    }
 	}
     }
@@ -3733,7 +3491,7 @@ mch_set_acl(char_u *fname, vim_acl_T acl
     struct my_acl   *p = (struct my_acl *)acl;
     SECURITY_INFORMATION    sec_info = 0;
 
-    if (p != NULL && advapi_lib != NULL)
+    if (p != NULL)
     {
 # ifdef FEAT_MBYTE
 	WCHAR	*wn = NULL;
@@ -3761,7 +3519,7 @@ mch_set_acl(char_u *fname, vim_acl_T acl
 	    wn = enc_to_utf16(fname, NULL);
 	if (wn != NULL)
 	{
-	    (void)pSetNamedSecurityInfoW(
+	    (void)SetNamedSecurityInfoW(
 			wn,			// Abstract filename
 			SE_FILE_OBJECT,		// File Object
 			sec_info,
@@ -3775,7 +3533,7 @@ mch_set_acl(char_u *fname, vim_acl_T acl
 	else
 # endif
 	{
-	    (void)pSetNamedSecurityInfo(
+	    (void)SetNamedSecurityInfo(
 			(LPSTR)fname,		// Abstract filename
 			SE_FILE_OBJECT,		// File Object
 			sec_info,
@@ -4076,7 +3834,7 @@ vim_create_process(
     STARTUPINFO		*si,
     PROCESS_INFORMATION *pi)
 {
-#  ifdef FEAT_MBYTE
+#ifdef FEAT_MBYTE
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 	WCHAR	*wcmd = enc_to_utf16((char_u *)cmd, NULL);
@@ -4138,31 +3896,21 @@ mch_system_classic(char *cmd, int option
     si.lpTitle = NULL;
     si.dwFlags = STARTF_USESHOWWINDOW;
     /*
-     * It's nicer to run a filter command in a minimized window, but in
-     * Windows 95 this makes the command MUCH slower.  We can't do it under
-     * Win32s either as it stops the synchronous spawn workaround working.
+     * It's nicer to run a filter command in a minimized window.
      * Don't activate the window to keep focus on Vim.
      */
-    if ((options & SHELL_DOOUT) && !mch_windows95())
+    if (options & SHELL_DOOUT)
 	si.wShowWindow = SW_SHOWMINNOACTIVE;
     else
 	si.wShowWindow = SW_SHOWNORMAL;
     si.cbReserved2 = 0;
     si.lpReserved2 = NULL;
 
-    /* There is a strange error on Windows 95 when using "c:\command.com".
-     * When the "c:\\" is left out it works OK...? */
-    if (mch_windows95()
-	    && (STRNICMP(cmd, "c:/command.com", 14) == 0
-		|| STRNICMP(cmd, "c:\\command.com", 14) == 0))
-	cmd += 3;
-
     /* Now, run the command */
     vim_create_process(cmd, FALSE,
 	    CREATE_DEFAULT_ERROR_MODE |	CREATE_NEW_CONSOLE, &si, &pi);
 
     /* Wait for the command to terminate before continuing */
-    if (g_PlatformId != VER_PLATFORM_WIN32s)
     {
 #ifdef FEAT_GUI
 	int	    delay = 1;
@@ -4195,23 +3943,6 @@ mch_system_classic(char *cmd, int option
 	/* Get the command exit code */
 	GetExitCodeProcess(pi.hProcess, &ret);
     }
-    else
-    {
-	/*
-	 * This ugly code is the only quick way of performing
-	 * a synchronous spawn under Win32s. Yuk.
-	 */
-	num_windows = 0;
-	EnumWindows(win32ssynch_cb, 0);
-	old_num_windows = num_windows;
-	do
-	{
-	    Sleep(1000);
-	    num_windows = 0;
-	    EnumWindows(win32ssynch_cb, 0);
-	} while (num_windows == old_num_windows);
-	ret = 0;
-    }
 
     /* Close the handles to the subprocess, so that it goes away */
     CloseHandle(pi.hThread);
@@ -4453,11 +4184,11 @@ mch_system_piped(char *cmd, int options)
 
     if ( ! CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0)
 	/* Ensure the read handle to the pipe for STDOUT is not inherited. */
-       || ! pSetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0)
+       || ! SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0)
 	/* Create a pipe for the child process's STDIN. */
        || ! CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0)
 	/* Ensure the write handle to the pipe for STDIN is not inherited. */
-       || ! pSetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) )
+       || ! SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) )
     {
 	CloseHandle(g_hChildStd_IN_Rd);
 	CloseHandle(g_hChildStd_IN_Wr);
@@ -4707,7 +4438,7 @@ mch_system_piped(char *cmd, int options)
 mch_system(char *cmd, int options)
 {
     /* if we can pipe and the shelltemp option is off */
-    if (allowPiping && !p_stmp)
+    if (!p_stmp)
 	return mch_system_piped(cmd, options);
     else
 	return mch_system_classic(cmd, options);
@@ -4960,7 +4691,7 @@ mch_call_shell(
 	{
 	    cmdlen = (
 #ifdef FEAT_GUI_W32
-		(allowPiping && !p_stmp ? 0 : STRLEN(vimrun_path)) +
+		(!p_stmp ? 0 : STRLEN(vimrun_path)) +
 #endif
 		STRLEN(p_sh) + STRLEN(p_shcf) + STRLEN(cmd) + 10);
 
@@ -4978,7 +4709,7 @@ mch_call_shell(
 			    MB_ICONWARNING);
 		    need_vimrun_warning = FALSE;
 		}
-		if (!s_dont_use_vimrun && (!allowPiping || p_stmp))
+		if (!s_dont_use_vimrun && p_stmp)
 		    /* Use vimrun to execute the command.  It opens a console
 		     * window, which can be closed without killing Vim. */
 		    vim_snprintf((char *)newcmd, cmdlen, "%s%s%s %s %s",
@@ -5002,8 +4733,7 @@ mch_call_shell(
     /* Print the return value, unless "vimrun" was used. */
     if (x != 0 && !(options & SHELL_SILENT) && !emsg_silent
 #if defined(FEAT_GUI_W32)
-		&& ((options & SHELL_DOOUT) || s_dont_use_vimrun
-						  || (allowPiping && !p_stmp))
+		&& ((options & SHELL_DOOUT) || s_dont_use_vimrun || !p_stmp)
 #endif
 	    )
     {
@@ -5051,14 +4781,10 @@ job_io_file_open(
                      lpSecurityAttributes, dwCreationDisposition,
                      dwFlagsAndAttributes, NULL);
             vim_free(wn);
-            if (h == INVALID_HANDLE_VALUE
-                          && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-                wn = NULL;
         }
     }
     if (wn == NULL)
 # endif
-
         h = CreateFile((LPCSTR)fname, dwDesiredAccess, dwShareMode,
                      lpSecurityAttributes, dwCreationDisposition,
                      dwFlagsAndAttributes, NULL);
@@ -5127,7 +4853,7 @@ mch_start_job(char *cmd, job_T *job, job
     }
     else if (!use_null_for_in &&
 	    (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0)
-	    || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)))
+	    || !SetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)))
 	goto failed;
 
     if (use_file_for_out)
@@ -5145,7 +4871,7 @@ mch_start_job(char *cmd, job_T *job, job
     }
     else if (!use_null_for_out &&
 	    (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0)
-	    || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)))
+	    || !SetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)))
 	goto failed;
 
     if (use_file_for_err)
@@ -5163,7 +4889,7 @@ mch_start_job(char *cmd, job_T *job, job
     }
     else if (!use_out_for_err && !use_null_for_err &&
 	    (!CreatePipe(&efd[0], &efd[1], &saAttr, 0)
-	    || !pSetHandleInformation(efd[0], HANDLE_FLAG_INHERIT, 0)))
+	    || !SetHandleInformation(efd[0], HANDLE_FLAG_INHERIT, 0)))
 	goto failed;
 
     si.dwFlags |= STARTF_USESTDHANDLES;
@@ -6176,9 +5902,7 @@ mch_remove(char_u *name)
 	{
 	    n = DeleteFileW(wn) ? 0 : -1;
 	    vim_free(wn);
-	    if (n == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return n;
-	    /* Retry with non-wide function (for Windows 98). */
+	    return n;
 	}
     }
 #endif
@@ -6203,7 +5927,6 @@ mch_breakcheck(int force)
 
 /* physical RAM to leave for the OS */
 #define WINNT_RESERVE_BYTES     (256*1024*1024)
-#define WIN95_RESERVE_BYTES       (8*1024*1024)
 
 /*
  * How much main memory in KiB that can be used by VIM.
@@ -6212,54 +5935,25 @@ mch_breakcheck(int force)
     long_u
 mch_total_mem(int special)
 {
+    MEMORYSTATUSEX  ms;
+
     PlatformId();
-#if (defined(_MSC_VER) && (WINVER > 0x0400)) || defined(MEMORYSTATUSEX)
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT)
+    /* Need to use GlobalMemoryStatusEx() when there is more memory than
+     * what fits in 32 bits. But it's not always available. */
+    ms.dwLength = sizeof(MEMORYSTATUSEX);
+    GlobalMemoryStatusEx(&ms);
+    if (ms.ullAvailVirtual < ms.ullTotalPhys)
     {
-	MEMORYSTATUSEX  ms;
-
-	/* Need to use GlobalMemoryStatusEx() when there is more memory than
-	 * what fits in 32 bits. But it's not always available. */
-	ms.dwLength = sizeof(MEMORYSTATUSEX);
-	GlobalMemoryStatusEx(&ms);
-	if (ms.ullAvailVirtual < ms.ullTotalPhys)
-	{
-	    /* Process address space fits in physical RAM, use all of it. */
-	    return (long_u)(ms.ullAvailVirtual / 1024);
-	}
-	if (ms.ullTotalPhys <= WINNT_RESERVE_BYTES)
-	{
-	    /* Catch old NT box or perverse hardware setup. */
-	    return (long_u)((ms.ullTotalPhys / 2) / 1024);
-	}
-	/* Use physical RAM less reserve for OS + data. */
-	return (long_u)((ms.ullTotalPhys - WINNT_RESERVE_BYTES) / 1024);
+	/* Process address space fits in physical RAM, use all of it. */
+	return (long_u)(ms.ullAvailVirtual / 1024);
     }
-    else
-#endif
+    if (ms.ullTotalPhys <= WINNT_RESERVE_BYTES)
     {
-	/* Pre-XP or 95 OS handling. */
-	MEMORYSTATUS    ms;
-	long_u		os_reserve_bytes;
-
-	ms.dwLength = sizeof(MEMORYSTATUS);
-	GlobalMemoryStatus(&ms);
-	if (ms.dwAvailVirtual < ms.dwTotalPhys)
-	{
-	    /* Process address space fits in physical RAM, use all of it. */
-	    return (long_u)(ms.dwAvailVirtual / 1024);
-	}
-	os_reserve_bytes = (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	    ? WINNT_RESERVE_BYTES
-	    : WIN95_RESERVE_BYTES;
-	if (ms.dwTotalPhys <= os_reserve_bytes)
-	{
-	    /* Catch old boxes or perverse hardware setup. */
-	    return (long_u)((ms.dwTotalPhys / 2) / 1024);
-	}
-	/* Use physical RAM less reserve for OS + data. */
-	return (long_u)((ms.dwTotalPhys - os_reserve_bytes) / 1024);
+	/* Catch old NT box or perverse hardware setup. */
+	return (long_u)((ms.ullTotalPhys / 2) / 1024);
     }
+    /* Use physical RAM less reserve for OS + data. */
+    return (long_u)((ms.ullTotalPhys - WINNT_RESERVE_BYTES) / 1024);
 }
 
 #ifdef FEAT_MBYTE
@@ -6276,16 +5970,13 @@ mch_wrename(WCHAR *wold, WCHAR *wnew)
     WCHAR	szNewPath[_MAX_PATH + 1];
     HANDLE	hf;
 
-    if (!mch_windows95())
-    {
-	p = wold;
-	for (i = 0; wold[i] != NUL; ++i)
-	    if ((wold[i] == '/' || wold[i] == '\\' || wold[i] == ':')
-		    && wold[i + 1] != 0)
-		p = wold + i + 1;
-	if ((int)(wold + i - p) < 8 || p[6] != '~')
-	    return (MoveFileW(wold, wnew) == 0);
-    }
+    p = wold;
+    for (i = 0; wold[i] != NUL; ++i)
+	if ((wold[i] == '/' || wold[i] == '\\' || wold[i] == ':')
+		&& wold[i + 1] != 0)
+	    p = wold + i + 1;
+    if ((int)(wold + i - p) < 8 || p[6] != '~')
+	return (MoveFileW(wold, wnew) == 0);
 
     if (GetFullPathNameW(wnew, _MAX_PATH, szNewPath, &p) == 0 || p == NULL)
 	return -1;
@@ -6363,22 +6054,17 @@ mch_rename(
 	    retval = mch_wrename(wold, wnew);
 	vim_free(wold);
 	vim_free(wnew);
-	if (retval == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return retval;
-	/* Retry with non-wide function (for Windows 98). */
+	return retval;
     }
 #endif
 
     /*
-     * No need to play tricks if not running Windows 95, unless the file name
-     * contains a "~" as the seventh character.
+     * No need to play tricks unless the file name contains a "~" as the
+     * seventh character.
      */
-    if (!mch_windows95())
-    {
-	pszFilePart = (char *)gettail((char_u *)pszOldFile);
-	if (STRLEN(pszFilePart) < 8 || pszFilePart[6] != '~')
-	    return rename(pszOldFile, pszNewFile);
-    }
+    pszFilePart = (char *)gettail((char_u *)pszOldFile);
+    if (STRLEN(pszFilePart) < 8 || pszFilePart[6] != '~')
+	return rename(pszOldFile, pszNewFile);
 
     /* Get base path of new file name.  Undocumented feature: If pszNewFile is
      * a directory, no error is returned and pszFilePart will be NULL. */
@@ -6441,16 +6127,9 @@ mch_rename(
     char *
 default_shell(void)
 {
-    char* psz = NULL;
-
     PlatformId();
 
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT)		/* Windows NT */
-	psz = "cmd.exe";
-    else if (g_PlatformId == VER_PLATFORM_WIN32_WINDOWS) /* Windows 95 */
-	psz = "command.com";
-
-    return psz;
+    return "cmd.exe";
 }
 
 /*
@@ -6496,18 +6175,11 @@ mch_access(char *n, int p)
 
 		hFile = FindFirstFileW(TempNameW, &d);
 		if (hFile == INVALID_HANDLE_VALUE)
-		{
-		    if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-			goto getout;
-
-		    /* Retry with non-wide function (for Windows 98). */
-		    vim_free(wn);
-		    wn = NULL;
-		}
+		    goto getout;
 		else
 		    (void)FindClose(hFile);
 	    }
-	    if (wn == NULL)
+	    else
 #endif
 	    {
 		char		    *pch;
@@ -6537,18 +6209,11 @@ mch_access(char *n, int p)
 	    if (wn != NULL)
 	    {
 		if (!GetTempFileNameW(wn, L"VIM", 0, TempNameW))
-		{
-		    if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-			goto getout;
-
-		    /* Retry with non-wide function (for Windows 98). */
-		    vim_free(wn);
-		    wn = NULL;
-		}
+		    goto getout;
 		else
 		    DeleteFileW(TempNameW);
 	    }
-	    if (wn == NULL)
+	    else
 #endif
 	    {
 		if (!GetTempFileName(n, "VIM", 0, TempName))
@@ -6565,17 +6230,8 @@ mch_access(char *n, int p)
 		| ((p & R_OK) ? GENERIC_READ : 0);
 #ifdef FEAT_MBYTE
 	if (wn != NULL)
-	{
 	    hFile = CreateFileW(wn, am, 0, NULL, OPEN_EXISTING, 0, NULL);
-	    if (hFile == INVALID_HANDLE_VALUE
-			      && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	    {
-		/* Retry with non-wide function (for Windows 98). */
-		vim_free(wn);
-		wn = NULL;
-	    }
-	}
-	if (wn == NULL)
+	else
 #endif
 	    hFile = CreateFile(n, am, 0, NULL, OPEN_EXISTING, 0, NULL);
 	if (hFile == INVALID_HANDLE_VALUE)
@@ -6610,11 +6266,7 @@ mch_open(char *name, int flags, int mode
 	{
 	    f = _wopen(wn, flags, mode);
 	    vim_free(wn);
-	    if (f >= 0 || g_PlatformId == VER_PLATFORM_WIN32_NT)
-		return f;
-	    /* Retry with non-wide function (for Windows 98). Can't use
-	     * GetLastError() here and it's unclear what errno gets set to if
-	     * the _wopen() fails for missing wide functions. */
+	    return f;
 	}
     }
 # endif
@@ -6638,12 +6290,7 @@ mch_fopen(char *name, char *mode)
     WCHAR	*wn, *wm;
     FILE	*f = NULL;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage
-# ifdef __BORLANDC__
-	    /* Wide functions of Borland C 5.5 do not work on Windows 98. */
-	    && g_PlatformId == VER_PLATFORM_WIN32_NT
-# endif
-       )
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 # if defined(DEBUG) && _MSC_VER >= 1400
 	/* Work around an annoying assertion in the Microsoft debug CRT
@@ -6667,12 +6314,7 @@ mch_fopen(char *name, char *mode)
 # if defined(DEBUG) && _MSC_VER >= 1400
 	_set_fmode(oldMode);
 # endif
-
-	if (f != NULL || g_PlatformId == VER_PLATFORM_WIN32_NT)
-	    return f;
-	/* Retry with non-wide function (for Windows 98). Can't use
-	 * GetLastError() here and it's unclear what errno gets set to if
-	 * the _wfopen() fails for missing wide functions. */
+	return f;
     }
 
     /* fopen() can open a file which name is longer than _MAX_PATH bytes
@@ -6843,8 +6485,7 @@ mch_copy_file_attribute(char_u *from, ch
 #ifdef FEAT_MBYTE
     /* File streams only work on Windows NT and later. */
     PlatformId();
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	copy_infostreams(from, to);
+    copy_infostreams(from, to);
 #endif
     return 0;
 }
@@ -6856,7 +6497,6 @@ mch_copy_file_attribute(char_u *from, ch
  */
 
 /* These magic numbers are from the MS header files */
-#define MIN_STACK_WIN9X 17
 #define MIN_STACK_WINNT 2
 
 /*
@@ -6876,10 +6516,7 @@ myresetstkoflw(void)
     DWORD	nPageSize;
     DWORD	dummy;
 
-    /* This code will not work on win32s. */
     PlatformId();
-    if (g_PlatformId == VER_PLATFORM_WIN32s)
-	return 0;
 
     /* We need to know the system page size. */
     GetSystemInfo(&si);
@@ -6895,29 +6532,12 @@ myresetstkoflw(void)
 
     /* ...and the page thats min_stack_req pages away from stack base; this is
      * the lowest page we could use. */
-    pLowestPossiblePage = pStackBase + ((g_PlatformId == VER_PLATFORM_WIN32_NT)
-			     ? MIN_STACK_WINNT : MIN_STACK_WIN9X) * nPageSize;
-
-    /* On Win95, we want the next page down from the end of the stack. */
-    if (g_PlatformId == VER_PLATFORM_WIN32_WINDOWS)
+    pLowestPossiblePage = pStackBase + MIN_STACK_WINNT * nPageSize;
+
     {
-	/* Find the page that's only 1 page down from the page that the stack
-	 * ptr is in. */
-	pGuardPage = (BYTE*)((DWORD)nPageSize * (((DWORD)pStackPtr
-						    / (DWORD)nPageSize) - 1));
-	if (pGuardPage < pLowestPossiblePage)
-	    return 0;
-
-	/* Apply the noaccess attribute to the page -- there's no guard
-	 * attribute in win95-type OSes. */
-	if (!VirtualProtect(pGuardPage, nPageSize, PAGE_NOACCESS, &dummy))
-	    return 0;
-    }
-    else
-    {
-	/* On NT, however, we want the first committed page in the stack Start
-	 * at the stack base and move forward through memory until we find a
-	 * committed block. */
+	/* We want the first committed page in the stack Start at the stack
+	 * base and move forward through memory until we find a committed block.
+	 */
 	BYTE *pBlock = pStackBase;
 
 	for (;;)
--- a/src/os_win32.h
+++ b/src/os_win32.h
@@ -210,20 +210,15 @@ Trace(char *pszFormat, ...);
 # define vim_mkdir(x, y) mch_mkdir(x)
 #endif
 
-#ifndef PROTO
-
 /* Enable common dialogs input unicode from IME if possible. */
 #ifdef FEAT_MBYTE
-    /* The variables are defined in os_win32.c. */
-extern LRESULT (WINAPI *pDispatchMessage)(CONST MSG *);
-extern BOOL (WINAPI *pGetMessage)(LPMSG, HWND, UINT, UINT);
-extern BOOL (WINAPI *pIsDialogMessage)(HWND, LPMSG);
-extern BOOL (WINAPI *pPeekMessage)(LPMSG, HWND, UINT, UINT, UINT);
+# define pDispatchMessage DispatchMessageW
+# define pGetMessage GetMessageW
+# define pIsDialogMessage IsDialogMessageW
+# define pPeekMessage PeekMessageW
 #else
 # define pDispatchMessage DispatchMessage
 # define pGetMessage GetMessage
 # define pIsDialogMessage IsDialogMessage
 # define pPeekMessage PeekMessage
 #endif
-
-#endif /* PROTO */
--- a/src/proto/os_mswin.pro
+++ b/src/proto/os_mswin.pro
@@ -19,7 +19,6 @@ void display_errors(void);
 int mch_has_exp_wildcard(char_u *p);
 int mch_has_wildcard(char_u *p);
 int mch_chdir(char *path);
-int can_end_termcap_mode(int give_msg);
 int mch_screenmode(char_u *arg);
 int mch_icon_load(HANDLE *iconp);
 int mch_libcall(char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result);
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -3,7 +3,6 @@ HINSTANCE vimLoadLib(char *name);
 int dyn_libintl_init(void);
 void dyn_libintl_end(void);
 void PlatformId(void);
-int mch_windows95(void);
 void mch_setmouse(int on);
 void mch_update_cursor(void);
 int mch_char_avail(void);
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    29,
+/**/
     28,
 /**/
     27,
@@ -962,15 +964,10 @@ list_version(void)
     MSG(longVersion);
 #ifdef WIN3264
 # ifdef FEAT_GUI_W32
-#  if defined(_MSC_VER) && (_MSC_VER <= 1010)
-    /* Only MS VC 4.1 and earlier can do Win32s */
-    MSG_PUTS(_("\nMS-Windows 16/32-bit GUI version"));
+#  ifdef _WIN64
+    MSG_PUTS(_("\nMS-Windows 64-bit GUI version"));
 #  else
-#   ifdef _WIN64
-    MSG_PUTS(_("\nMS-Windows 64-bit GUI version"));
-#   else
     MSG_PUTS(_("\nMS-Windows 32-bit GUI version"));
-#   endif
 #  endif
 # ifdef FEAT_OLE
     MSG_PUTS(_(" with OLE support"));
@@ -1332,10 +1329,6 @@ intro_message(
     blanklines = (int)Rows - ((sizeof(lines) / sizeof(char *)) - 1);
     if (!p_cp)
 	blanklines += 4;  /* add 4 for not showing "Vi compatible" message */
-#if defined(WIN3264) && !defined(FEAT_GUI_W32)
-    if (mch_windows95())
-	blanklines -= 3;  /* subtract 3 for showing "Windows 95" message */
-#endif
 
 #ifdef FEAT_WINDOWS
     /* Don't overwrite a statusline.  Depends on 'cmdheight'. */
@@ -1384,17 +1377,6 @@ intro_message(
 		do_intro_line(row, (char_u *)_(p), i == 2, 0);
 	    ++row;
 	}
-#if defined(WIN3264) && !defined(FEAT_GUI_W32)
-	if (mch_windows95())
-	{
-	    do_intro_line(++row,
-		    (char_u *)_("WARNING: Windows 95/98/ME detected"),
-							FALSE, hl_attr(HLF_E));
-	    do_intro_line(++row,
-		(char_u *)_("type  :help windows95<Enter>  for info on this"),
-								    FALSE, 0);
-	}
-#endif
     }
 
     /* Make the wait-return message appear just below the text. */