changeset 16196:973070a30381 v8.1.1103

patch 8.1.1103: MS-Windows: old API calls are no longer needed commit https://github.com/vim/vim/commit/0eb035c974c47e65d32439b48e5a056b370ad429 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 2 22:15:55 2019 +0200 patch 8.1.1103: MS-Windows: old API calls are no longer needed Problem: MS-Windows: old API calls are no longer needed. Solution: Always use the wide functions. (Ken Takata, closes https://github.com/vim/vim/issues/4199)
author Bram Moolenaar <Bram@vim.org>
date Tue, 02 Apr 2019 22:30:04 +0200
parents 4d55a37f8b1b
children 9ceec0282d0b
files src/glbl_ime.cpp src/globals.h src/gui_w32.c src/misc1.c src/os_mswin.c src/os_win32.c src/version.c src/vim.h
diffstat 8 files changed, 788 insertions(+), 1632 deletions(-) [+]
line wrap: on
line diff
--- a/src/glbl_ime.cpp
+++ b/src/glbl_ime.cpp
@@ -133,14 +133,7 @@ global_ime_DefWindowProc(HWND hWnd, UINT
 
     if (pIApp == NULL || pIApp->OnDefWindowProc(hWnd, Msg,
 					    wParam, lParam, &lResult) != S_OK)
-    {
-#if defined(MSWIN)
-	if (wide_WindowProc)
-	    lResult = DefWindowProcW(hWnd, Msg, wParam, lParam);
-	else
-#endif
-	    lResult = DefWindowProc(hWnd, Msg, wParam, lParam);
-    }
+	lResult = DefWindowProcW(hWnd, Msg, wParam, lParam);
     return lResult;
 }
 
--- a/src/globals.h
+++ b/src/globals.h
@@ -822,10 +822,6 @@ EXTERN int	enc_latin9 INIT(= FALSE);	/* 
 #endif
 EXTERN int	has_mbyte INIT(= 0);		/* any multi-byte encoding */
 
-#if defined(MSWIN)
-EXTERN int	wide_WindowProc INIT(= FALSE);	/* use wide WindowProc() */
-#endif
-
 /*
  * To speed up BYTELEN() we fill a table with the byte lengths whenever
  * enc_utf8 or enc_dbcs changes.
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -313,12 +313,11 @@ static int		s_busy_processing = FALSE;
 static int		destroying = FALSE;	/* call DestroyWindow() ourselves */
 
 #ifdef MSWIN_FIND_REPLACE
-static UINT		s_findrep_msg = 0;	/* set in gui_w[16/32].c */
-static FINDREPLACE	s_findrep_struct;
-static FINDREPLACEW	s_findrep_struct_w;
+static UINT		s_findrep_msg = 0;	// set in gui_w[16/32].c
+static FINDREPLACEW	s_findrep_struct;
 static HWND		s_findrep_hwnd = NULL;
-static int		s_findrep_is_find;	/* TRUE for find dialog, FALSE
-						   for find/replace dialog */
+static int		s_findrep_is_find;	// TRUE for find dialog, FALSE
+						// for find/replace dialog
 #endif
 
 static HINSTANCE	s_hinst = NULL;
@@ -391,7 +390,7 @@ directx_binddc(void)
 }
 #endif
 
-/* use of WindowProc depends on wide_WindowProc */
+/* use of WindowProc depends on Global IME */
 #define MyWindowProc vim_WindowProc
 
 extern int current_font_height;	    /* this is in os_mswin.c */
@@ -1107,43 +1106,6 @@ gui_mswin_find_menu(
 
 #ifdef MSWIN_FIND_REPLACE
 /*
- * copy useful data from structure LPFINDREPLACE to structure LPFINDREPLACEW
- */
-    static void
-findrep_atow(LPFINDREPLACEW lpfrw, LPFINDREPLACE lpfr)
-{
-    WCHAR *wp;
-
-    lpfrw->hwndOwner = lpfr->hwndOwner;
-    lpfrw->Flags = lpfr->Flags;
-
-    wp = enc_to_utf16((char_u *)lpfr->lpstrFindWhat, NULL);
-    wcsncpy(lpfrw->lpstrFindWhat, wp, lpfrw->wFindWhatLen - 1);
-    vim_free(wp);
-
-    /* the field "lpstrReplaceWith" doesn't need to be copied */
-}
-
-/*
- * copy useful data from structure LPFINDREPLACEW to structure LPFINDREPLACE
- */
-    static void
-findrep_wtoa(LPFINDREPLACE lpfr, LPFINDREPLACEW lpfrw)
-{
-    char_u *p;
-
-    lpfr->Flags = lpfrw->Flags;
-
-    p = utf16_to_enc((short_u*)lpfrw->lpstrFindWhat, NULL);
-    vim_strncpy((char_u *)lpfr->lpstrFindWhat, p, lpfr->wFindWhatLen - 1);
-    vim_free(p);
-
-    p = utf16_to_enc((short_u*)lpfrw->lpstrReplaceWith, NULL);
-    vim_strncpy((char_u *)lpfr->lpstrReplaceWith, p, lpfr->wReplaceWithLen - 1);
-    vim_free(p);
-}
-
-/*
  * Handle a Find/Replace window message.
  */
     static void
@@ -1152,11 +1114,6 @@ findrep_wtoa(LPFINDREPLACE lpfr, LPFINDR
     int	    flags = 0;
     int	    down;
 
-    /* If the OS is Windows NT, and 'encoding' differs from active codepage:
-     * convert text from wide string. */
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	findrep_wtoa(&s_findrep_struct, &s_findrep_struct_w);
-
     if (s_findrep_struct.Flags & FR_DIALOGTERM)
 	/* Give main window the focus back. */
 	(void)SetFocus(s_hwnd);
@@ -1184,14 +1141,20 @@ findrep_wtoa(LPFINDREPLACE lpfr, LPFINDR
 
     if (flags != 0)
     {
+	char_u	*p, *q;
+
 	/* Call the generic GUI function to do the actual work. */
 	if (s_findrep_struct.Flags & FR_WHOLEWORD)
 	    flags |= FRD_WHOLE_WORD;
 	if (s_findrep_struct.Flags & FR_MATCHCASE)
 	    flags |= FRD_MATCH_CASE;
 	down = (s_findrep_struct.Flags & FR_DOWN) != 0;
-	gui_do_findrepl(flags, (char_u *)s_findrep_struct.lpstrFindWhat,
-			     (char_u *)s_findrep_struct.lpstrReplaceWith, down);
+	p = utf16_to_enc(s_findrep_struct.lpstrFindWhat, NULL);
+	q = utf16_to_enc(s_findrep_struct.lpstrReplaceWith, NULL);
+	if (p != NULL && q != NULL)
+	    gui_do_findrepl(flags, p, q, down);
+	vim_free(p);
+	vim_free(q);
     }
 }
 #endif
@@ -1310,9 +1273,7 @@ vim_WindowProc(HWND hwnd, UINT message, 
 #ifdef GLOBAL_IME
     return global_ime_DefWindowProc(hwnd, message, wParam, lParam);
 #else
-    if (wide_WindowProc)
-	return DefWindowProcW(hwnd, message, wParam, lParam);
-    return DefWindowProc(hwnd, message, wParam, lParam);
+    return DefWindowProcW(hwnd, message, wParam, lParam);
 #endif
 }
 
@@ -2332,21 +2293,15 @@ GetTextWidthEnc(HDC hdc, char_u *str, in
     int		n;
     int		wlen = len;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	/* 'encoding' differs from active codepage: convert text and use wide
-	 * function */
-	wstr = enc_to_utf16(str, &wlen);
-	if (wstr != NULL)
-	{
-	    n = GetTextExtentPointW(hdc, wstr, wlen, &size);
-	    vim_free(wstr);
-	    if (n)
-		return size.cx;
-	}
-    }
-
-    return GetTextWidth(hdc, str, len);
+    wstr = enc_to_utf16(str, &wlen);
+    if (wstr == NULL)
+	return 0;
+
+    n = GetTextExtentPointW(hdc, wstr, wlen, &size);
+    vim_free(wstr);
+    if (n)
+	return size.cx;
+    return 0;
 }
 
 static void get_work_area(RECT *spi_rect);
@@ -2423,19 +2378,19 @@ gui_mch_show_toolbar(int showit)
     if (showit)
     {
 # ifndef TB_SETUNICODEFORMAT
-    /* For older compilers.  We assume this never changes. */
+    // For older compilers.  We assume this never changes.
 #  define TB_SETUNICODEFORMAT 0x2005
 # endif
-	/* Enable/disable unicode support */
-	int uu = (enc_codepage >= 0 && (int)GetACP() != enc_codepage);
-	SendMessage(s_toolbarhwnd, TB_SETUNICODEFORMAT, (WPARAM)uu, (LPARAM)0);
+	// Enable unicode support
+	SendMessage(s_toolbarhwnd, TB_SETUNICODEFORMAT, (WPARAM)TRUE,
+								(LPARAM)0);
 	ShowWindow(s_toolbarhwnd, SW_SHOW);
     }
     else
 	ShowWindow(s_toolbarhwnd, SW_HIDE);
 }
 
-/* Then number of bitmaps is fixed.  Exit is missing! */
+/* The number of bitmaps is fixed.  Exit is missing! */
 #define TOOLBAR_BITMAP_COUNT 31
 
 #endif
@@ -2444,40 +2399,21 @@ gui_mch_show_toolbar(int showit)
     static void
 add_tabline_popup_menu_entry(HMENU pmenu, UINT item_id, char_u *item_text)
 {
-    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(item_text, NULL);
-	if (wn != NULL)
-	{
-	    MENUITEMINFOW	infow;
-
-	    infow.cbSize = sizeof(infow);
-	    infow.fMask = MIIM_TYPE | MIIM_ID;
-	    infow.wID = item_id;
-	    infow.fType = MFT_STRING;
-	    infow.dwTypeData = wn;
-	    infow.cch = (UINT)wcslen(wn);
-	    InsertMenuItemW(pmenu, item_id, FALSE, &infow);
-	    vim_free(wn);
-	}
-    }
-
+    WCHAR	    *wn;
+    MENUITEMINFOW   infow;
+
+    wn = enc_to_utf16(item_text, NULL);
     if (wn == NULL)
-    {
-	MENUITEMINFO	info;
-
-	info.cbSize = sizeof(info);
-	info.fMask = MIIM_TYPE | MIIM_ID;
-	info.wID = item_id;
-	info.fType = MFT_STRING;
-	info.dwTypeData = (LPTSTR)item_text;
-	info.cch = (UINT)STRLEN(item_text);
-	InsertMenuItem(pmenu, item_id, FALSE, &info);
-    }
+	return;
+
+    infow.cbSize = sizeof(infow);
+    infow.fMask = MIIM_TYPE | MIIM_ID;
+    infow.wID = item_id;
+    infow.fType = MFT_STRING;
+    infow.dwTypeData = wn;
+    infow.cch = (UINT)wcslen(wn);
+    InsertMenuItemW(pmenu, item_id, FALSE, &infow);
+    vim_free(wn);
 }
 
     static void
@@ -2573,8 +2509,6 @@ gui_mch_update_tabline(void)
     int		nr = 0;
     int		curtabidx = 0;
     int		tabadded = 0;
-    static int	use_unicode = FALSE;
-    int		uu;
     WCHAR	*wstr = NULL;
 
     if (s_tabhwnd == NULL)
@@ -2584,13 +2518,8 @@ gui_mch_update_tabline(void)
     /* For older compilers.  We assume this never changes. */
 # define CCM_SETUNICODEFORMAT 0x2005
 #endif
-    uu = (enc_codepage >= 0 && (int)GetACP() != enc_codepage);
-    if (uu != use_unicode)
-    {
-	/* Enable/disable unicode support */
-	SendMessage(s_tabhwnd, CCM_SETUNICODEFORMAT, (WPARAM)uu, (LPARAM)0);
-	use_unicode = uu;
-    }
+    // Enable unicode support
+    SendMessage(s_tabhwnd, CCM_SETUNICODEFORMAT, (WPARAM)TRUE, (LPARAM)0);
 
     tie.mask = TCIF_TEXT;
     tie.iImage = -1;
@@ -2614,24 +2543,18 @@ gui_mch_update_tabline(void)
 
 	get_tabline_label(tp, FALSE);
 	tie.pszText = (LPSTR)NameBuff;
-	wstr = NULL;
-	if (use_unicode)
+
+	wstr = enc_to_utf16(NameBuff, NULL);
+	if (wstr != NULL)
 	{
-	    /* Need to go through Unicode. */
-	    wstr = enc_to_utf16(NameBuff, NULL);
-	    if (wstr != NULL)
-	    {
-		TCITEMW		tiw;
-
-		tiw.mask = TCIF_TEXT;
-		tiw.iImage = -1;
-		tiw.pszText = wstr;
-		SendMessage(s_tabhwnd, TCM_SETITEMW, (WPARAM)nr, (LPARAM)&tiw);
-		vim_free(wstr);
-	    }
+	    TCITEMW		tiw;
+
+	    tiw.mask = TCIF_TEXT;
+	    tiw.iImage = -1;
+	    tiw.pszText = wstr;
+	    SendMessage(s_tabhwnd, TCM_SETITEMW, (WPARAM)nr, (LPARAM)&tiw);
+	    vim_free(wstr);
 	}
-	if (wstr == NULL)
-	    TabCtrl_SetItem(s_tabhwnd, nr, &tie);
     }
 
     /* Remove any old labels. */
@@ -2720,8 +2643,17 @@ initialise_findrep(char_u *initial_strin
     if (wword)
 	s_findrep_struct.Flags |= FR_WHOLEWORD;
     if (entry_text != NULL && *entry_text != NUL)
-	vim_strncpy((char_u *)s_findrep_struct.lpstrFindWhat, entry_text,
-					   s_findrep_struct.wFindWhatLen - 1);
+    {
+	WCHAR *p = enc_to_utf16(entry_text, NULL);
+	if (p != NULL)
+	{
+	    int len = s_findrep_struct.wFindWhatLen - 1;
+
+	    wcsncpy(s_findrep_struct.lpstrFindWhat, p, len);
+	    s_findrep_struct.lpstrFindWhat[len] = NUL;
+	    vim_free(p);
+	}
+    }
     vim_free(entry_text);
 }
 #endif
