ole32: Return the correct error in FileLockBytesImpl_*LockRegion*().

Francois Gouget fgouget at free.fr
Mon Jun 16 11:25:55 CDT 2014


---

This fixes Wine on FreeBSD, that is after this patch it can create a 
.wine prefix again. See bug 36745 for details.

 dlls/ole32/filelockbytes.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/dlls/ole32/filelockbytes.c b/dlls/ole32/filelockbytes.c
index 1c8c938..2af4194 100644
--- a/dlls/ole32/filelockbytes.c
+++ b/dlls/ole32/filelockbytes.c
@@ -313,6 +313,18 @@ static HRESULT WINAPI FileLockBytesImpl_SetSize(ILockBytes* iface, ULARGE_INTEGE
     return hr;
 }
 
+static HRESULT get_lock_error(void)
+{
+    switch (GetLastError())
+    {
+    case ERROR_ACCESS_DENIED: return STG_E_ACCESSDENIED; break;
+    case ERROR_NOT_SUPPORTED: return STG_E_INVALIDFUNCTION; break;
+    default:
+        FIXME("no mapping for error %d\n", GetLastError());
+        return STG_E_INVALIDFUNCTION;
+    }
+}
+
 static HRESULT WINAPI FileLockBytesImpl_LockRegion(ILockBytes* iface,
     ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
 {
@@ -334,8 +346,7 @@ static HRESULT WINAPI FileLockBytesImpl_LockRegion(ILockBytes* iface,
 
     if (LockFileEx(This->hfile, lock_flags, 0, cb.u.LowPart, cb.u.HighPart, &ol))
         return S_OK;
-    else
-        return STG_E_ACCESSDENIED;
+    return get_lock_error();
 }
 
 HRESULT FileLockBytesImpl_LockRegionSync(ILockBytes* iface,
@@ -353,8 +364,7 @@ HRESULT FileLockBytesImpl_LockRegionSync(ILockBytes* iface,
 
     if (LockFileEx(This->hfile, LOCKFILE_EXCLUSIVE_LOCK, 0, cb.u.LowPart, cb.u.HighPart, &ol))
         return S_OK;
-    else
-        return STG_E_ACCESSDENIED;
+    return get_lock_error();
 }
 
 static HRESULT WINAPI FileLockBytesImpl_UnlockRegion(ILockBytes* iface,
@@ -374,8 +384,7 @@ static HRESULT WINAPI FileLockBytesImpl_UnlockRegion(ILockBytes* iface,
 
     if (UnlockFileEx(This->hfile, 0, cb.u.LowPart, cb.u.HighPart, &ol))
         return S_OK;
-    else
-        return STG_E_ACCESSDENIED;
+    return get_lock_error();
 }
 
 static HRESULT WINAPI FileLockBytesImpl_Stat(ILockBytes* iface,
-- 
2.0.0



More information about the wine-patches mailing list