diff -Naur Python-3.8.0-orig/Include/pylifecycle.h Python-3.8.0/Include/pylifecycle.h
--- Python-3.8.0-orig/Include/pylifecycle.h	2019-10-22 10:02:41.276120000 +0300
+++ Python-3.8.0/Include/pylifecycle.h	2019-10-22 10:02:44.427325500 +0300
@@ -53,7 +53,7 @@
 PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void);
 PyAPI_FUNC(wchar_t *) Py_GetPath(void);
 PyAPI_FUNC(void)      Py_SetPath(const wchar_t *);
-#ifdef MS_WINDOWS
+#ifdef _MSC_VER
 int _Py_CheckPython3(void);
 #endif
 
diff -Naur Python-3.8.0-orig/Modules/getpath.c Python-3.8.0/Modules/getpath.c
--- Python-3.8.0-orig/Modules/getpath.c	2019-10-14 16:34:47.000000000 +0300
+++ Python-3.8.0/Modules/getpath.c	2019-10-22 10:02:44.848526300 +0300
@@ -14,6 +14,11 @@
 #  include <mach-o/dyld.h>
 #endif
 
+#ifdef MS_WINDOWS
+#include <windows.h>
+#include <shlwapi.h>
+#endif
+
 /* Search in some common locations for the associated Python libraries.
  *
  * Two directories must be found, the platform independent directory
@@ -132,13 +137,39 @@
     int prefix_found;         /* found platform independent libraries? */
     int exec_prefix_found;    /* found the platform dependent libraries? */
 
+    wchar_t *dll_path;
     int warnings;
     const wchar_t *pythonpath_env;
 } PyCalculatePath;
 
 static const wchar_t delimiter[2] = {DELIM, '\0'};
-static const wchar_t separator[2] = {SEP, '\0'};
+static wchar_t separator[2] = {SEP, '\0'};
 
+static int
+is_sep(wchar_t ch)
+{
+#ifdef _WIN32
+    return ch == SEP || ch == ALTSEP;
+#else
+    return ch == SEP;
+#endif
+}
+
+static int
+is_absolute(const wchar_t *path)
+{
+#ifdef _WIN32
+    size_t i = wcslen(path);
+    if (i >= 3) {
+        if (iswalpha(path[0]) && path[1] == L':' && is_sep(path[2])) {
+            return 1;
+        }
+    }
+    return 0;
+#else
+    return path[0] == SEP;
+#endif
+}
 
 /* Get file status. Encode the path to the locale encoding. */
 static int