@@ -2729,7 +2661,7 @@ initialise_findrep(char_u *initial_strin
     static void
 set_window_title(HWND hwnd, char *title)
 {
-    if (title != NULL && enc_codepage >= 0 && enc_codepage != (int)GetACP())
+    if (title != NULL)
     {
 	WCHAR	*wbuf;
 
@@ -2740,9 +2672,9 @@ set_window_title(HWND hwnd, char *title)
 	    SetWindowTextW(hwnd, wbuf);
 	    vim_free(wbuf);
 	}
-	return;
-    }
-    (void)SetWindowText(hwnd, (LPCSTR)title);
+    }
+    else
+	(void)SetWindowTextW(hwnd, NULL);
 }
 
     void
@@ -2757,16 +2689,7 @@ gui_mch_find_dialog(exarg_T *eap)
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-	    /* If the OS is Windows NT, and 'encoding' differs from active
-	     * codepage: convert text and use wide function. */
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	    {
-		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
-		s_findrep_hwnd = FindTextW(
-					(LPFINDREPLACEW) &s_findrep_struct_w);
-	    }
-	    else
-		s_findrep_hwnd = FindText((LPFINDREPLACE) &s_findrep_struct);
+	    s_findrep_hwnd = FindTextW((LPFINDREPLACEW) &s_findrep_struct);
 	}
 
 	set_window_title(s_findrep_hwnd, _("Find string"));
@@ -2790,15 +2713,7 @@ gui_mch_replace_dialog(exarg_T *eap)
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	    {
-		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
-		s_findrep_hwnd = ReplaceTextW(
-					(LPFINDREPLACEW) &s_findrep_struct_w);
-	    }
-	    else
-		s_findrep_hwnd = ReplaceText(
-					   (LPFINDREPLACE) &s_findrep_struct);
+	    s_findrep_hwnd = ReplaceTextW((LPFINDREPLACEW) &s_findrep_struct);
 	}
 
 	set_window_title(s_findrep_hwnd, _("Find & Replace"));
@@ -4147,7 +4062,6 @@ static UINT	s_menu_id = 100;
 #define USE_SYSMENU_FONT
 
 #define VIM_NAME	"vim"
-#define VIM_CLASS	"Vim"
 #define VIM_CLASSW	L"Vim"
 
 /* Initial size for the dialog template.  For gui_mch_dialog() it's fixed,
@@ -5021,9 +4935,6 @@ gui_mch_prepare(int *argc, char **argv)
     int
 gui_mch_init(void)
 {
-    const char szVimWndClass[] = VIM_CLASS;
-    const char szTextAreaClass[] = "VimTextArea";
-    WNDCLASS wndclass;
     const WCHAR szVimWndClassW[] = VIM_CLASSW;
     const WCHAR szTextAreaClassW[] = L"VimTextArea";
     WNDCLASSW wndclassw;
@@ -5073,31 +4984,7 @@ gui_mch_init(void)
 #endif
 		    RegisterClassW(&wndclassw)) == 0)
 	    return FAIL;
-	else
-	    wide_WindowProc = TRUE;
-    }
-
-    if (!wide_WindowProc)
-	if (GetClassInfo(s_hinst, szVimWndClass, &wndclass) == 0)
-	{
-	    wndclass.style = CS_DBLCLKS;
-	    wndclass.lpfnWndProc = _WndProc;
-	    wndclass.cbClsExtra = 0;
-	    wndclass.cbWndExtra = 0;
-	    wndclass.hInstance = s_hinst;
-	    wndclass.hIcon = LoadIcon(wndclass.hInstance, "IDR_VIM");
-	    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
-	    wndclass.hbrBackground = s_brush;
-	    wndclass.lpszMenuName = NULL;
-	    wndclass.lpszClassName = szVimWndClass;
-
-	    if ((
-#ifdef GLOBAL_IME
-			atom =
-#endif
-			RegisterClass(&wndclass)) == 0)
-		return FAIL;
-	}
+    }
 
     if (vim_parent_hwnd != NULL)
     {
@@ -5105,18 +4992,18 @@ gui_mch_init(void)
 	__try
 	{
 #endif
-	    /* Open inside the specified parent window.
-	     * TODO: last argument should point to a CLIENTCREATESTRUCT
-	     * structure. */
-	    s_hwnd = CreateWindowEx(
+	    // Open inside the specified parent window.
+	    // TODO: last argument should point to a CLIENTCREATESTRUCT
+	    // structure.
+	    s_hwnd = CreateWindowExW(
 		WS_EX_MDICHILD,
-		szVimWndClass, "Vim MSWindows GUI",
+		szVimWndClassW, L"Vim MSWindows GUI",
 		WS_OVERLAPPEDWINDOW | WS_CHILD
 				 | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | 0xC000,
 		gui_win_x == -1 ? CW_USEDEFAULT : gui_win_x,
 		gui_win_y == -1 ? CW_USEDEFAULT : gui_win_y,
-		100,				/* Any value will do */
-		100,				/* Any value will do */
+		100,				// Any value will do
+		100,				// Any value will do
 		vim_parent_hwnd, NULL,
 		s_hinst, NULL);
 #ifdef HAVE_TRY_EXCEPT
@@ -5141,8 +5028,8 @@ gui_mch_init(void)
 
 	/* Create a window.  If win_socket_id is not zero without border and
 	 * titlebar, it will be reparented below. */
-	s_hwnd = CreateWindow(
-		szVimWndClass, "Vim MSWindows GUI",
+	s_hwnd = CreateWindowW(
+		szVimWndClassW, L"Vim MSWindows GUI",
 		(win_socket_id == 0 ? WS_OVERLAPPEDWINDOW : WS_POPUP)
 					  | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
 		gui_win_x == -1 ? CW_USEDEFAULT : gui_win_x,
@@ -5169,59 +5056,31 @@ gui_mch_init(void)
 #endif
 
     /* Create the text area window */
-    if (wide_WindowProc)
-    {
-	if (GetClassInfoW(s_hinst, szTextAreaClassW, &wndclassw) == 0)
-	{
-	    wndclassw.style = CS_OWNDC;
-	    wndclassw.lpfnWndProc = _TextAreaWndProc;
-	    wndclassw.cbClsExtra = 0;
-	    wndclassw.cbWndExtra = 0;
-	    wndclassw.hInstance = s_hinst;
-	    wndclassw.hIcon = NULL;
-	    wndclassw.hCursor = LoadCursor(NULL, IDC_ARROW);
-	    wndclassw.hbrBackground = NULL;
-	    wndclassw.lpszMenuName = NULL;
-	    wndclassw.lpszClassName = szTextAreaClassW;
-
-	    if (RegisterClassW(&wndclassw) == 0)
-		return FAIL;
-	}
-
-	s_textArea = CreateWindowExW(
-	    0,
-	    szTextAreaClassW, L"Vim text area",
-	    WS_CHILD | WS_VISIBLE, 0, 0,
-	    100,				// Any value will do for now
-	    100,				// Any value will do for now
-	    s_hwnd, NULL,
-	    s_hinst, NULL);
-    }
-    else if (GetClassInfo(s_hinst, szTextAreaClass, &wndclass) == 0)
-    {
-	wndclass.style = CS_OWNDC;
-	wndclass.lpfnWndProc = _TextAreaWndProc;
-	wndclass.cbClsExtra = 0;
-	wndclass.cbWndExtra = 0;
-	wndclass.hInstance = s_hinst;
-	wndclass.hIcon = NULL;
-	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
-	wndclass.hbrBackground = NULL;
-	wndclass.lpszMenuName = NULL;
-	wndclass.lpszClassName = szTextAreaClass;
-
-	if (RegisterClass(&wndclass) == 0)
+    if (GetClassInfoW(s_hinst, szTextAreaClassW, &wndclassw) == 0)
+    {
+	wndclassw.style = CS_OWNDC;
+	wndclassw.lpfnWndProc = _TextAreaWndProc;
+	wndclassw.cbClsExtra = 0;
+	wndclassw.cbWndExtra = 0;
+	wndclassw.hInstance = s_hinst;
+	wndclassw.hIcon = NULL;
+	wndclassw.hCursor = LoadCursor(NULL, IDC_ARROW);
+	wndclassw.hbrBackground = NULL;
+	wndclassw.lpszMenuName = NULL;
+	wndclassw.lpszClassName = szTextAreaClassW;
+
+	if (RegisterClassW(&wndclassw) == 0)
 	    return FAIL;
-
-	s_textArea = CreateWindowEx(
-	    0,
-	    szTextAreaClass, "Vim text area",
-	    WS_CHILD | WS_VISIBLE, 0, 0,
-	    100,				// Any value will do for now
-	    100,				// Any value will do for now
-	    s_hwnd, NULL,
-	    s_hinst, NULL);
-    }
+    }
+
+    s_textArea = CreateWindowExW(
+	0,
+	szTextAreaClassW, L"Vim text area",
+	WS_CHILD | WS_VISIBLE, 0, 0,
+	100,				// Any value will do for now
+	100,				// Any value will do for now
+	s_hwnd, NULL,
+	s_hinst, NULL);
 
     if (s_textArea == NULL)
 	return FAIL;
@@ -5299,21 +5158,14 @@ gui_mch_init(void)
 
     /* Initialise the struct */
     s_findrep_struct.lStructSize = sizeof(s_findrep_struct);
-    s_findrep_struct.lpstrFindWhat = (LPSTR)alloc(MSWIN_FR_BUFSIZE);
+    s_findrep_struct.lpstrFindWhat =
+			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
     s_findrep_struct.lpstrFindWhat[0] = NUL;
-    s_findrep_struct.lpstrReplaceWith = (LPSTR)alloc(MSWIN_FR_BUFSIZE);
+    s_findrep_struct.lpstrReplaceWith =
+			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
     s_findrep_struct.lpstrReplaceWith[0] = NUL;
     s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE;
     s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE;
-    s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w);
-    s_findrep_struct_w.lpstrFindWhat =
-			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
-    s_findrep_struct_w.lpstrFindWhat[0] = NUL;
-    s_findrep_struct_w.lpstrReplaceWith =
-			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
-    s_findrep_struct_w.lpstrReplaceWith[0] = NUL;
-    s_findrep_struct_w.wFindWhatLen = MSWIN_FR_BUFSIZE;
-    s_findrep_struct_w.wReplaceWithLen = MSWIN_FR_BUFSIZE;
 #endif
 
 #ifdef FEAT_EVAL
@@ -6344,49 +6196,26 @@ gui_mch_add_menu(
 
     if (menu_is_menubar(menu->name))
     {
-	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)
-	    {
-		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);
-	    }
-	}
-
+	WCHAR	*wn;
+	MENUITEMINFOW	infow;
+
+	wn = enc_to_utf16(menu->name, NULL);
 	if (wn == NULL)
-	{
-	    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);
-	}
+	    return;
+
+	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);
     }
 
     /* Fix window size if menu may have wrapped */
