Added wide char api variants of getch and putch to msvcrt module. The wide char methods are required to fix #1578 in py3k. I figured out that they might be useful in 2.6, too.
diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
index 3311bd7..982c458 100755
--- a/PC/msvcrtmodule.c
+++ b/PC/msvcrtmodule.c
@@ -144,6 +144,22 @@
 }
 
 static PyObject *
+msvcrt_getwch(PyObject *self, PyObject *args)
+{
+	Py_UNICODE ch;
+	Py_UNICODE u[1];
+
+	if (!PyArg_ParseTuple(args, ":getwch"))
+		return NULL;
+
+	Py_BEGIN_ALLOW_THREADS
+	ch = _getwch();
+	Py_END_ALLOW_THREADS
+	u[0] = ch;
+	return PyUnicode_FromUnicode(u, 1);
+}
+
+static PyObject *
 msvcrt_getche(PyObject *self, PyObject *args)
 {
 	int ch;
@@ -160,6 +176,22 @@
 }
 
 static PyObject *
+msvcrt_getwche(PyObject *self, PyObject *args)
+{
+	Py_UNICODE ch;
+	Py_UNICODE s[1];
+
+	if (!PyArg_ParseTuple(args, ":getwche"))
+		return NULL;
+
+	Py_BEGIN_ALLOW_THREADS
+	ch = _getwche();
+	Py_END_ALLOW_THREADS
+	s[0] = ch;
+	return PyUnicode_FromUnicode(s, 1);
+}
+
+static PyObject *
 msvcrt_putch(PyObject *self, PyObject *args)
 {
 	char ch;
@@ -172,6 +204,25 @@
 	return Py_None;
 }
 
+
+static PyObject *
+msvcrt_putwch(PyObject *self, PyObject *args)
+{
+	Py_UNICODE *ch;
+	int size;
+
+	if (!PyArg_ParseTuple(args, "u#:putwch", &ch, &size))
+		return NULL;
+
+	if (size == 1)
+		_putwch(*ch);
+		Py_RETURN_NONE;
+	else {
+		PyErr_SetString(PyExc_ValueError,
+			"Expected unicode of length 1");
+	}
+}
+
 static PyObject *
 msvcrt_ungetch(PyObject *self, PyObject *args)
 {
@@ -186,6 +237,19 @@
 	return Py_None;
 }
 
+static PyObject *
+msvcrt_ungetwch(PyObject *self, PyObject *args)
+{
+	Py_UNICODE ch;
+
+	if (!PyArg_ParseTuple(args, "u:ungetwch", &ch))
+		return NULL;
+
+	if (_ungetch(ch) == EOF)
+		return PyErr_SetFromErrno(PyExc_IOError);
+	Py_INCREF(Py_None);
+	return Py_None;
+}
 
 static void
 insertint(PyObject *d, char *name, int value)
@@ -214,6 +278,11 @@
 	{"getche",		msvcrt_getche, METH_VARARGS},
 	{"putch",		msvcrt_putch, METH_VARARGS},
 	{"ungetch",		msvcrt_ungetch, METH_VARARGS},
+	{"getwch",		msvcrt_getwch, METH_VARARGS},
+	{"getwche",		msvcrt_getwche, METH_VARARGS},
+	{"putwch",		msvcrt_putwch, METH_VARARGS},
+	{"ungetwch",		msvcrt_ungetwch, METH_VARARGS},
+
 	{NULL,			NULL}
 };