Issue #23524: Change back to using Windows errors for _Py_fstat instead of the errno shim.
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index ab9eb8c..0f226ea 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -182,7 +182,13 @@
 {
 #if defined(HAVE_FSTAT) || defined(MS_WINDOWS)
     struct _Py_stat_struct buf;
-    if (_Py_fstat(fd, &buf) < 0 && errno == EBADF) {
+    if (_Py_fstat(fd, &buf) < 0 &&
+#ifdef MS_WINDOWS
+        GetLastError() == ERROR_INVALID_HANDLE
+#else
+        errno == EBADF
+#endif
+        ) {
         PyObject *exc;
         char *msg = strerror(EBADF);
         exc = PyObject_CallFunction(PyExc_OSError, "(is)",
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 598bc8a..3ad8ebb 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -560,7 +560,7 @@
             }
 
             if (_Py_fstat(fd, &st) != 0) {
-                PyErr_SetFromErrno(PyExc_OSError);
+                PyErr_SetExcFromWindowsErr(PyExc_OSError, GetLastError());
                 return NULL;
             }
 
diff --git a/Python/fileutils.c b/Python/fileutils.c
index c0dbc86..6502823 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -637,10 +637,14 @@
     else
         h = (HANDLE)_get_osfhandle(fd);
 
+    /* Protocol violation: we explicitly clear errno, instead of
+       setting it to a POSIX error. Callers should use GetLastError. */
     errno = 0;
 
     if (h == INVALID_HANDLE_VALUE) {
-        errno = EBADF;
+        /* This is really a C library error (invalid file handle).
+           We set the Win32 error to the closes one matching. */
+        SetLastError(ERROR_INVALID_HANDLE);
         return -1;
     }
     memset(result, 0, sizeof(*result));
@@ -649,7 +653,6 @@
     if (type == FILE_TYPE_UNKNOWN) {
         DWORD error = GetLastError();
         if (error != 0) {
-            errno = EINVAL;
             return -1;
         }
         /* else: valid but unknown file */
@@ -664,7 +667,6 @@
     }
 
     if (!GetFileInformationByHandle(h, &info)) {
-        errno = EINVAL;
         return -1;
     }