@@ -6499,27 +6328,17 @@ gui_mch_add_menu_item(
     else
 #endif
     {
-	WCHAR	*wn = NULL;
-
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	WCHAR	*wn;
+
+	wn = enc_to_utf16(menu->name, NULL);
+	if (wn != NULL)
 	{
-	    /* 'encoding' differs from active codepage: convert menu item name
-	     * and use wide function */
-	    wn = enc_to_utf16(menu->name, NULL);
-	    if (wn != NULL)
-	    {
-		InsertMenuW(parent->submenu_id, (UINT)idx,
-			(menu_is_separator(menu->name)
-				 ? MF_SEPARATOR : MF_STRING) | MF_BYPOSITION,
-			(UINT)menu->id, wn);
-		vim_free(wn);
-	    }
+	    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 (wn == NULL)
-	    InsertMenu(parent->submenu_id, (UINT)idx,
-		(menu_is_separator(menu->name) ? MF_SEPARATOR : MF_STRING)
-							      | MF_BYPOSITION,
-		(UINT)menu->id, (LPCTSTR)menu->name);
 #ifdef FEAT_TEAROFF
 	if (IsWindow(parent->tearoff_handle))
 	    rebuild_tearoff(parent);
@@ -6709,22 +6528,14 @@ dialog_callback(
 	/* If the edit box exists, copy the string. */
 	if (s_textfield != NULL)
 	{
-	    /* If the OS is Windows NT, and 'encoding' differs from active
-	     * codepage: use wide function and convert text. */
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	    {
-	       WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
-	       char_u *p;
-
-	       GetDlgItemTextW(hwnd, DLG_NONBUTTON_CONTROL + 2, wp, IOSIZE);
-	       p = utf16_to_enc(wp, NULL);
-	       vim_strncpy(s_textfield, p, IOSIZE);
-	       vim_free(p);
-	       vim_free(wp);
-	    }
-	    else
-		GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2,
-						(LPSTR)s_textfield, IOSIZE);
+	    WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
+	    char_u *p;
+
+	    GetDlgItemTextW(hwnd, DLG_NONBUTTON_CONTROL + 2, wp, IOSIZE);
+	    p = utf16_to_enc(wp, NULL);
+	    vim_strncpy(s_textfield, p, IOSIZE);
+	    vim_free(p);
+	    vim_free(wp);
 	}
 
 	/*
@@ -8411,7 +8222,7 @@ multiline_balloon_available(void)
 }
 
     static void
-make_tooltipw(BalloonEval *beval, char *text, POINT pt)
+make_tooltip(BalloonEval *beval, char *text, POINT pt)
 {
     TOOLINFOW	*pti;
     int		ToolInfoSize;
@@ -8481,77 +8292,6 @@ make_tooltipw(BalloonEval *beval, char *
 }
 
     static void
-make_tooltip(BalloonEval *beval, char *text, POINT pt)
-{
-    TOOLINFO	*pti;
-    int		ToolInfoSize;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	make_tooltipw(beval, text, pt);
-	return;
-    }
-
-    if (multiline_balloon_available() == TRUE)
-	ToolInfoSize = sizeof(TOOLINFO_NEW);
-    else
-	ToolInfoSize = sizeof(TOOLINFO);
-
-    pti = (TOOLINFO *)alloc(ToolInfoSize);
-    if (pti == NULL)
-	return;
-
-    beval->balloon = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS,
-	    NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
-	    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
-	    beval->target, NULL, s_hinst, NULL);
-
-    SetWindowPos(beval->balloon, HWND_TOPMOST, 0, 0, 0, 0,
-	    SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
-
-    pti->cbSize = ToolInfoSize;
-    pti->uFlags = TTF_SUBCLASS;
-    pti->hwnd = beval->target;
-    pti->hinst = 0; /* Don't use string resources */
-    pti->uId = ID_BEVAL_TOOLTIP;
-
-    if (multiline_balloon_available() == TRUE)
-    {
-	RECT rect;
-	TOOLINFO_NEW *ptin = (TOOLINFO_NEW *)pti;
-	pti->lpszText = LPSTR_TEXTCALLBACK;
-	beval->tofree = vim_strsave((char_u*)text);
-	ptin->lParam = (LPARAM)beval->tofree;
-	if (GetClientRect(s_textArea, &rect)) /* switch multiline tooltips on */
-	    SendMessage(beval->balloon, TTM_SETMAXTIPWIDTH, 0,
-		    (LPARAM)rect.right);
-    }
-    else
-	pti->lpszText = text; /* do this old way */
-
-    /* Limit ballooneval bounding rect to CursorPos neighbourhood */
-    pti->rect.left = pt.x - 3;
-    pti->rect.top = pt.y - 3;
-    pti->rect.right = pt.x + 3;
-    pti->rect.bottom = pt.y + 3;
-
-    SendMessage(beval->balloon, TTM_ADDTOOL, 0, (LPARAM)pti);
-    /* Make tooltip appear sooner */
-    SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_INITIAL, 10);
-    /* I've performed some tests and it seems the longest possible life time
-     * of tooltip is 30 seconds */
-    SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_AUTOPOP, 30000);
-    /*
-     * HACK: force tooltip to appear, because it'll not appear until
-     * first mouse move. D*mn M$
-     * Amazingly moving (2, 2) and then (-1, -1) the mouse doesn't move.
-     */
-    mouse_event(MOUSEEVENTF_MOVE, 2, 2, 0, 0);
-    mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0);
-    vim_free(pti);
-}
-
-    static void
 delete_tooltip(BalloonEval *beval)
 {
     PostMessage(beval->balloon, WM_CLOSE, 0, 0);
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -5670,11 +5670,10 @@ dos_expandpath(
     int		matches;
     int		len;
     int		starstar = FALSE;
-    static int	stardepth = 0;	    /* depth for "**" expansion */
-    WIN32_FIND_DATA	fb;
-    HANDLE		hFind = (HANDLE)0;
+    static int	stardepth = 0;	    // depth for "**" expansion
+    HANDLE		hFind = INVALID_HANDLE_VALUE;
     WIN32_FIND_DATAW    wfb;
-    WCHAR		*wn = NULL;	/* UCS-2 name, NULL when not used. */
+    WCHAR		*wn = NULL;	// UCS-2 name, NULL when not used.
     char_u		*matchname;
     int			ok;
 
@@ -5783,33 +5782,16 @@ dos_expandpath(
 
     /* Scan all files in the directory with "dir/ *.*" */
     STRCPY(s, "*.*");
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	/* The active codepage differs from 'encoding'.  Attempt using the
-	 * wide function.  If it fails because it is not implemented fall back
-	 * to the non-wide version (for Windows 98) */
-	wn = enc_to_utf16(buf, NULL);
-	if (wn != NULL)
-	{
-	    hFind = FindFirstFileW(wn, &wfb);
-	    if (hFind == INVALID_HANDLE_VALUE
-			      && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-		VIM_CLEAR(wn);
-	}
-    }
-
-    if (wn == NULL)
-	hFind = FindFirstFile((LPCSTR)buf, &fb);
+    wn = enc_to_utf16(buf, NULL);
+    if (wn != NULL)
+	hFind = FindFirstFileW(wn, &wfb);
     ok = (hFind != INVALID_HANDLE_VALUE);
 
     while (ok)
     {
-	if (wn != NULL)
-	    p = utf16_to_enc(wfb.cFileName, NULL);   /* p is allocated here */
-	else
-	    p = (char_u *)fb.cFileName;
-	/* Ignore entries starting with a dot, unless when asked for.  Accept
-	 * all entries found with "matchname". */
+	p = utf16_to_enc(wfb.cFileName, NULL);   // p is allocated here
+	// Ignore entries starting with a dot, unless when asked for.  Accept
+	// all entries found with "matchname".
 	if ((p[0] != '.' || starts_with_dot
 			 || ((flags & EW_DODOT)
 			     && p[1] != NUL && (p[1] != '.' || p[2] != NUL)))
@@ -5851,13 +5833,8 @@ dos_expandpath(
 	    }
 	}
 
-	if (wn != NULL)
-	{
-	    vim_free(p);
-	    ok = FindNextFileW(hFind, &wfb);
-	}
-	else
-	    ok = FindNextFile(hFind, &fb);
+	vim_free(p);
+	ok = FindNextFileW(hFind, &wfb);
 
 	/* If no more matches and no match was used, try expanding the name
 	 * itself.  Finds the long name of a short filename. */
@@ -5865,15 +5842,12 @@ dos_expandpath(
 	{
 	    STRCPY(s, matchname);
 	    FindClose(hFind);
+	    vim_free(wn);
+	    wn = enc_to_utf16(buf, NULL);
 	    if (wn != NULL)
-	    {
-		vim_free(wn);
-		wn = enc_to_utf16(buf, NULL);
-		if (wn != NULL)
-		    hFind = FindFirstFileW(wn, &wfb);
-	    }
-	    if (wn == NULL)
-		hFind = FindFirstFile((LPCSTR)buf, &fb);
+		hFind = FindFirstFileW(wn, &wfb);
+	    else
+		hFind =	INVALID_HANDLE_VALUE;
 	    ok = (hFind != INVALID_HANDLE_VALUE);
 	    VIM_CLEAR(matchname);
 	}
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -105,7 +105,7 @@ typedef int LRESULT;
 typedef int MOUSE_EVENT_RECORD;
 typedef int NEWTEXTMETRICW;
 typedef int PACL;
-typedef int PRINTDLG;
+typedef int PRINTDLGW;
 typedef int PSECURITY_DESCRIPTOR;
 typedef int PSID;
 typedef int SECURITY_INFORMATION;
@@ -282,19 +282,14 @@ mch_settitle(
 # else
     if (title != NULL)
     {
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	{
-	    /* Convert the title from 'encoding' to the active codepage. */
-	    WCHAR	*wp = enc_to_utf16(title, NULL);
-
-	    if (wp != NULL)
-	    {
-		SetConsoleTitleW(wp);
-		vim_free(wp);
-		return;
-	    }
-	}
-	SetConsoleTitle((LPCSTR)title);
+	WCHAR	*wp = enc_to_utf16(title, NULL);
+
+	if (wp == NULL)
+	    return;
+
+	SetConsoleTitleW(wp);
+	vim_free(wp);
+	return;
     }
 # endif
 }
@@ -359,40 +354,22 @@ mch_FullName(
     else
 #endif
     {
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	WCHAR	*wname;
+	WCHAR	wbuf[MAX_PATH];
+	char_u	*cname = NULL;
+
+	wname = enc_to_utf16(fname, NULL);
+	if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH) != NULL)
 	{
-	    WCHAR	*wname;
-	    WCHAR	wbuf[MAX_PATH];
-	    char_u	*cname = NULL;
-
-	    /* Use the wide function:
-	     * - convert the fname from 'encoding' to UCS2.
-	     * - invoke _wfullpath()
-	     * - convert the result from UCS2 to 'encoding'.
-	     */
-	    wname = enc_to_utf16(fname, NULL);
-	    if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH) != NULL)
+	    cname = utf16_to_enc((short_u *)wbuf, NULL);
+	    if (cname != NULL)
 	    {
-		cname = utf16_to_enc((short_u *)wbuf, NULL);
-		if (cname != NULL)
-		{
-		    vim_strncpy(buf, cname, len - 1);
-		    nResult = OK;
-		}
+		vim_strncpy(buf, cname, len - 1);
+		nResult = OK;
 	    }
-	    vim_free(wname);
-	    vim_free(cname);
 	}
-	if (nResult == FAIL)	    /* fall back to non-wide function */
-	{
-	    if (_fullpath((char *)buf, (const char *)fname, len - 1) == NULL)
-	    {
-		/* failed, use relative path name */
-		vim_strncpy(buf, fname, len - 1);
-	    }
-	    else
-		nResult = OK;
-	}
+	vim_free(wname);
+	vim_free(cname);
     }
 
 #ifdef USE_FNAME_CASE
@@ -480,57 +457,6 @@ slash_adjust(char_u *p)
 #endif
 
     static int
-stat_symlink_aware(const char *name, stat_T *stp)
-{
-#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__)
-    /* Work around for VC12 or earlier (and MinGW). stat() can't handle
-     * symlinks properly.
-     * VC9 or earlier: stat() doesn't support a symlink at all. It retrieves
-     * status of a symlink itself.
-     * VC10: stat() supports a symlink to a normal file, but it doesn't support
-     * a symlink to a directory (always returns an error).
-     * VC11 and VC12: stat() doesn't return an error for a symlink to a
-     * directory, but it doesn't set S_IFDIR flag.
-     * MinGW: Same as VC9. */
-    WIN32_FIND_DATA	findData;
-    HANDLE		hFind, h;
-    DWORD		attr = 0;
-    BOOL		is_symlink = FALSE;
-
-    hFind = FindFirstFile(name, &findData);
-    if (hFind != INVALID_HANDLE_VALUE)
-    {
-	attr = findData.dwFileAttributes;
-	if ((attr & FILE_ATTRIBUTE_REPARSE_POINT)
-		&& (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK))
-	    is_symlink = TRUE;
-	FindClose(hFind);
-    }
-    if (is_symlink)
-    {
-	h = CreateFile(name, FILE_READ_ATTRIBUTES,
-		FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
-		OPEN_EXISTING,
-		(attr & FILE_ATTRIBUTE_DIRECTORY)
-					    ? FILE_FLAG_BACKUP_SEMANTICS : 0,
-		NULL);
-	if (h != INVALID_HANDLE_VALUE)
-	{
-	    int	    fd, n;
-
-	    fd = _open_osfhandle((OPEN_OH_ARGTYPE)h, _O_RDONLY);
-	    n = _fstat(fd, (struct _stat *)stp);
-	    if ((n == 0) && (attr & FILE_ATTRIBUTE_DIRECTORY))
-		stp->st_mode = (stp->st_mode & ~S_IFREG) | S_IFDIR;
-	    _close(fd);
-	    return n;
-	}
-    }
-#endif
-    return stat(name, stp);
-}
-
-    static int
 wstat_symlink_aware(const WCHAR *name, stat_T *stp)
 {
 #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__)
@@ -593,6 +519,8 @@ vim_stat(const char *name, stat_T *stp)
      * UTF-8. */
     char_u	buf[_MAX_PATH * 3 + 1];
     char_u	*p;
+    WCHAR	*wp;
+    int		n;
 
     vim_strncpy((char_u *)buf, (char_u *)name, sizeof(buf) - 1);
     p = buf + STRLEN(buf);
@@ -614,19 +542,14 @@ vim_stat(const char *name, stat_T *stp)
 		STRCAT(buf, "\\");
 	}
     }
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	*wp = enc_to_utf16(buf, NULL);
-	int	n;
-
-	if (wp != NULL)
-	{
-	    n = wstat_symlink_aware(wp, stp);
-	    vim_free(wp);
-	    return n;
-	}
-    }
-    return stat_symlink_aware((char *)buf, stp);
+
+    wp = enc_to_utf16(buf, NULL);
+    if (wp == NULL)
+	return -1;
+
+    n = wstat_symlink_aware(wp, stp);
+    vim_free(wp);
+    return n;
 }
 
 #if defined(FEAT_GUI_MSWIN) || defined(PROTO)
@@ -758,6 +681,9 @@ mch_has_wildcard(char_u *p)
     int
 mch_chdir(char *path)
 {
+    WCHAR   *p;
+    int	    n;
+
     if (path[0] == NUL)		/* just checking... */
 	return -1;
 
@@ -779,20 +705,13 @@ mch_chdir(char *path)
     if (*path == NUL)		/* drive name only */
 	return 0;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	*p = enc_to_utf16((char_u *)path, NULL);
-	int	n;
-
-	if (p != NULL)
-	{
-	    n = _wchdir(p);
-	    vim_free(p);
-	    return n;
-	}
-    }
-
-    return chdir(path);	       /* let the normal chdir() do the rest */
+    p = enc_to_utf16((char_u *)path, NULL);
+    if (p == NULL)
+	return -1;
+
+    n = _wchdir(p);
+    vim_free(p);
+    return n;
 }
 
 
@@ -1097,7 +1016,7 @@ mch_set_winpos(int x, int y)
  */
 
 static HFONT		prt_font_handles[2][2][2];
-static PRINTDLG		prt_dlg;
+static PRINTDLGW	prt_dlg;
 static const int	boldface[2] = {FW_REGULAR, FW_BOLD};
 static TEXTMETRIC	prt_tm;
 static int		prt_line_height;
@@ -1119,18 +1038,16 @@ static char_u		*prt_name = NULL;
     static BOOL
 vimSetDlgItemText(HWND hDlg, int nIDDlgItem, char_u *s)
 {
-    WCHAR   *wp = NULL;
+    WCHAR   *wp;
     BOOL    ret;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	wp = enc_to_utf16(s, NULL);
-    if (wp != NULL)
-    {
-	ret = SetDlgItemTextW(hDlg, nIDDlgItem, wp);
-	vim_free(wp);
-	return ret;
-    }
-    return SetDlgItemText(hDlg, nIDDlgItem, (LPCSTR)s);
+    wp = enc_to_utf16(s, NULL);
+    if (wp == NULL)
+	return FALSE;
+
+    ret = SetDlgItemTextW(hDlg, nIDDlgItem, wp);
+    vim_free(wp);
+    return ret;
 }
 
 /*
@@ -1248,7 +1165,7 @@ PrintHookProc(
 {
     HWND	hwndOwner;
     RECT	rc, rcDlg, rcOwner;
-    PRINTDLG	*pPD;
+    PRINTDLGW	*pPD;
 
     if (uiMsg == WM_INITDIALOG)
     {
@@ -1280,7 +1197,7 @@ PrintHookProc(
 		SWP_NOSIZE);
 
 	/*  tackle the printdlg copiesctrl problem */
