Index: Lib/test/test_os.py =================================================================== --- Lib/test/test_os.py (revision 86850) +++ Lib/test/test_os.py (working copy) @@ -887,6 +887,11 @@ self._test_link(bytes(self.file1, sys.getfilesystemencoding()), bytes(self.file2, sys.getfilesystemencoding())) + def test_mbcs_name(self): + self.file1 += "\u65e5\u672c" + self.file2 = self.file1 + "2" + self._test_link(self.file1, self.file2) + if sys.platform != 'win32': class Win32ErrorTests(unittest.TestCase): pass Index: Modules/posixmodule.c =================================================================== --- Modules/posixmodule.c (revision 86850) +++ Modules/posixmodule.c (working copy) @@ -2252,6 +2252,22 @@ char *src, *dst; BOOL rslt; + PyUnicodeObject *usrc, *udst; + if (PyArg_ParseTuple(args, "UU:link", &usrc, &udst)) { + Py_BEGIN_ALLOW_THREADS + rslt = CreateHardLinkW(PyUnicode_AS_UNICODE(udst), + PyUnicode_AS_UNICODE(usrc), NULL); + Py_END_ALLOW_THREADS + + if (rslt == 0) + return posix_error(); + + Py_RETURN_NONE; + } + + /* Narrow strings also valid. */ + PyErr_Clear(); + if (!PyArg_ParseTuple(args, "O&O&:link", PyUnicode_FSConverter, &osrc, PyUnicode_FSConverter, &odst)) return NULL; @@ -2260,7 +2276,7 @@ dst = PyBytes_AsString(odst); Py_BEGIN_ALLOW_THREADS - rslt = CreateHardLink(dst, src, NULL); + rslt = CreateHardLinkA(dst, src, NULL); Py_END_ALLOW_THREADS Py_DECREF(osrc);