Module: wine Branch: master Commit: 2a98f9b0b0cbefbe360098417e4391c7a2c6eabd URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a98f9b0b0cbefbe360098417e...
Author: Dmitry Timoshkov dmitry@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);