-	pPD = (PRINTDLG *)lParam;
+	pPD = (PRINTDLGW *)lParam;
 	pPD->nCopies = (WORD)pPD->lCustData;
 	SetDlgItemInt( hDlg, edt3, pPD->nCopies, FALSE );
 	/*  Bring the window to top */
@@ -1423,13 +1340,13 @@ mch_print_init(prt_settings_T *psettings
     int			pifBold;
     int			pifUnderline;
 
-    DEVMODE		*mem;
+    DEVMODEW		*mem;
     DEVNAMES		*devname;
     int			i;
 
     bUserAbort = &(psettings->user_abort);
-    vim_memset(&prt_dlg, 0, sizeof(PRINTDLG));
-    prt_dlg.lStructSize = sizeof(PRINTDLG);
+    vim_memset(&prt_dlg, 0, sizeof(PRINTDLGW));
+    prt_dlg.lStructSize = sizeof(PRINTDLGW);
 #ifndef FEAT_GUI
     GetConsoleHwnd();	    /* get value of s_hwnd */
 #endif
@@ -1470,11 +1387,11 @@ mch_print_init(prt_settings_T *psettings
 	else
 	{
 	    prt_dlg.Flags |= PD_RETURNDEFAULT;
-	    if (PrintDlg(&prt_dlg) == 0)
+	    if (PrintDlgW(&prt_dlg) == 0)
 		goto init_fail_dlg;
 	}
     }
-    else if (PrintDlg(&prt_dlg) == 0)
+    else if (PrintDlgW(&prt_dlg) == 0)
 	goto init_fail_dlg;
     else
     {
@@ -1510,7 +1427,7 @@ mch_print_init(prt_settings_T *psettings
      * passed back correctly. It must be retrieved from the
      * hDevMode struct.
      */
-    mem = (DEVMODE *)GlobalLock(prt_dlg.hDevMode);
+    mem = (DEVMODEW *)GlobalLock(prt_dlg.hDevMode);
     if (mem != NULL)
     {
 	if (mem->dmCopies != 1)
@@ -1525,34 +1442,20 @@ mch_print_init(prt_settings_T *psettings
     devname = (DEVNAMES *)GlobalLock(prt_dlg.hDevNames);
     if (devname != 0)
     {
-	char_u	*printer_name = (char_u *)devname + devname->wDeviceOffset;
-	char_u	*port_name = (char_u *)devname +devname->wOutputOffset;
+	WCHAR	*wprinter_name = (WCHAR *)devname + devname->wDeviceOffset;
+	WCHAR	*wport_name = (WCHAR *)devname + devname->wOutputOffset;
 	char_u	*text = (char_u *)_("to %s on %s");
-	char_u  *printer_name_orig = printer_name;
-	char_u	*port_name_orig = port_name;
-
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	{
-	    char_u  *to_free = NULL;
-	    int     maxlen;
-
-	    acp_to_enc(printer_name, (int)STRLEN(printer_name), &to_free,
-								    &maxlen);
-	    if (to_free != NULL)
-		printer_name = to_free;
-	    acp_to_enc(port_name, (int)STRLEN(port_name), &to_free, &maxlen);
-	    if (to_free != NULL)
-		port_name = to_free;
-	}
-	prt_name = alloc((unsigned)(STRLEN(printer_name) + STRLEN(port_name)
-							     + STRLEN(text)));
+	char_u  *printer_name = utf16_to_enc(wprinter_name, NULL);
+	char_u	*port_name = utf16_to_enc(wport_name, NULL);
+
+	if (printer_name != NULL && port_name != NULL)
+	    prt_name = alloc((unsigned)(STRLEN(printer_name)
+					+ STRLEN(port_name) + STRLEN(text)));
 	if (prt_name != NULL)
 	    wsprintf((char *)prt_name, (const char *)text,
 		    printer_name, port_name);
-	if (printer_name != printer_name_orig)
-	    vim_free(printer_name);
-	if (port_name != port_name_orig)
-	    vim_free(port_name);
+	vim_free(printer_name);
+	vim_free(port_name);
     }
     GlobalUnlock(prt_dlg.hDevNames);
 
@@ -1639,9 +1542,9 @@ init_fail_dlg:
     int
 mch_print_begin(prt_settings_T *psettings)
 {
-    int			ret;
+    int			ret = 0;
     char		szBuffer[300];
-    WCHAR		*wp = NULL;
+    WCHAR		*wp;
 
     hDlgPrint = CreateDialog(GetModuleHandle(NULL), TEXT("PrintDlgBox"),
 					     prt_dlg.hwndOwner, PrintDlgProc);
@@ -1649,8 +1552,7 @@ mch_print_begin(prt_settings_T *psetting
     wsprintf(szBuffer, _("Printing '%s'"), gettail(psettings->jobname));
     vimSetDlgItemText(hDlgPrint, IDC_PRINTTEXT1, (char_u *)szBuffer);
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	wp = enc_to_utf16(psettings->jobname, NULL);
+    wp = enc_to_utf16(psettings->jobname, NULL);
     if (wp != NULL)
     {
 	DOCINFOW	di;
@@ -1661,15 +1563,6 @@ mch_print_begin(prt_settings_T *psetting
 	ret = StartDocW(prt_dlg.hDC, &di);
 	vim_free(wp);
     }
-    else
-    {
-	DOCINFO		di;
-
-	vim_memset(&di, 0, sizeof(di));
-	di.cbSize = sizeof(di);
-	di.lpszDocName = (LPCSTR)psettings->jobname;
-	ret = StartDoc(prt_dlg.hDC, &di);
-    }
 
 #ifdef FEAT_GUI
     /* Give focus back to main window (when using MDI). */
@@ -1725,50 +1618,32 @@ mch_print_start_line(int margin, int pag
 mch_print_text_out(char_u *p, int len)
 {
     SIZE	sz;
-    WCHAR	*wp = NULL;
+    WCHAR	*wp;
     int		wlen = len;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	wp = enc_to_utf16(p, &wlen);
-    if (wp != NULL)
-    {
-	int ret = FALSE;
-
-	TextOutW(prt_dlg.hDC, prt_pos_x + prt_left_margin,
-					 prt_pos_y + prt_top_margin, wp, wlen);
-	GetTextExtentPoint32W(prt_dlg.hDC, wp, wlen, &sz);
-	vim_free(wp);
-	prt_pos_x += (sz.cx - prt_tm.tmOverhang);
-	/* This is wrong when printing spaces for a TAB. */
-	if (p[len] != NUL)
-	{
-	    wlen = MB_PTR2LEN(p + len);
-	    wp = enc_to_utf16(p + len, &wlen);
-	    if (wp != NULL)
-	    {
-		GetTextExtentPoint32W(prt_dlg.hDC, wp, 1, &sz);
-		ret = (prt_pos_x + prt_left_margin + sz.cx > prt_right_margin);
-		vim_free(wp);
-	    }
-	}
-	return ret;
-    }
-    TextOut(prt_dlg.hDC, prt_pos_x + prt_left_margin,
-					  prt_pos_y + prt_top_margin,
-					  (LPCSTR)p, len);
-#ifndef FEAT_PROPORTIONAL_FONTS
-    prt_pos_x += len * prt_tm.tmAveCharWidth;
-    return (prt_pos_x + prt_left_margin + prt_tm.tmAveCharWidth
-				     + prt_tm.tmOverhang > prt_right_margin);
-#else
-    GetTextExtentPoint32(prt_dlg.hDC, (LPCSTR)p, len, &sz);
+    int		ret = FALSE;
+
+    wp = enc_to_utf16(p, &wlen);
+    if (wp == NULL)
+	return FALSE;
+
+    TextOutW(prt_dlg.hDC, prt_pos_x + prt_left_margin,
+	    prt_pos_y + prt_top_margin, wp, wlen);
+    GetTextExtentPoint32W(prt_dlg.hDC, wp, wlen, &sz);
+    vim_free(wp);
     prt_pos_x += (sz.cx - prt_tm.tmOverhang);
     /* This is wrong when printing spaces for a TAB. */
-    if (p[len] == NUL)
-	return FALSE;
-    GetTextExtentPoint32(prt_dlg.hDC, p + len, 1, &sz);
-    return (prt_pos_x + prt_left_margin + sz.cx > prt_right_margin);
-#endif
+    if (p[len] != NUL)
+    {
+	wlen = MB_PTR2LEN(p + len);
+	wp = enc_to_utf16(p + len, &wlen);
+	if (wp != NULL)
+	{
+	    GetTextExtentPoint32W(prt_dlg.hDC, wp, 1, &sz);
+	    ret = (prt_pos_x + prt_left_margin + sz.cx > prt_right_margin);
+	    vim_free(wp);
+	}
+    }
+    return ret;
 }
 
     void
@@ -1863,6 +1738,7 @@ resolve_reparse_point(char_u *fname)
 {
     HANDLE	    h = INVALID_HANDLE_VALUE;
     DWORD	    size;
+    WCHAR	    *p;
     char_u	    *rfname = NULL;
     FILE_NAME_INFO_ *nameinfo = NULL;
     WCHAR	    buff[MAX_PATH], *volnames = NULL;
@@ -1887,33 +1763,19 @@ resolve_reparse_point(char_u *fname)
 	    return NULL;
     }
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+    p = enc_to_utf16(fname, NULL);
+    if (p == NULL)
+	goto fail;
+
+    if ((GetFileAttributesW(p) & FILE_ATTRIBUTE_REPARSE_POINT) == 0)
     {
-	WCHAR	*p;
-
-	p = enc_to_utf16(fname, NULL);
-	if (p == NULL)
-	    goto fail;
-
-	if ((GetFileAttributesW(p) & FILE_ATTRIBUTE_REPARSE_POINT) == 0)
-	{
-	    vim_free(p);
-	    goto fail;
-	}
-
-	h = CreateFileW(p, 0, 0, NULL, OPEN_EXISTING,
-		FILE_FLAG_BACKUP_SEMANTICS, NULL);
 	vim_free(p);
+	goto fail;
     }
-    else
-    {
-	if ((GetFileAttributes((char*) fname) &
-		    FILE_ATTRIBUTE_REPARSE_POINT) == 0)
-	    goto fail;
-
-	h = CreateFile((char*) fname, 0, 0, NULL, OPEN_EXISTING,
-		FILE_FLAG_BACKUP_SEMANTICS, NULL);
-    }
+
+    h = CreateFileW(p, 0, 0, NULL, OPEN_EXISTING,
+	    FILE_FLAG_BACKUP_SEMANTICS, NULL);
+    vim_free(p);
 
     if (h == INVALID_HANDLE_VALUE)
 	goto fail;
@@ -1988,8 +1850,6 @@ resolve_shortcut(char_u *fname)
     IShellLink		*psl = NULL;
     IPersistFile	*ppf = NULL;
     OLECHAR		wsz[MAX_PATH];
-    WIN32_FIND_DATA	ffd; // we get those free of charge
-    CHAR		buf[MAX_PATH]; // could have simply reused 'wsz'...
     char_u		*rfname = NULL;
     int			len;
     IShellLinkW		*pslw = NULL;
@@ -2005,80 +1865,43 @@ resolve_shortcut(char_u *fname)
 
     CoInitialize(NULL);
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	// create a link manager object and request its interface
-	hr = CoCreateInstance(
-		&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
-		&IID_IShellLinkW, (void**)&pslw);
-	if (hr == S_OK)
-	{
-	    WCHAR	*p = enc_to_utf16(fname, NULL);
-
-	    if (p != NULL)
-	    {
-		// Get a pointer to the IPersistFile interface.
-		hr = pslw->lpVtbl->QueryInterface(
-			pslw, &IID_IPersistFile, (void**)&ppf);
-		if (hr != S_OK)
-		    goto shortcut_errorw;
-
-		// "load" the name and resolve the link
-		hr = ppf->lpVtbl->Load(ppf, p, STGM_READ);
-		if (hr != S_OK)
-		    goto shortcut_errorw;
-#  if 0  // This makes Vim wait a long time if the target does not exist.
-		hr = pslw->lpVtbl->Resolve(pslw, NULL, SLR_NO_UI);
-		if (hr != S_OK)
-		    goto shortcut_errorw;
-#  endif
-
-		// Get the path to the link target.
-		ZeroMemory(wsz, MAX_PATH * sizeof(WCHAR));
-		hr = pslw->lpVtbl->GetPath(pslw, wsz, MAX_PATH, &ffdw, 0);
-		if (hr == S_OK && wsz[0] != NUL)
-		    rfname = utf16_to_enc(wsz, NULL);
-
-shortcut_errorw:
-		vim_free(p);
-		goto shortcut_end;
-	    }
-	}
-	goto shortcut_end;
-    }
     // create a link manager object and request its interface
     hr = CoCreateInstance(
 	    &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
-	    &IID_IShellLink, (void**)&psl);
-    if (hr != S_OK)
-	goto shortcut_end;
-
-    // Get a pointer to the IPersistFile interface.
-    hr = psl->lpVtbl->QueryInterface(
-	    psl, &IID_IPersistFile, (void**)&ppf);
-    if (hr != S_OK)
-	goto shortcut_end;
-
-    // full path string must be in Unicode.
-    MultiByteToWideChar(CP_ACP, 0, (LPCSTR)fname, -1, wsz, MAX_PATH);
-
-    // "load" the name and resolve the link
-    hr = ppf->lpVtbl->Load(ppf, wsz, STGM_READ);
-    if (hr != S_OK)
-	goto shortcut_end;
-# if 0  // This makes Vim wait a long time if the target doesn't exist.
-    hr = psl->lpVtbl->Resolve(psl, NULL, SLR_NO_UI);
-    if (hr != S_OK)
-	goto shortcut_end;
+	    &IID_IShellLinkW, (void**)&pslw);
+    if (hr == S_OK)
+    {
+	WCHAR	*p = enc_to_utf16(fname, NULL);
+
+	if (p != NULL)
+	{
+	    // Get a pointer to the IPersistFile interface.
+	    hr = pslw->lpVtbl->QueryInterface(
+		    pslw, &IID_IPersistFile, (void**)&ppf);
+	    if (hr != S_OK)
+		goto shortcut_errorw;
+
+	    // "load" the name and resolve the link
+	    hr = ppf->lpVtbl->Load(ppf, p, STGM_READ);
+	    if (hr != S_OK)
+		goto shortcut_errorw;
+# if 0  // This makes Vim wait a long time if the target does not exist.
+	    hr = pslw->lpVtbl->Resolve(pslw, NULL, SLR_NO_UI);
+	    if (hr != S_OK)
+		goto shortcut_errorw;
 # endif
 
-    // Get the path to the link target.
-    ZeroMemory(buf, MAX_PATH);
-    hr = psl->lpVtbl->GetPath(psl, buf, MAX_PATH, &ffd, 0);
-    if (hr == S_OK && buf[0] != NUL)
-	rfname = vim_strsave((char_u *)buf);
-
-shortcut_end:
+	    // Get the path to the link target.
+	    ZeroMemory(wsz, MAX_PATH * sizeof(WCHAR));
+	    hr = pslw->lpVtbl->GetPath(pslw, wsz, MAX_PATH, &ffdw, 0);
+	    if (hr == S_OK && wsz[0] != NUL)
+		rfname = utf16_to_enc(wsz, NULL);
+
+shortcut_errorw:
+	    vim_free(p);
+	}
+    }
+
     // Release all interface pointers (both belong to the same object)
     if (ppf != NULL)
 	ppf->lpVtbl->Release(ppf);
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -586,7 +586,6 @@ static char *null_libintl_ngettext(const
 static char *null_libintl_textdomain(const char *);
 static char *null_libintl_bindtextdomain(const char *, const char *);
 static char *null_libintl_bind_textdomain_codeset(const char *, const char *);
-static int null_libintl_putenv(const char *);
 static int null_libintl_wputenv(const wchar_t *);
 
 static HINSTANCE hLibintlDLL = NULL;
@@ -598,7 +597,6 @@ char *(*dyn_libintl_bindtextdomain)(cons
 						= null_libintl_bindtextdomain;
 char *(*dyn_libintl_bind_textdomain_codeset)(const char *, const char *)
 				       = null_libintl_bind_textdomain_codeset;
-int (*dyn_libintl_putenv)(const char *) = null_libintl_putenv;
 int (*dyn_libintl_wputenv)(const wchar_t *) = null_libintl_wputenv;
 
     int
@@ -666,15 +664,10 @@ dyn_libintl_init(void)
 	dyn_libintl_bind_textdomain_codeset =
 					 null_libintl_bind_textdomain_codeset;
 
-    /* _putenv() function for the libintl.dll is optional. */
+    /* _wputenv() function for the libintl.dll is optional. */
     hmsvcrt = find_imported_module_by_funcname(hLibintlDLL, "getenv");
     if (hmsvcrt != NULL)
-    {
-	dyn_libintl_putenv = (void *)GetProcAddress(hmsvcrt, "_putenv");
 	dyn_libintl_wputenv = (void *)GetProcAddress(hmsvcrt, "_wputenv");
-    }
-    if (dyn_libintl_putenv == NULL || dyn_libintl_putenv == _putenv)
-	dyn_libintl_putenv = null_libintl_putenv;
     if (dyn_libintl_wputenv == NULL || dyn_libintl_wputenv == _wputenv)
 	dyn_libintl_wputenv = null_libintl_wputenv;
 
@@ -692,7 +685,6 @@ dyn_libintl_end(void)
     dyn_libintl_textdomain	= null_libintl_textdomain;
     dyn_libintl_bindtextdomain	= null_libintl_bindtextdomain;
     dyn_libintl_bind_textdomain_codeset = null_libintl_bind_textdomain_codeset;
-    dyn_libintl_putenv		= null_libintl_putenv;
     dyn_libintl_wputenv		= null_libintl_wputenv;
 }
 
@@ -734,12 +726,6 @@ null_libintl_textdomain(const char *doma
 }
 
     static int
-null_libintl_putenv(const char *envstring UNUSED)
-{
-    return 0;
-}
-
-    static int
 null_libintl_wputenv(const wchar_t *envstring UNUSED)
 {
     return 0;
@@ -2027,9 +2013,10 @@ theend:
     static int
 executable_exists(char *name, char_u **path, int use_path)
 {
-    char	*dum;
-    char	fname[_MAX_PATH];
-    char	*curpath, *newpath;
+    WCHAR	*p;
+    WCHAR	fnamew[_MAX_PATH];
+    WCHAR	*dumw;
+    WCHAR	*wcurpath, *wnewpath;
     long	n;
 
     if (!use_path)
@@ -2048,49 +2035,26 @@ executable_exists(char *name, char_u **p
 	return FALSE;
     }
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	*p = enc_to_utf16((char_u *)name, NULL);
-	WCHAR	fnamew[_MAX_PATH];
-	WCHAR	*dumw;
-	WCHAR	*wcurpath, *wnewpath;
-
-	if (p != NULL)
-	{
-	    wcurpath = _wgetenv(L"PATH");
-	    wnewpath = (WCHAR*)alloc((unsigned)(wcslen(wcurpath) + 3)
-							    * sizeof(WCHAR));
-	    if (wnewpath == NULL)
-		return FALSE;
-	    wcscpy(wnewpath, L".;");
-	    wcscat(wnewpath, wcurpath);
-	    n = (long)SearchPathW(wnewpath, p, NULL, _MAX_PATH, fnamew, &dumw);
-	    vim_free(wnewpath);
-	    vim_free(p);
-	    if (n == 0)
-		return FALSE;
-	    if (GetFileAttributesW(fnamew) & FILE_ATTRIBUTE_DIRECTORY)
-		return FALSE;
-	    if (path != NULL)
-		*path = utf16_to_enc(fnamew, NULL);
-	    return TRUE;
-	}
-    }
-
-    curpath = getenv("PATH");
-    newpath = (char*)alloc((unsigned)(STRLEN(curpath) + 3));
-    if (newpath == NULL)
+    p = enc_to_utf16((char_u *)name, NULL);
+    if (p == NULL)
 	return FALSE;
-    STRCPY(newpath, ".;");
-    STRCAT(newpath, curpath);
-    n = (long)SearchPath(newpath, name, NULL, _MAX_PATH, fname, &dum);
-    vim_free(newpath);
+
+    wcurpath = _wgetenv(L"PATH");
+    wnewpath = (WCHAR*)alloc((unsigned)(wcslen(wcurpath) + 3)
+	    * sizeof(WCHAR));
+    if (wnewpath == NULL)
+	return FALSE;
+    wcscpy(wnewpath, L".;");
+    wcscat(wnewpath, wcurpath);
+    n = (long)SearchPathW(wnewpath, p, NULL, _MAX_PATH, fnamew, &dumw);
+    vim_free(wnewpath);
+    vim_free(p);
     if (n == 0)
 	return FALSE;
-    if (mch_isdir((char_u *)fname))
+    if (GetFileAttributesW(fnamew) & FILE_ATTRIBUTE_DIRECTORY)
 	return FALSE;
     if (path != NULL)
-	*path = vim_strsave((char_u *)fname);
+	*path = utf16_to_enc(fnamew, NULL);
     return TRUE;
 }
 
@@ -2812,31 +2776,20 @@ mch_get_user_name(
     char_u  *s,
     int	    len)
 {
-    char szUserName[256 + 1];	/* UNLEN is 256 */
-    DWORD cch = sizeof szUserName;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR wszUserName[256 + 1];	/* UNLEN is 256 */
-	DWORD wcch = sizeof(wszUserName) / sizeof(WCHAR);
-
-	if (GetUserNameW(wszUserName, &wcch))
+    WCHAR wszUserName[256 + 1];	/* UNLEN is 256 */
+    DWORD wcch = sizeof(wszUserName) / sizeof(WCHAR);
+
+    if (GetUserNameW(wszUserName, &wcch))
+    {
+	char_u  *p = utf16_to_enc(wszUserName, NULL);
+
+	if (p != NULL)
 	{
-	    char_u  *p = utf16_to_enc(wszUserName, NULL);
-
-	    if (p != NULL)
-	    {
-		vim_strncpy(s, p, len - 1);
-		vim_free(p);
-		return OK;
-	    }
+	    vim_strncpy(s, p, len - 1);
+	    vim_free(p);
+	    return OK;
 	}
     }
-    if (GetUserName(szUserName, &cch))
-    {
-	vim_strncpy(s, (char_u *)szUserName, len - 1);
-	return OK;
-    }
     s[0] = NUL;
     return FAIL;
 }
@@ -2850,27 +2803,20 @@ mch_get_host_name(
     char_u	*s,
     int		len)
 {
-    DWORD cch = len;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR wszHostName[256 + 1];
-	DWORD wcch = sizeof(wszHostName) / sizeof(WCHAR);
-
-	if (GetComputerNameW(wszHostName, &wcch))
+    WCHAR wszHostName[256 + 1];
+    DWORD wcch = sizeof(wszHostName) / sizeof(WCHAR);
+
+    if (GetComputerNameW(wszHostName, &wcch))
+    {
+	char_u  *p = utf16_to_enc(wszHostName, NULL);
+
+	if (p != NULL)
 	{
-	    char_u  *p = utf16_to_enc(wszHostName, NULL);
-
-	    if (p != NULL)
-	    {
-		vim_strncpy(s, p, len - 1);
-		vim_free(p);
-		return;
-	    }
+	    vim_strncpy(s, p, len - 1);
+	    vim_free(p);
+	    return;
 	}
     }
-    if (!GetComputerName((LPSTR)s, &cch))
-	vim_strncpy(s, (char_u *)"PC (Win32 Vim)", len - 1);
 }
 
 
@@ -2893,8 +2839,7 @@ mch_dirname(
     char_u	*buf,
     int		len)
 {
-    char_u  abuf[_MAX_PATH + 1];
-    DWORD   lfnlen;
+    WCHAR   wbuf[_MAX_PATH + 1];
 
     /*
      * Originally this was:
@@ -2902,47 +2847,32 @@ mch_dirname(
      * But the Win32s known bug list says that getcwd() doesn't work
      * so use the Win32 system call instead. <Negri>
      */
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	wbuf[_MAX_PATH + 1];
-
-	if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0)
+    if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0)
+    {
+	WCHAR   wcbuf[_MAX_PATH + 1];
+	char_u  *p = NULL;
+
+	if (GetLongPathNameW(wbuf, wcbuf, _MAX_PATH) != 0)
 	{
-	    WCHAR   wcbuf[_MAX_PATH + 1];
-	    char_u  *p = NULL;
-
-	    if (GetLongPathNameW(wbuf, wcbuf, _MAX_PATH) != 0)
+	    p = utf16_to_enc(wcbuf, NULL);
+	    if (STRLEN(p) >= (size_t)len)
 	    {
-		p = utf16_to_enc(wcbuf, NULL);
-		if (STRLEN(p) >= (size_t)len)
-		{
-		    // long path name is too long, fall back to short one
-		    vim_free(p);
-		    p = NULL;
-		}
-	    }
-	    if (p == NULL)
-		p = utf16_to_enc(wbuf, NULL);
-
-	    if (p != NULL)
-	    {
-		vim_strncpy(buf, p, len - 1);
+		// long path name is too long, fall back to short one
 		vim_free(p);
-		return OK;
+		p = NULL;
 	    }
 	}
-	return FAIL;
-    }
-    if (GetCurrentDirectory(len, (LPSTR)buf) == 0)
-	return FAIL;
-    lfnlen = GetLongPathNameA((LPCSTR)buf, (LPSTR)abuf, _MAX_PATH);
-    if (lfnlen == 0 || lfnlen >= (DWORD)len)
-	// Failed to get long path name or it's too long: fall back to the
-	// short path name.
-	return OK;
-
-    STRCPY(buf, abuf);
-    return OK;
+	if (p == NULL)
+	    p = utf16_to_enc(wbuf, NULL);
+
+	if (p != NULL)
+	{
+	    vim_strncpy(buf, p, len - 1);
+	    vim_free(p);
+	    return OK;
+	}
+    }
+    return FAIL;
 }
 
 /*
@@ -2968,22 +2898,15 @@ mch_getperm(char_u *name)
     int
 mch_setperm(char_u *name, long perm)
 {
-    long	n = -1;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR *p = enc_to_utf16(name, NULL);
-
-	if (p != NULL)
-	{
-	    n = _wchmod(p, perm);
-	    vim_free(p);
-	    if (n == -1)
-		return FAIL;
-	}
-    }
-    if (n == -1)
-	n = _chmod((const char *)name, perm);
+    long	n;
+    WCHAR	*p;
+
+    p = enc_to_utf16(name, NULL);
+    if (p == NULL)
+	return FAIL;
+
+    n = _wchmod(p, perm);
+    vim_free(p);
     if (n == -1)
 	return FAIL;
 
@@ -3053,19 +2976,15 @@ mch_isrealdir(char_u *name)
     int
 mch_mkdir(char_u *name)
 {
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	*p;
-	int	retval;
-
-	p = enc_to_utf16(name, NULL);
-	if (p == NULL)
-	    return -1;
-	retval = _wmkdir(p);
-	vim_free(p);
-	return retval;
-    }
-    return _mkdir((const char *)name);
+    WCHAR   *p;
+    int	    retval;
+
+    p = enc_to_utf16(name, NULL);
+    if (p == NULL)
+	return -1;
+    retval = _wmkdir(p);
+    vim_free(p);
+    return retval;
 }
 
 /*
@@ -3075,19 +2994,15 @@ mch_mkdir(char_u *name)
     int
 mch_rmdir(char_u *name)
 {
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	*p;
-	int	retval;
-
-	p = enc_to_utf16(name, NULL);
-	if (p == NULL)
-	    return -1;
-	retval = _wrmdir(p);
-	vim_free(p);
-	return retval;
-    }
-    return _rmdir((const char *)name);
+    WCHAR   *p;
+    int	    retval;
+
+    p = enc_to_utf16(name, NULL);
+    if (p == NULL)
+	return -1;
+    retval = _wrmdir(p);
+    vim_free(p);
+    return retval;
 }
 
 /*
@@ -3110,35 +3025,22 @@ mch_is_symbolic_link(char_u *name)
 {
     HANDLE		hFind;
     int			res = FALSE;
-    WIN32_FIND_DATAA	findDataA;
     DWORD		fileFlags = 0, reparseTag = 0;
-    WCHAR		*wn = NULL;
+    WCHAR		*wn;
     WIN32_FIND_DATAW	findDataW;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	wn = enc_to_utf16(name, NULL);
-    if (wn != NULL)
-    {
-	hFind = FindFirstFileW(wn, &findDataW);
-	vim_free(wn);
-	if (hFind != INVALID_HANDLE_VALUE)
-	{
-	    fileFlags = findDataW.dwFileAttributes;
-	    reparseTag = findDataW.dwReserved0;
-	}
-    }
-    else
-    {
-	hFind = FindFirstFile((LPCSTR)name, &findDataA);
-	if (hFind != INVALID_HANDLE_VALUE)
-	{
-	    fileFlags = findDataA.dwFileAttributes;
-	    reparseTag = findDataA.dwReserved0;
-	}
-    }
-
+    wn = enc_to_utf16(name, NULL);
+    if (wn == NULL)
+	return FALSE;
+
+    hFind = FindFirstFileW(wn, &findDataW);
+    vim_free(wn);
     if (hFind != INVALID_HANDLE_VALUE)
+    {
+	fileFlags = findDataW.dwFileAttributes;
+	reparseTag = findDataW.dwReserved0;
 	FindClose(hFind);
+    }
 
     if ((fileFlags & FILE_ATTRIBUTE_REPARSE_POINT)
 	    && (reparseTag == IO_REPARSE_TAG_SYMLINK
@@ -3172,33 +3074,20 @@ win32_fileinfo(char_u *fname, BY_HANDLE_
 {
     HANDLE	hFile;
     int		res = FILEINFO_READ_FAIL;
-    WCHAR	*wn = NULL;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	wn = enc_to_utf16(fname, NULL);
-	if (wn == NULL)
-	    return FILEINFO_ENC_FAIL;
-    }
-    if (wn != NULL)
-    {
-	hFile = CreateFileW(wn,		/* file name */
-		    GENERIC_READ,	/* access mode */
-		    FILE_SHARE_READ | FILE_SHARE_WRITE,	/* share mode */
-		    NULL,		/* security descriptor */
-		    OPEN_EXISTING,	/* creation disposition */
-		    FILE_FLAG_BACKUP_SEMANTICS,	/* file attributes */
-		    NULL);		/* handle to template file */
-	vim_free(wn);
-    }
-    else
-	hFile = CreateFile((LPCSTR)fname,    /* file name */
-		    GENERIC_READ,	    /* access mode */
-		    FILE_SHARE_READ | FILE_SHARE_WRITE,	/* share mode */
-		    NULL,		/* security descriptor */
-		    OPEN_EXISTING,	/* creation disposition */
-		    FILE_FLAG_BACKUP_SEMANTICS,	/* file attributes */
-		    NULL);		/* handle to template file */
+    WCHAR	*wn;
+
+    wn = enc_to_utf16(fname, NULL);
+    if (wn == NULL)
+	return FILEINFO_ENC_FAIL;
+
+    hFile = CreateFileW(wn,	// file name
+	    GENERIC_READ,	// access mode
+	    FILE_SHARE_READ | FILE_SHARE_WRITE,	// share mode
+	    NULL,		// security descriptor
+	    OPEN_EXISTING,	// creation disposition
+	    FILE_FLAG_BACKUP_SEMANTICS,	// file attributes
+	    NULL);		// handle to template file
+    vim_free(wn);
 
     if (hFile != INVALID_HANDLE_VALUE)
     {
@@ -3221,18 +3110,14 @@ win32_fileinfo(char_u *fname, BY_HANDLE_
 win32_getattrs(char_u *name)
 {
     int		attr;
-    WCHAR	*p = NULL;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	p = enc_to_utf16(name, NULL);
-
-    if (p != NULL)
-    {
-	attr = GetFileAttributesW(p);
-	vim_free(p);
-    }
-    else
-	attr = GetFileAttributes((char *)name);
+    WCHAR	*p;
+
+    p = enc_to_utf16(name, NULL);
+    if (p == NULL)
+	return INVALID_FILE_ATTRIBUTES;
+
+    attr = GetFileAttributesW(p);
+    vim_free(p);
 
     return attr;
 }
@@ -3245,19 +3130,15 @@ win32_getattrs(char_u *name)
     static int
 win32_setattrs(char_u *name, int attrs)
 {
-    int res;
-    WCHAR	*p = NULL;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	p = enc_to_utf16(name, NULL);
-
-    if (p != NULL)
-    {
-	res = SetFileAttributesW(p, attrs);
-	vim_free(p);
-    }
-    else
-	res = SetFileAttributes((char *)name, attrs);
+    int	    res;
+    WCHAR   *p;
+
+    p = enc_to_utf16(name, NULL);
+    if (p == NULL)
+	return -1;
+
+    res = SetFileAttributesW(p, attrs);
+    vim_free(p);
 
     return res ? 0 : -1;
 }
@@ -3375,7 +3256,7 @@ mch_nodetype(char_u *name)
 {
     HANDLE	hFile;
     int		type;
-    WCHAR	*wn = NULL;
+    WCHAR	*wn;
 
     /* We can't open a file with a name "\\.\con" or "\\.\prn" and trying to
      * read from it later will cause Vim to hang.  Thus return NODE_WRITABLE
@@ -3383,29 +3264,18 @@ mch_nodetype(char_u *name)
     if (STRNCMP(name, "\\\\.\\", 4) == 0)
 	return NODE_WRITABLE;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	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 */
-	vim_free(wn);
-    }
-    else
-	hFile = CreateFile((LPCSTR)name,    /* file name */
-		    GENERIC_WRITE,	    /* access mode */
-		    0,			    /* share mode */
-		    NULL,		    /* security descriptor */
-		    OPEN_EXISTING,	    /* creation disposition */
-		    0,			    /* file attributes */
-		    NULL);		    /* handle to template file */
-
+    wn = enc_to_utf16(name, NULL);
+    if (wn == NULL)
+	return NODE_NORMAL;
+
+    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 (hFile == INVALID_HANDLE_VALUE)
 	return NODE_NORMAL;
 
@@ -3445,81 +3315,45 @@ mch_get_acl(char_u *fname)
     p = (struct my_acl *)alloc_clear((unsigned)sizeof(struct my_acl));
     if (p != NULL)
     {
-	WCHAR	*wn = NULL;
-
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	    wn = enc_to_utf16(fname, NULL);
-	if (wn != NULL)
+	WCHAR	*wn;
+
+	wn = enc_to_utf16(fname, NULL);
+	if (wn == NULL)
+	    return 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)
 	{
-	    /* 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.
+	    // Retrieve only DACL.
+	    (void)GetNamedSecurityInfoW(
+		    wn,
+		    SE_FILE_OBJECT,
+		    DACL_SECURITY_INFORMATION,
+		    NULL,
+		    NULL,
+		    &p->pDacl,
+		    NULL,
 		    &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)
-	    {
-		mch_free_acl((vim_acl_T)p);
-		p = NULL;
-	    }
-	    vim_free(wn);
 	}
-	else
+	if (p->pSecurityDescriptor == NULL)
 	{
-	    /* 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)
-	    {
-		/* 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;
-	    }
+	    mch_free_acl((vim_acl_T)p);
+	    p = NULL;
 	}
+	vim_free(wn);
     }
 
     return (vim_acl_T)p;
@@ -3560,56 +3394,41 @@ mch_set_acl(char_u *fname, vim_acl_T acl
 #ifdef HAVE_ACL
     struct my_acl   *p = (struct my_acl *)acl;
     SECURITY_INFORMATION    sec_info = 0;
-
-    if (p != NULL)
-    {
-	WCHAR	*wn = NULL;
-
-	/* Set security flags */
-	if (p->pSidOwner)
-	    sec_info |= OWNER_SECURITY_INFORMATION;
-	if (p->pSidGroup)
-	    sec_info |= GROUP_SECURITY_INFORMATION;
-	if (p->pDacl)
-	{
-	    sec_info |= DACL_SECURITY_INFORMATION;
-	    /* Do not inherit its parent's DACL.
-	     * If the DACL is inherited, Cygwin permissions would be changed.
-	     */
-	    if (!is_acl_inherited(p->pDacl))
-		sec_info |= PROTECTED_DACL_SECURITY_INFORMATION;
-	}
-	if (p->pSacl)
-	    sec_info |= SACL_SECURITY_INFORMATION;
-
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	    wn = enc_to_utf16(fname, NULL);
-	if (wn != NULL)
-	{
-	    (void)SetNamedSecurityInfoW(
-			wn,			// Abstract filename
-			SE_FILE_OBJECT,		// File Object
-			sec_info,
-			p->pSidOwner,		// Ownership information.
-			p->pSidGroup,		// Group membership.
-			p->pDacl,		// Discretionary information.
-			p->pSacl		// For auditing purposes.
-			);
-	    vim_free(wn);
-	}
-	else
-	{
-	    (void)SetNamedSecurityInfo(
-			(LPSTR)fname,		// Abstract filename
-			SE_FILE_OBJECT,		// File Object
-			sec_info,
-			p->pSidOwner,		// Ownership information.
-			p->pSidGroup,		// Group membership.
-			p->pDacl,		// Discretionary information.
-			p->pSacl		// For auditing purposes.
-			);
-	}
-    }
+    WCHAR	    *wn;
+
+    if (p == NULL)
+	return;
+
+    wn = enc_to_utf16(fname, NULL);
+    if (wn == NULL)
+	return;
+
+    // Set security flags
+    if (p->pSidOwner)
+	sec_info |= OWNER_SECURITY_INFORMATION;
+    if (p->pSidGroup)
+	sec_info |= GROUP_SECURITY_INFORMATION;
+    if (p->pDacl)
+    {
+	sec_info |= DACL_SECURITY_INFORMATION;
+	// Do not inherit its parent's DACL.
+	// If the DACL is inherited, Cygwin permissions would be changed.
+	if (!is_acl_inherited(p->pDacl))
+	    sec_info |= PROTECTED_DACL_SECURITY_INFORMATION;
+    }
+    if (p->pSacl)
+	sec_info |= SACL_SECURITY_INFORMATION;
+
+    (void)SetNamedSecurityInfoW(
+	    wn,			// Abstract filename
+	    SE_FILE_OBJECT,	// File Object
+	    sec_info,
+	    p->pSidOwner,	// Ownership information.
+	    p->pSidGroup,	// Group membership.
+	    p->pDacl,		// Discretionary information.
+	    p->pSacl		// For auditing purposes.
+	    );
+    vim_free(wn);
 #endif
 }
 
@@ -3955,51 +3774,34 @@ vim_create_process(
     LPVOID		*env,
     char		*cwd)
 {
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	BOOL	ret;
-	WCHAR	*wcmd, *wcwd = NULL;
-
-	wcmd = enc_to_utf16((char_u *)cmd, NULL);
-	if (wcmd == NULL)
-	    goto fallback;
-	if (cwd != NULL)
-	{
-	    wcwd = enc_to_utf16((char_u *)cwd, NULL);
-	    if (wcwd == NULL)
-	    {
-		vim_free(wcmd);
-		goto fallback;
-	    }
-	}
-
-	ret = CreateProcessW(
-	    NULL,			/* Executable name */
-	    wcmd,			/* Command to execute */
-	    NULL,			/* Process security attributes */
-	    NULL,			/* Thread security attributes */
-	    inherit_handles,	/* Inherit handles */
-	    flags,			/* Creation flags */
-	    env,			/* Environment */
-	    wcwd,			/* Current directory */
-	    (LPSTARTUPINFOW)si,	/* Startup information */
-	    pi);			/* Process information */
-	vim_free(wcmd);
-	vim_free(wcwd);
-	return ret;
-    }
-fallback:
-    return CreateProcess(
-	NULL,			/* Executable name */
-	cmd,			/* Command to execute */
-	NULL,			/* Process security attributes */
-	NULL,			/* Thread security attributes */
-	inherit_handles,	/* Inherit handles */
-	flags,			/* Creation flags */
-	env,			/* Environment */
-	cwd,			/* Current directory */
-	si,			/* Startup information */
-	pi);			/* Process information */
+    BOOL	ret = FALSE;
+    WCHAR	*wcmd, *wcwd = NULL;
+
+    wcmd = enc_to_utf16((char_u *)cmd, NULL);
+    if (wcmd == NULL)
+	return FALSE;
+    if (cwd != NULL)
+    {
+	wcwd = enc_to_utf16((char_u *)cwd, NULL);
+	if (wcwd == NULL)
+	    goto theend;
+    }
+
+    ret = CreateProcessW(
+	    NULL,		// Executable name
+	    wcmd,		// Command to execute
+	    NULL,		// Process security attributes
+	    NULL,		// Thread security attributes
+	    inherit_handles,	// Inherit handles
+	    flags,		// Creation flags
+	    env,		// Environment
+	    wcwd,		// Current directory
+	    (LPSTARTUPINFOW)si,	// Startup information
+	    pi);		// Process information
+theend:
+    vim_free(wcmd);
+    vim_free(wcwd);
+    return ret;
 }
 
 
@@ -4008,18 +3810,16 @@ vim_shell_execute(
     char *cmd,
     INT	 n_show_cmd)
 {
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR *wcmd = enc_to_utf16((char_u *)cmd, NULL);
-	if (wcmd != NULL)
-	{
-	    HINSTANCE ret;
-	    ret = ShellExecuteW(NULL, NULL, wcmd, NULL, NULL, n_show_cmd);
-	    vim_free(wcmd);
-	    return ret;
-	}
-    }
-    return ShellExecute(NULL, NULL, cmd, NULL, NULL, n_show_cmd);
+    HINSTANCE	ret;
+    WCHAR	*wcmd;
+
+    wcmd = enc_to_utf16((char_u *)cmd, NULL);
+    if (wcmd == NULL)
+	return (HINSTANCE) 0;
+
+    ret = ShellExecuteW(NULL, NULL, wcmd, NULL, NULL, n_show_cmd);
+    vim_free(wcmd);
+    return ret;
 }
 
 
@@ -4582,17 +4382,16 @@ mch_system(char *cmd, int options)
     static int
 mch_system(char *cmd, int options)
 {
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	*wcmd = enc_to_utf16((char_u *)cmd, NULL);
-	if (wcmd != NULL)
-	{
-	    int ret = _wsystem(wcmd);
-	    vim_free(wcmd);
-	    return ret;
-	}
-    }
-    return system(cmd);
+    int		ret;
+    WCHAR	*wcmd;
+
+    wcmd = enc_to_utf16((char_u *)cmd, NULL);
+    if (wcmd == NULL)
+	return -1;
+
+    ret = _wsystem(wcmd);
+    vim_free(wcmd);
+    return ret;
 }
 
 #endif
@@ -4692,51 +4491,29 @@ mch_call_shell(
     int		x = 0;
     int		tmode = cur_tmode;
 #ifdef FEAT_TITLE
-    char	szShellTitle[512];
-    int		did_set_title = FALSE;
+    WCHAR	szShellTitle[512];
 
     /* Change the title to reflect that we are in a subshell. */
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR szShellTitle[512];
-
-	if (GetConsoleTitleW(szShellTitle,
-				  sizeof(szShellTitle)/sizeof(WCHAR) - 4) > 0)
+    if (GetConsoleTitleW(szShellTitle,
+		sizeof(szShellTitle)/sizeof(WCHAR) - 4) > 0)
+    {
+	if (cmd == NULL)
+	    wcscat(szShellTitle, L" :sh");
+	else
 	{
-	    if (cmd == NULL)
-		wcscat(szShellTitle, L" :sh");
-	    else
+	    WCHAR *wn = enc_to_utf16((char_u *)cmd, NULL);
+
+	    if (wn != NULL)
 	    {
-		WCHAR *wn = enc_to_utf16((char_u *)cmd, NULL);
-
-		if (wn != NULL)
-		{
-		    wcscat(szShellTitle, L" - !");
-		    if ((wcslen(szShellTitle) + wcslen(wn) <
-					  sizeof(szShellTitle)/sizeof(WCHAR)))
-			wcscat(szShellTitle, wn);
-		    SetConsoleTitleW(szShellTitle);
-		    vim_free(wn);
-		    did_set_title = TRUE;
-		}
+		wcscat(szShellTitle, L" - !");
+		if ((wcslen(szShellTitle) + wcslen(wn) <
+			    sizeof(szShellTitle)/sizeof(WCHAR)))
+		    wcscat(szShellTitle, wn);
+		SetConsoleTitleW(szShellTitle);
+		vim_free(wn);
 	    }
 	}
     }
-    if (!did_set_title)
-	/* Change the title to reflect that we are in a subshell. */
-	if (GetConsoleTitle(szShellTitle, sizeof(szShellTitle) - 4) > 0)
-	{
-	    if (cmd == NULL)
-		strcat(szShellTitle, " :sh");
-	    else
-	    {
-		strcat(szShellTitle, " - !");
-		if ((strlen(szShellTitle) + strlen((char *)cmd)
-			    < sizeof(szShellTitle)))
-		    strcat(szShellTitle, (char *)cmd);
-	    }
-	    SetConsoleTitle(szShellTitle);
-	}
 #endif
 
     out_flush();
@@ -4936,18 +4713,13 @@ mch_call_shell(
 			"External commands will not pause after completion.\n"
 			"See  :help win32-vimrun  for more information.");
 		    char *title = _("Vim Warning");
-		    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-		    {
-			WCHAR *wmsg = enc_to_utf16((char_u *)msg, NULL);
-			WCHAR *wtitle = enc_to_utf16((char_u *)title, NULL);
-
-			if (wmsg != NULL && wtitle != NULL)
-			    MessageBoxW(NULL, wmsg, wtitle, MB_ICONWARNING);
-			vim_free(wmsg);
-			vim_free(wtitle);
-		    }
-		    else
-			MessageBox(NULL, msg, title, MB_ICONWARNING);
+		    WCHAR *wmsg = enc_to_utf16((char_u *)msg, NULL);
+		    WCHAR *wtitle = enc_to_utf16((char_u *)title, NULL);
+
+		    if (wmsg != NULL && wtitle != NULL)
+			MessageBoxW(NULL, wmsg, wtitle, MB_ICONWARNING);
+		    vim_free(wmsg);
+		    vim_free(wtitle);
 		    need_vimrun_warning = FALSE;
 		}
 		if (!s_dont_use_vimrun && p_stmp)
@@ -5011,23 +4783,16 @@ job_io_file_open(
 	DWORD dwFlagsAndAttributes)
 {
     HANDLE h;
-    WCHAR *wn = NULL;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	wn = enc_to_utf16(fname, NULL);
-	if (wn != NULL)
-	{
-	    h = CreateFileW(wn, dwDesiredAccess, dwShareMode,
-		    lpSecurityAttributes, dwCreationDisposition,
-		    dwFlagsAndAttributes, NULL);
-	    vim_free(wn);
-	}
-    }
+    WCHAR *wn;
+
+    wn = enc_to_utf16(fname, NULL);
     if (wn == NULL)
-	h = CreateFile((LPCSTR)fname, dwDesiredAccess, dwShareMode,
-		lpSecurityAttributes, dwCreationDisposition,
-		dwFlagsAndAttributes, NULL);
+	return INVALID_HANDLE_VALUE;
+
+    h = CreateFileW(wn, dwDesiredAccess, dwShareMode,
+	    lpSecurityAttributes, dwCreationDisposition,
+	    dwFlagsAndAttributes, NULL);
+    vim_free(wn);
     return h;
 }
 