@@ -161,7 +192,7 @@
 reduce(wchar_t *dir)
 {
     size_t i = wcslen(dir);
-    while (i > 0 && dir[i] != SEP) {
+    while (i > 0 && !is_sep(dir[i])) {
         --i;
     }
     dir[i] = '\0';
@@ -241,14 +272,14 @@
 joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen)
 {
     size_t n, k;
-    if (stuff[0] != SEP) {
+    if (!is_sep(stuff[0])) {
         n = wcslen(buffer);
         if (n >= buflen) {
             return PATHLEN_ERR();
         }
 
-        if (n > 0 && buffer[n-1] != SEP) {
-            buffer[n++] = SEP;
+        if (n > 0 && !is_sep(buffer[n-1]) != SEP) {
+            buffer[n++] = Py_GetSepW(buffer);
         }
     }
     else {
@@ -284,7 +315,7 @@
 static PyStatus
 copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen)
 {
-    if (p[0] == SEP) {
+    if (is_absolute(p)) {
         if (safe_wcscpy(path, p, pathlen) < 0) {
             return PATHLEN_ERR();
         }
@@ -297,7 +328,7 @@
             }
             return _PyStatus_OK();
         }
-        if (p[0] == '.' && p[1] == SEP) {
+        if (p[0] == '.' && is_sep(p[1])) {
             p += 2;
         }
         PyStatus status = joinpath(path, p, pathlen);
@@ -313,7 +344,7 @@
 static PyStatus
 absolutize(wchar_t *path, size_t path_len)
 {
-    if (path[0] == SEP) {
+    if (is_absolute(path)) {
         return _PyStatus_OK();
     }
 
@@ -403,6 +434,7 @@
         return status;
     }
 
+    Py_NormalizeSepsW(path);
     if (isfile(path)) {
         /* Check VPATH to see if argv0_path is in the build directory.
            VPATH can be empty. */
@@ -427,6 +459,7 @@
                 return status;
             }
 
+            Py_NormalizeSepsW(prefix);
             if (ismodule(prefix, prefix_len)) {
                 *found = -1;
                 reduce(prefix);
@@ -529,12 +562,21 @@
      * return the compiled-in defaults instead.
      */
     if (calculate->prefix_found > 0) {
+#ifdef _WIN32
+        wchar_t drive_root[3];
+        memset(drive_root, 0, sizeof(drive_root));
+        wcsncpy(drive_root, prefix, 3);
+#endif
         reduce(prefix);
         reduce(prefix);
         /* The prefix is the root directory, but reduce() chopped
          * off the "/". */
         if (!prefix[0]) {
+#ifdef _WIN32
+            wcsncpy(prefix, drive_root, 3);
+#else
             wcscpy(prefix, separator);
+#endif
         }
         pathconfig->prefix = _PyMem_RawWcsdup(prefix);
     }
@@ -649,6 +691,7 @@
 
     /* Check for pybuilddir.txt */
     assert(*found == 0);
+    Py_NormalizeSepsW(exec_prefix);
     status = calculate_pybuilddir(argv0_path, exec_prefix, exec_prefix_len,
                                   found);
     if (_PyStatus_EXCEPTION(status)) {
@@ -734,6 +777,7 @@
         if (_PyStatus_EXCEPTION(status)) {
             return status;
         }
+        Py_NormalizeSepsW(exec_prefix);
     }
     /* If we found EXEC_PREFIX do *not* reduce it!  (Yet.) */
     return _PyStatus_OK();
@@ -746,11 +790,20 @@
                           wchar_t *exec_prefix)
 {
     if (calculate->exec_prefix_found > 0) {
+#ifdef _WIN32
+        wchar_t drive_root[3];
+        memset(drive_root, 0, sizeof(drive_root));
+        wcsncpy(drive_root, exec_prefix, 3);
+#endif
         reduce(exec_prefix);
         reduce(exec_prefix);
         reduce(exec_prefix);
         if (!exec_prefix[0]) {
+#ifdef _WIN32
+            wcsncpy(exec_prefix, drive_root, 3);
+#else
             wcscpy(exec_prefix, separator);
+#endif
         }
 
         pathconfig->exec_prefix = _PyMem_RawWcsdup(exec_prefix);
@@ -767,6 +820,48 @@
 }
 
 
+#ifdef MS_WINDOWS
+static int
+GetWindowsModulePaths(wchar_t *progpath)
+{
+    int result = 0;
+    wchar_t program_full_path[MAXPATHLEN+1];
+    memset(program_full_path, 0, sizeof(program_full_path));
+
+    if (GetModuleFileNameW(NULL, program_full_path, MAXPATHLEN)) {
+        result = 1;
+        Py_NormalizeSepsW(program_full_path);
+    }
+
+    wcscpy(progpath, program_full_path);
+    return result;
+}
+
+
+wchar_t*
+_Py_GetDLLPath(void)
+{
+    wchar_t dll_path[MAXPATHLEN+1];
+    memset(dll_path, 0, sizeof(dll_path));
+
+#ifdef Py_ENABLE_SHARED
+    extern HANDLE PyWin_DLLhModule;
+    if (PyWin_DLLhModule) {
+        if (GetModuleFileNameW(PyWin_DLLhModule, dll_path, MAXPATHLEN)) {
+            Py_NormalizeSepsW(dll_path);
+        } else {
+            dll_path[0] = 0;
+        }
+    }
+#else
+    dll_path[0] = 0;
+#endif
+
+    return _PyMem_RawWcsdup(dll_path);
+}
+#endif /* MS_WINDOWS */
+
+
 static PyStatus
 calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig)
 {
@@ -789,7 +884,7 @@
      * other way to find a directory to start the search from.  If
      * $PATH isn't exported, you lose.
      */
-    if (wcschr(pathconfig->program_name, SEP)) {
+    if (wcschr(pathconfig->program_name, Py_GetSepW(pathconfig->program_name))) {
         if (safe_wcscpy(program_full_path, pathconfig->program_name,
                         program_full_path_len) < 0) {
             return PATHLEN_ERR();
@@ -821,6 +916,10 @@
         PyMem_RawFree(path);
     }
 #endif /* __APPLE__ */
+#ifdef MS_WINDOWS
+    else if(GetWindowsModulePaths(program_full_path)) {
+    }
+#endif /* MS_WINDOWS */
     else if (calculate->path_env) {
         wchar_t *path = calculate->path_env;
         while (1) {
@@ -861,7 +960,7 @@
     else {
         program_full_path[0] = '\0';
     }
-    if (program_full_path[0] != SEP && program_full_path[0] != '\0') {
+    if (!is_absolute(program_full_path)) {
         status = absolutize(program_full_path, program_full_path_len);
         if (_PyStatus_EXCEPTION(status)) {
             return status;
@@ -1071,6 +1170,7 @@
     if (_PyStatus_EXCEPTION(status)) {
         return status;
     }
+    Py_NormalizeSepsW(zip_path);
 
     /* Replace "00" with version */
     size_t bufsz = wcslen(zip_path);
@@ -1098,7 +1198,7 @@
     while (1) {
         wchar_t *delim = wcschr(defpath, DELIM);
 
-        if (defpath[0] != SEP) {
+        if (!is_absolute(defpath)) {
             /* Paths are relative to prefix */
             bufsz += prefixsz;
         }
@@ -1115,6 +1215,11 @@
 
     bufsz += wcslen(zip_path) + 1;
     bufsz += wcslen(exec_prefix) + 1;
+#ifdef MS_WINDOWS
+    if (is_absolute(prefix)) {
+        bufsz += wcslen(prefix) + 1;
+    }
+#endif
 
     /* Allocate the buffer */
     wchar_t *buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t));
@@ -1140,9 +1245,9 @@
     while (1) {
         wchar_t *delim = wcschr(defpath, DELIM);
 
-        if (defpath[0] != SEP) {
+        if (!is_absolute(defpath)) {
             wcscat(buf, prefix);
-            if (prefixsz >= 2 && prefix[prefixsz - 2] != SEP &&
+            if (prefixsz >= 2 && !is_sep(prefix[prefixsz - 2]) &&
                 defpath[0] != (delim ? DELIM : L'\0'))
             {
                 /* not empty */
@@ -1163,6 +1268,12 @@
         defpath = delim + 1;
     }
     wcscat(buf, delimiter);
+#ifdef MS_WINDOWS
+    if (is_absolute(prefix)) {
+        wcscat(buf, prefix);
+        wcscat(buf, delimiter);
+    }
+#endif
 
     /* Finally, on goes the directory for dynamic-load modules */
     wcscat(buf, exec_prefix);
@@ -1188,16 +1299,20 @@
     if (!calculate->pythonpath) {
         return DECODE_LOCALE_ERR("PYTHONPATH define", len);
     }
+    Py_NormalizeSepsW(calculate->pythonpath);
 
     calculate->prefix = Py_DecodeLocale(PREFIX, &len);
     if (!calculate->prefix) {
         return DECODE_LOCALE_ERR("PREFIX define", len);
     }
+    Py_NormalizeSepsW(calculate->prefix);
     calculate->exec_prefix = Py_DecodeLocale(EXEC_PREFIX, &len);
     if (!calculate->exec_prefix) {
         return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
     }
-    calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len);
+    Py_NormalizeSepsW(calculate->exec_prefix);
+    const char *lib_python_VERSION = (Py_GetSepW(NULL) == L'/') ? "lib/python" VERSION : "lib\\python" VERSION;
+    calculate->lib_python = Py_DecodeLocale(lib_python_VERSION, &len);
     if (!calculate->lib_python) {
         return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
     }
@@ -1215,6 +1330,7 @@
     PyMem_RawFree(calculate->pythonpath);
     PyMem_RawFree(calculate->prefix);
     PyMem_RawFree(calculate->exec_prefix);
+    PyMem_RawFree(calculate->dll_path);
     PyMem_RawFree(calculate->lib_python);
     PyMem_RawFree(calculate->path_env);
 }
@@ -1225,6 +1341,8 @@
 {
     PyStatus status;
 
+    calculate->dll_path = _Py_GetDLLPath();
+
     if (pathconfig->program_full_path == NULL) {
         status = calculate_program_full_path(calculate, pathconfig);
         if (_PyStatus_EXCEPTION(status)) {
@@ -1343,6 +1461,7 @@
 {
     PyStatus status;
     PyCalculatePath calculate;
+    separator[0] = Py_GetSepW(NULL);
     memset(&calculate, 0, sizeof(calculate));
 
     status = calculate_init(&calculate, config);
diff -Naur Python-3.8.0-orig/Modules/posixmodule.c Python-3.8.0/Modules/posixmodule.c
--- Python-3.8.0-orig/Modules/posixmodule.c	2019-10-22 10:02:42.087321400 +0300
+++ Python-3.8.0/Modules/posixmodule.c	2019-10-22 10:02:45.238527000 +0300
@@ -3691,7 +3691,7 @@
         Py_END_ALLOW_THREADS
         /* FindNextFile sets error to ERROR_NO_MORE_FILES if
            it got to the end of the directory. */
-        if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
+        if (!result && GetLastError() != 0 && GetLastError() != ERROR_NO_MORE_FILES) {
             Py_DECREF(list);
             list = path_error(path);
             goto exit;
diff -Naur Python-3.8.4-orig/Python/dynload_win.c Python-3.8.4/Python/dynload_win.c
--- Python-3.8.4-orig/Python/dynload_win.c	2019-10-22 10:01:24.710185500 +0300
+++ Python-3.8.4/Python/dynload_win.c	2019-10-22 10:02:45.644127700 +0300
@@ -180,7 +180,9 @@
     char funcname[258], *import_python;
     const wchar_t *wpathname;
 
+#if defined(_MSC_VER)
     _Py_CheckPython3();
+#endif
 
     wpathname = _PyUnicode_AsUnicode(pathname);
     if (wpathname == NULL)
