Dmitry Timoshkov : kernel32: Make GetModuleFileName set ERROR_INSUFFICIENT_BUFFER like win2k3 and vista do .

Alexandre Julliard julliard at winehq.org
Wed Jun 18 12:55:42 CDT 2008


Module: wine
Branch: master
Commit: 2a98f9b0b0cbefbe360098417e4391c7a2c6eabd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2a98f9b0b0cbefbe360098417e4391c7a2c6eabd

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Wed Jun 18 12:35:03 2008 +0900

kernel32: Make GetModuleFileName set ERROR_INSUFFICIENT_BUFFER like win2k3 and vista do.

---

 dlls/kernel32/module.c  |   10 ++++++++--
 dlls/user32/tests/win.c |   17 ++++++++---------
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index e233c85..86675b6 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -608,7 +608,10 @@ DWORD WINAPI GetModuleFileNameA(
     if ((len = GetModuleFileNameW( hModule, filenameW, size )))
     {
     	len = FILE_name_WtoA( filenameW, len, lpFileName, size );
-        if (len < size) lpFileName[len] = '\0';
+        if (len < size)
+            lpFileName[len] = '\0';
+        else
+            SetLastError( ERROR_INSUFFICIENT_BUFFER );
     }
     HeapFree( GetProcessHeap(), 0, filenameW );
     return len;
@@ -642,7 +645,10 @@ DWORD WINAPI GetModuleFileNameW( HMODULE hModule, LPWSTR lpFileName, DWORD size
     {
         len = min(size, pldr->FullDllName.Length / sizeof(WCHAR));
         memcpy(lpFileName, pldr->FullDllName.Buffer, len * sizeof(WCHAR));
-        if (len < size) lpFileName[len] = '\0';
+        if (len < size)
+            lpFileName[len] = '\0';
+        else
+            SetLastError( ERROR_INSUFFICIENT_BUFFER );
     }
     else SetLastError( RtlNtStatusToDosError( nts ) );
 
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index e8368d6..68d5530 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -4657,33 +4657,32 @@ static void test_GetWindowModuleFileName(void)
 
     hinst = GetModuleHandle(0);
 
-    /* MSDN mentions ERROR_INSUFFICIENT_BUFFER, but XP doesn't do it */
     SetLastError(0xdeadbeef);
     ret2 = GetModuleFileName(hinst, buf2, ret1 - 2);
     ok(ret2 == ret1 - 2, "expected %u, got %u\n", ret1 - 2, ret2);
-    ok(GetLastError() == 0xdeadbeef ||
-       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3 */
+    ok(GetLastError() == 0xdeadbeef /* XP */ ||
+       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3, vista */
        "expected 0xdeadbeef or ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ret2 = GetModuleFileName(hinst, buf2, 0);
     ok(!ret2, "GetModuleFileName should return 0\n");
-    ok(GetLastError() == 0xdeadbeef ||
-       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3 */
+    ok(GetLastError() == 0xdeadbeef /* XP */ ||
+       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3, vista */
        "expected 0xdeadbeef or ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ret2 = pGetWindowModuleFileNameA(hwnd, buf2, ret1 - 2);
     ok(ret2 == ret1 - 2, "expected %u, got %u\n", ret1 - 2, ret2);
-    ok(GetLastError() == 0xdeadbeef ||
-       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3 */
+    ok(GetLastError() == 0xdeadbeef /* XP */ ||
+       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3, vista */
        "expected 0xdeadbeef or ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
 
     SetLastError(0xdeadbeef);
     ret2 = pGetWindowModuleFileNameA(hwnd, buf2, 0);
     ok(!ret2, "expected 0, got %u\n", ret2);
-    ok(GetLastError() == 0xdeadbeef ||
-       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3 */
+    ok(GetLastError() == 0xdeadbeef /* XP */ ||
+       GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3, vista */
        "expected 0xdeadbeef or ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
 
     DestroyWindow(hwnd);




More information about the wine-cvs mailing list