@@ -6085,81 +5850,56 @@ write_chars(
     char_u *pchBuf,
     DWORD  cbToWrite)
 {
-    COORD coord = g_coord;
-    DWORD written;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	static WCHAR	*unicodebuf = NULL;
-	static int	unibuflen = 0;
-	int		length;
-	DWORD		n, cchwritten, cells;
-
-	length = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pchBuf, cbToWrite, 0, 0);
-	if (unicodebuf == NULL || length > unibuflen)
-	{
-	    vim_free(unicodebuf);
-	    unicodebuf = (WCHAR *)lalloc(length * sizeof(WCHAR), FALSE);
-	    unibuflen = length;
-	}
-	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pchBuf, cbToWrite,
-			    unicodebuf, unibuflen);
-
-	cells = mb_string2cells(pchBuf, cbToWrite);
-
-	if (!USE_VTP)
-	{
-	    FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, cells,
-					coord, &written);
-	    /* When writing fails or didn't write a single character, pretend one
-	     * character was written, otherwise we get stuck. */
-	    if (WriteConsoleOutputCharacterW(g_hConOut, unicodebuf, length,
-			coord, &cchwritten) == 0
-		    || cchwritten == 0 || cchwritten == (DWORD)-1)
-		cchwritten = 1;
-	}
-	else
-	{
-	    if (WriteConsoleW(g_hConOut, unicodebuf, length, &cchwritten,
-		    NULL) == 0 || cchwritten == 0)
-		cchwritten = 1;
-	}
-
-	if (cchwritten == length)
-	{
-	    written = cbToWrite;
-	    g_coord.X += (SHORT)cells;
-	}
-	else
-	{
-	    char_u *p = pchBuf;
-	    for (n = 0; n < cchwritten; n++)
-		MB_CPTR_ADV(p);
-	    written = p - pchBuf;
-	    g_coord.X += (SHORT)mb_string2cells(pchBuf, written);
-	}
+    COORD	    coord = g_coord;
+    DWORD	    written;
+    DWORD	    n, cchwritten, cells;
+    static WCHAR    *unicodebuf = NULL;
+    static int	    unibuflen = 0;
+    int		    length;
+    int		    cp = enc_utf8 ? CP_UTF8 : enc_codepage;
+
+    length = MultiByteToWideChar(cp, 0, (LPCSTR)pchBuf, cbToWrite, 0, 0);
+    if (unicodebuf == NULL || length > unibuflen)
+    {
+	vim_free(unicodebuf);
+	unicodebuf = (WCHAR *)lalloc(length * sizeof(WCHAR), FALSE);
+	unibuflen = length;
+    }
+    MultiByteToWideChar(cp, 0, (LPCSTR)pchBuf, cbToWrite,
+			unicodebuf, unibuflen);
+
+    cells = mb_string2cells(pchBuf, cbToWrite);
+
+    if (!USE_VTP)
+    {
+	FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, cells,
+				    coord, &written);
+	// When writing fails or didn't write a single character, pretend one
+	// character was written, otherwise we get stuck.
+	if (WriteConsoleOutputCharacterW(g_hConOut, unicodebuf, length,
+		    coord, &cchwritten) == 0
+		|| cchwritten == 0 || cchwritten == (DWORD)-1)
+	    cchwritten = 1;
     }
     else
     {
-	if (!USE_VTP)
-	{
-	    FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, cbToWrite,
-					coord, &written);
-	    /* When writing fails or didn't write a single character, pretend one
-	     * character was written, otherwise we get stuck. */
-	    if (WriteConsoleOutputCharacter(g_hConOut, (LPCSTR)pchBuf, cbToWrite,
-			coord, &written) == 0
-		    || written == 0 || written == (DWORD)-1)
-		written = 1;
-	}
-	else
-	{
-	    if (WriteConsole(g_hConOut, (LPCSTR)pchBuf, cbToWrite, &written,
-		    NULL) == 0 || written == 0)
-		written = 1;
-	}
-
-	g_coord.X += (SHORT) written;
+	if (WriteConsoleW(g_hConOut, unicodebuf, length, &cchwritten,
+		    NULL) == 0 || cchwritten == 0)
+	    cchwritten = 1;
+    }
+
+    if (cchwritten == length)
+    {
+	written = cbToWrite;
+	g_coord.X += (SHORT)cells;
+    }
+    else
+    {
+	char_u *p = pchBuf;
+	for (n = 0; n < cchwritten; n++)
+	    MB_CPTR_ADV(p);
+	written = p - pchBuf;
+	g_coord.X += (SHORT)mb_string2cells(pchBuf, written);
     }
 
     while (g_coord.X > g_srScrollRegion.Right)
