diff --git a/compat/mingw.c b/compat/mingw.c index d420431b1de8c3..833aa5cec326c3 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -952,11 +952,28 @@ char *mingw_getcwd(char *pointer, int len) { int i; wchar_t cwd[MAX_PATH], wpointer[MAX_PATH]; + DECLARE_PROC_ADDR(kernel32.dll, DWORD, GetFinalPathNameByHandleW, + HANDLE, LPWSTR, DWORD, DWORD); DWORD ret = GetCurrentDirectoryW(ARRAY_SIZE(cwd), cwd); if (ret < 0 || ret >= ARRAY_SIZE(cwd)) return NULL; ret = GetLongPathNameW(cwd, wpointer, ARRAY_SIZE(wpointer)); + if (!ret && GetLastError() == ERROR_ACCESS_DENIED && + INIT_PROC_ADDR(GetFinalPathNameByHandleW)) { + HANDLE hnd = CreateFileW(cwd, 0, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (hnd == INVALID_HANDLE_VALUE) + return NULL; + ret = GetFinalPathNameByHandleW(hnd, wpointer, ARRAY_SIZE(wpointer), 0); + CloseHandle(hnd); + if (!ret || ret >= ARRAY_SIZE(wpointer)) + return NULL; + if (xwcstoutf(pointer, normalize_ntpath(wpointer), len) < 0) + return NULL; + return pointer; + } if (!ret || ret >= ARRAY_SIZE(wpointer)) return NULL; if (xwcstoutf(pointer, wpointer, len) < 0)