diff src/os_win32.c @ 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 175b1116f96a
children c5c15c818bda
line wrap: on
line diff
--- 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 (;;)