@@ -6518,7 +6258,7 @@ mch_delay(
     int
 mch_remove(char_u *name)
 {
-    WCHAR	*wn = NULL;
+    WCHAR	*wn;
     int		n;
 
     /*
@@ -6530,17 +6270,13 @@ mch_remove(char_u *name)
 
     win32_setattrs(name, FILE_ATTRIBUTE_NORMAL);
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	wn = enc_to_utf16(name, NULL);
-	if (wn != NULL)
-	{
-	    n = DeleteFileW(wn) ? 0 : -1;
-	    vim_free(wn);
-	    return n;
-	}
-    }
-    return DeleteFile((LPCSTR)name) ? 0 : -1;
+    wn = enc_to_utf16(name, NULL);
+    if (wn == NULL)
+	return -1;
+
+    n = DeleteFileW(wn) ? 0 : -1;
+    vim_free(wn);
+    return n;
 }
 
 
@@ -6590,62 +6326,7 @@ mch_total_mem(int special UNUSED)
 }
 
 /*
- * Same code as below, but with wide functions and no comments.
- * Return 0 for success, non-zero for failure.
- */
-    int
-mch_wrename(WCHAR *wold, WCHAR *wnew)
-{
-    WCHAR	*p;
-    int		i;
-    WCHAR	szTempFile[_MAX_PATH + 1];
-    WCHAR	szNewPath[_MAX_PATH + 1];
-    HANDLE	hf;
-
-    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;
-    *p = NUL;
-
-    if (GetTempFileNameW(szNewPath, L"VIM", 0, szTempFile) == 0)
-	return -2;
-
-    if (!DeleteFileW(szTempFile))
-	return -3;
-
-    if (!MoveFileW(wold, szTempFile))
-	return -4;
-
-    if ((hf = CreateFileW(wold, GENERIC_WRITE, 0, NULL, CREATE_NEW,
-		    FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
-	return -5;
-    if (!CloseHandle(hf))
-	return -6;
-
-    if (!MoveFileW(szTempFile, wnew))
-    {
-	(void)MoveFileW(szTempFile, wold);
-	return -7;
-    }
-
-    DeleteFileW(szTempFile);
-
-    if (!DeleteFileW(wold))
-	return -8;
-
-    return 0;
-}
-
-
-/*
- * mch_rename() works around a bug in rename (aka MoveFile) in
+ * mch_wrename() works around a bug in rename (aka MoveFile) in
  * Windows 95: rename("foo.bar", "foo.bar~") will generate a
  * file whose short file name is "FOO.BAR" (its long file name will
  * be correct: "foo.bar~").  Because a file can be accessed by
@@ -6664,90 +6345,97 @@ mch_wrename(WCHAR *wold, WCHAR *wnew)
  * Should probably set errno appropriately when errors occur.
  */
     int
-mch_rename(
-    const char	*pszOldFile,
-    const char	*pszNewFile)
-{
-    char	szTempFile[_MAX_PATH+1];
-    char	szNewPath[_MAX_PATH+1];
-    char	*pszFilePart;
+mch_wrename(WCHAR *wold, WCHAR *wnew)
+{
+    WCHAR	*p;
+    int		i;
+    WCHAR	szTempFile[_MAX_PATH + 1];
+    WCHAR	szNewPath[_MAX_PATH + 1];
     HANDLE	hf;
-    WCHAR	*wold = NULL;
-    WCHAR	*wnew = NULL;
-    int		retval = -1;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	wold = enc_to_utf16((char_u *)pszOldFile, NULL);
-	wnew = enc_to_utf16((char_u *)pszNewFile, NULL);
-	if (wold != NULL && wnew != NULL)
-	    retval = mch_wrename(wold, wnew);
-	vim_free(wold);
-	vim_free(wnew);
-	return retval;
-    }
-
-    /*
-     * No need to play tricks unless the file name contains a "~" as the
-     * seventh character.
-     */
-    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. */
-    if (GetFullPathName(pszNewFile, _MAX_PATH, szNewPath, &pszFilePart) == 0
-	    || pszFilePart == NULL)
+
+    // No need to play tricks unless the file name contains a "~" as the
+    // seventh character.
+    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);
+
+    // Get base path of new file name.  Undocumented feature: If pszNewFile is
+    // a directory, no error is returned and pszFilePart will be NULL.
+    if (GetFullPathNameW(wnew, _MAX_PATH, szNewPath, &p) == 0 || p == NULL)
 	return -1;
-    *pszFilePart = NUL;
-
-    /* Get (and create) a unique temporary file name in directory of new file */
-    if (GetTempFileName(szNewPath, "VIM", 0, szTempFile) == 0)
+    *p = NUL;
+
+    // Get (and create) a unique temporary file name in directory of new file
+    if (GetTempFileNameW(szNewPath, L"VIM", 0, szTempFile) == 0)
 	return -2;
 
-    /* blow the temp file away */
-    if (!DeleteFile(szTempFile))
+    // blow the temp file away
+    if (!DeleteFileW(szTempFile))
 	return -3;
 
-    /* rename old file to the temp file */
-    if (!MoveFile(pszOldFile, szTempFile))
+    // rename old file to the temp file
+    if (!MoveFileW(wold, szTempFile))
 	return -4;
 
-    /* now create an empty file called pszOldFile; this prevents the operating
-     * system using pszOldFile as an alias (SFN) if we're renaming within the
-     * same directory.  For example, we're editing a file called
-     * filename.asc.txt by its SFN, filena~1.txt.  If we rename filena~1.txt
-     * to filena~1.txt~ (i.e., we're making a backup while writing it), the
-     * SFN for filena~1.txt~ will be filena~1.txt, by default, which will
-     * cause all sorts of problems later in buf_write().  So, we create an
-     * empty file called filena~1.txt and the system will have to find some
-     * other SFN for filena~1.txt~, such as filena~2.txt
-     */
-    if ((hf = CreateFile(pszOldFile, GENERIC_WRITE, 0, NULL, CREATE_NEW,
+    // now create an empty file called pszOldFile; this prevents the operating
+    // system using pszOldFile as an alias (SFN) if we're renaming within the
+    // same directory.  For example, we're editing a file called
+    // filename.asc.txt by its SFN, filena~1.txt.  If we rename filena~1.txt
+    // to filena~1.txt~ (i.e., we're making a backup while writing it), the
+    // SFN for filena~1.txt~ will be filena~1.txt, by default, which will
+    // cause all sorts of problems later in buf_write().  So, we create an
+    // empty file called filena~1.txt and the system will have to find some
+    // other SFN for filena~1.txt~, such as filena~2.txt
+    if ((hf = CreateFileW(wold, GENERIC_WRITE, 0, NULL, CREATE_NEW,
 		    FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
 	return -5;
     if (!CloseHandle(hf))
 	return -6;
 
-    /* rename the temp file to the new file */
-    if (!MoveFile(szTempFile, pszNewFile))
-    {
-	/* Renaming failed.  Rename the file back to its old name, so that it
-	 * looks like nothing happened. */
-	(void)MoveFile(szTempFile, pszOldFile);
-
+    // rename the temp file to the new file
+    if (!MoveFileW(szTempFile, wnew))
+    {
+	// Renaming failed.  Rename the file back to its old name, so that it
+	// looks like nothing happened.
+	(void)MoveFileW(szTempFile, wold);
 	return -7;
     }
 
-    /* Seems to be left around on Novell filesystems */
-    DeleteFile(szTempFile);
-
-    /* finally, remove the empty old file */
-    if (!DeleteFile(pszOldFile))
+    // Seems to be left around on Novell filesystems
+    DeleteFileW(szTempFile);
+
+    // finally, remove the empty old file
+    if (!DeleteFileW(wold))
 	return -8;
 
-    return 0;	/* success */
+    return 0;
+}
+
+
+/*
+ * Converts the filenames to UTF-16, then call mch_wrename().
+ * Like rename(), returns 0 upon success, non-zero upon failure.
+ */
+    int
+mch_rename(
+    const char	*pszOldFile,
+    const char	*pszNewFile)
+{
+    WCHAR	*wold = NULL;
+    WCHAR	*wnew = NULL;
+    int		retval = -1;
+
+    wold = enc_to_utf16((char_u *)pszOldFile, NULL);
+    wnew = enc_to_utf16((char_u *)pszNewFile, NULL);
+    if (wold != NULL && wnew != NULL)
+	retval = mch_wrename(wold, wnew);
+    vim_free(wold);
+    vim_free(wnew);
+    return retval;
 }
 
 /*
@@ -6768,55 +6456,35 @@ mch_access(char *n, int p)
 {
     HANDLE	hFile;
     int		retval = -1;	    /* default: fail */
-    WCHAR	*wn = NULL;
-
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-	wn = enc_to_utf16((char_u *)n, NULL);
+    WCHAR	*wn;
+
+    wn = enc_to_utf16((char_u *)n, NULL);
+    if (wn == NULL)
+	return -1;
 
     if (mch_isdir((char_u *)n))
     {
-	char TempName[_MAX_PATH + 16] = "";
 	WCHAR TempNameW[_MAX_PATH + 16] = L"";
 
 	if (p & R_OK)
 	{
 	    /* Read check is performed by seeing if we can do a find file on
 	     * the directory for any file. */
-	    if (wn != NULL)
-	    {
-		int		    i;
-		WIN32_FIND_DATAW    d;
-
-		for (i = 0; i < _MAX_PATH && wn[i] != 0; ++i)
-		    TempNameW[i] = wn[i];
-		if (TempNameW[i - 1] != '\\' && TempNameW[i - 1] != '/')
-		    TempNameW[i++] = '\\';
-		TempNameW[i++] = '*';
-		TempNameW[i++] = 0;
-
-		hFile = FindFirstFileW(TempNameW, &d);
-		if (hFile == INVALID_HANDLE_VALUE)
-		    goto getout;
-		else
-		    (void)FindClose(hFile);
-	    }
+	    int			i;
+	    WIN32_FIND_DATAW    d;
+
+	    for (i = 0; i < _MAX_PATH && wn[i] != 0; ++i)
+		TempNameW[i] = wn[i];
+	    if (TempNameW[i - 1] != '\\' && TempNameW[i - 1] != '/')
+		TempNameW[i++] = '\\';
+	    TempNameW[i++] = '*';
+	    TempNameW[i++] = 0;
+
+	    hFile = FindFirstFileW(TempNameW, &d);
+	    if (hFile == INVALID_HANDLE_VALUE)
+		goto getout;
 	    else
-	    {
-		char		    *pch;
-		WIN32_FIND_DATA	    d;
-
-		vim_strncpy((char_u *)TempName, (char_u *)n, _MAX_PATH);
-		pch = TempName + STRLEN(TempName) - 1;
-		if (*pch != '\\' && *pch != '/')
-		    *++pch = '\\';
-		*++pch = '*';
-		*++pch = NUL;
-
-		hFile = FindFirstFile(TempName, &d);
-		if (hFile == INVALID_HANDLE_VALUE)
-		    goto getout;
 		(void)FindClose(hFile);
-	    }
 	}
 
 	if (p & W_OK)
@@ -6825,19 +6493,10 @@ mch_access(char *n, int p)
 	     * directories on read-only network shares.  However, in
 	     * directories whose ACL allows writes but denies deletes will end
 	     * up keeping the temporary file :-(. */
-	    if (wn != NULL)
-	    {
-		if (!GetTempFileNameW(wn, L"VIM", 0, TempNameW))
-		    goto getout;
-		else
-		    DeleteFileW(TempNameW);
-	    }
+	    if (!GetTempFileNameW(wn, L"VIM", 0, TempNameW))
+		goto getout;
 	    else
-	    {
-		if (!GetTempFileName(n, "VIM", 0, TempName))
-		    goto getout;
-		mch_remove((char_u *)TempName);
-	    }
+		DeleteFileW(TempNameW);
 	}
     }
     else
@@ -6850,12 +6509,8 @@ mch_access(char *n, int p)
 	DWORD access_mode = ((p & W_OK) ? GENERIC_WRITE : 0)
 					     | ((p & R_OK) ? GENERIC_READ : 0);
 
-	if (wn != NULL)
-	    hFile = CreateFileW(wn, access_mode, share_mode,
-						 NULL, OPEN_EXISTING, 0, NULL);
-	else
-	    hFile = CreateFile(n, access_mode, share_mode,
-						 NULL, OPEN_EXISTING, 0, NULL);
+	hFile = CreateFileW(wn, access_mode, share_mode,
+					     NULL, OPEN_EXISTING, 0, NULL);
 	if (hFile == INVALID_HANDLE_VALUE)
 	    goto getout;
 	CloseHandle(hFile);
@@ -6878,18 +6533,14 @@ mch_open(const char *name, int flags, in
     WCHAR	*wn;
     int		f;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	wn = enc_to_utf16((char_u *)name, NULL);
-	if (wn != NULL)
-	{
-	    f = _wopen(wn, flags, mode);
-	    vim_free(wn);
-	    return f;
-	}
-    }
-#endif
-
+    wn = enc_to_utf16((char_u *)name, NULL);
+    if (wn == NULL)
+	return -1;
+
+    f = _wopen(wn, flags, mode);
+    vim_free(wn);
+    return f;
+#else
     /* open() can open a file which name is longer than _MAX_PATH bytes
      * and shorter than _MAX_PATH characters successfully, but sometimes it
      * causes unexpected error in another part. We make it an error explicitly
@@ -6898,10 +6549,11 @@ mch_open(const char *name, int flags, in
 	return -1;
 
     return open(name, flags, mode);
+#endif
 }
 
 /*
- * Version of fopen() that may use UTF-16 file name.
+ * Version of fopen() that uses UTF-16 file name.
  */
     FILE *
 mch_fopen(const char *name, const char *mode)
@@ -6909,41 +6561,29 @@ mch_fopen(const char *name, const char *
     WCHAR	*wn, *wm;
     FILE	*f = NULL;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
 #if defined(DEBUG) && _MSC_VER >= 1400
-	/* Work around an annoying assertion in the Microsoft debug CRT
-	 * when mode's text/binary setting doesn't match _get_fmode(). */
-	char newMode = mode[strlen(mode) - 1];
-	int oldMode = 0;
-
-	_get_fmode(&oldMode);
-	if (newMode == 't')
-	    _set_fmode(_O_TEXT);
-	else if (newMode == 'b')
-	    _set_fmode(_O_BINARY);
+    /* Work around an annoying assertion in the Microsoft debug CRT
+     * when mode's text/binary setting doesn't match _get_fmode(). */
+    char newMode = mode[strlen(mode) - 1];
+    int oldMode = 0;
+
+    _get_fmode(&oldMode);
+    if (newMode == 't')
+	_set_fmode(_O_TEXT);
+    else if (newMode == 'b')
+	_set_fmode(_O_BINARY);
 #endif
-	wn = enc_to_utf16((char_u *)name, NULL);
-	wm = enc_to_utf16((char_u *)mode, NULL);
-	if (wn != NULL && wm != NULL)
-	    f = _wfopen(wn, wm);
-	vim_free(wn);
-	vim_free(wm);
+    wn = enc_to_utf16((char_u *)name, NULL);
+    wm = enc_to_utf16((char_u *)mode, NULL);
+    if (wn != NULL && wm != NULL)
+	f = _wfopen(wn, wm);
+    vim_free(wn);
+    vim_free(wm);
 
 #if defined(DEBUG) && _MSC_VER >= 1400
-	_set_fmode(oldMode);
+    _set_fmode(oldMode);
 #endif
-	return f;
-    }
-
-    /* fopen() can open a file which name is longer than _MAX_PATH bytes
-     * and shorter than _MAX_PATH characters successfully, but sometimes it
-     * causes unexpected error in another part. We make it an error explicitly
-     * here. */
-    if (strlen(name) >= _MAX_PATH)
-	return NULL;
-
-    return fopen(name, mode);
+    return f;
 }
 
 /*
@@ -7418,6 +7058,7 @@ fix_arg_enc(void)
 mch_setenv(char *var, char *value, int x)
 {
     char_u	*envbuf;
+    WCHAR	*p;
 
     envbuf = alloc((unsigned)(STRLEN(var) + STRLEN(value) + 2));
     if (envbuf == NULL)
@@ -7425,29 +7066,17 @@ mch_setenv(char *var, char *value, int x
 
     sprintf((char *)envbuf, "%s=%s", var, value);
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
-	WCHAR	    *p = enc_to_utf16(envbuf, NULL);
-
-	vim_free(envbuf);
-	if (p == NULL)
-	    return -1;
-	_wputenv(p);
+    p = enc_to_utf16(envbuf, NULL);
+
+    vim_free(envbuf);
+    if (p == NULL)
+	return -1;
+    _wputenv(p);
 #ifdef libintl_wputenv
-	libintl_wputenv(p);
+    libintl_wputenv(p);
 #endif
-	/* Unlike Un*x systems, we can free the string for _wputenv(). */
-	vim_free(p);
-    }
-    else
-    {
-	_putenv((char *)envbuf);
-#ifdef libintl_putenv
-	libintl_putenv((char *)envbuf);
-#endif
-	/* Unlike Un*x systems, we can free the string for _putenv(). */
-	vim_free(envbuf);
-    }
+    // Unlike Un*x systems, we can free the string for _wputenv().
+    vim_free(p);
 
     return 0;
 }
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1103,
+/**/
     1102,
 /**/
     1101,
--- a/src/vim.h
+++ b/src/vim.h
@@ -536,7 +536,7 @@ extern char *(*dyn_libintl_ngettext)(con
 extern char *(*dyn_libintl_bindtextdomain)(const char *domainname, const char *dirname);
 extern char *(*dyn_libintl_bind_textdomain_codeset)(const char *domainname, const char *codeset);
 extern char *(*dyn_libintl_textdomain)(const char *domainname);
-extern int (*dyn_libintl_putenv)(const char *envstring);
+extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #endif
 
 
@@ -559,7 +559,6 @@ extern int (*dyn_libintl_putenv)(const c
 #   define HAVE_BIND_TEXTDOMAIN_CODESET 1
 #  endif
 #  define textdomain(domain) (*dyn_libintl_textdomain)(domain)
-#  define libintl_putenv(envstring) (*dyn_libintl_putenv)(envstring)
 #  define libintl_wputenv(envstring) (*dyn_libintl_wputenv)(envstring)
 # else
 #  include <libintl.h>