diff --git a/core/libs/prx/libc/src/FileLock.cpp b/core/libs/prx/libc/src/FileLock.cpp index 1ed227981..40efecd96 100644 --- a/core/libs/prx/libc/src/FileLock.cpp +++ b/core/libs/prx/libc/src/FileLock.cpp @@ -15,6 +15,8 @@ constexpr int LockShared = 1; constexpr int LockExclusive = 2; constexpr int LockNonblocking = 4; constexpr int LockUnlock = 8; +constexpr DWORD LockByteLow = 0xFFFFFFFE; +constexpr DWORD LockByteHigh = 0x7FFFFFFF; struct LockState { std::mutex mutex; @@ -55,14 +57,18 @@ int GuestFileLock_nid_no_patch(int fd, int operation) { if (state->mode == mode) return 0; if (state->mode != 0) { OVERLAPPED overlapped{}; - if (!::UnlockFileEx(handle, 0, MAXDWORD, MAXDWORD, &overlapped)) return -1; + overlapped.Offset = LockByteLow; + overlapped.OffsetHigh = LockByteHigh; + if (!::UnlockFileEx(handle, 0, 1, 0, &overlapped)) return -1; state->mode = 0; } if (mode == LockUnlock) return 0; DWORD flags = mode == LockExclusive ? LOCKFILE_EXCLUSIVE_LOCK : 0; if (operation & LockNonblocking) flags |= LOCKFILE_FAIL_IMMEDIATELY; OVERLAPPED overlapped{}; - if (!::LockFileEx(handle, flags, 0, MAXDWORD, MAXDWORD, &overlapped)) return -1; + overlapped.Offset = LockByteLow; + overlapped.OffsetHigh = LockByteHigh; + if (!::LockFileEx(handle, flags, 0, 1, 0, &overlapped)) return -1; state->mode = mode; return 0; }