New functions for extension writers on Windows:
 PyErr_SetExcFromWindowsErr(), PyErr_SetExcFromWindowsErrWithFilename().

Similar to PyErr_SetFromWindowsErrWithFilename() and
PyErr_SetFromWindowsErr(), but they allow to specify
the exception type to raise. Available on Windows.

See SF patch #576458.
diff --git a/Python/errors.c b/Python/errors.c
index f744ad4..61d1df0 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -337,7 +337,8 @@
 
 #ifdef MS_WINDOWS 
 /* Windows specific error code handling */
-PyObject *PyErr_SetFromWindowsErrWithFilename(
+PyObject *PyErr_SetExcFromWindowsErrWithFilename(
+	PyObject *exc,
 	int ierr,
 	const char *filename)
 {
@@ -366,16 +367,29 @@
 	else
 		v = Py_BuildValue("(is)", err, s);
 	if (v != NULL) {
-		PyErr_SetObject(PyExc_WindowsError, v);
+		PyErr_SetObject(exc, v);
 		Py_DECREF(v);
 	}
 	LocalFree(s);
 	return NULL;
 }
 
+PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
+{
+	return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
+}
+
 PyObject *PyErr_SetFromWindowsErr(int ierr)
 {
-	return PyErr_SetFromWindowsErrWithFilename(ierr, NULL);
+	return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
+						      ierr, NULL);
+}
+PyObject *PyErr_SetFromWindowsErrWithFilename(
+	int ierr,
+	const char *filename)
+{
+	return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
+						      ierr, filename);
 }
 #endif /* MS_WINDOWS */