[PATCH] psapi: implement GetProcessImageNameW
Mikołaj Zalewski
mikolaj at zalewski.pl
Mon Apr 6 15:32:33 CDT 2009
---
dlls/psapi/psapi_main.c | 7 +++-
dlls/psapi/tests/psapi_main.c | 70 ++++++++++++++++++++++++++++++----------
2 files changed, 57 insertions(+), 20 deletions(-)
diff --git a/dlls/psapi/psapi_main.c b/dlls/psapi/psapi_main.c
index 72484dc..61ba8de 100644
--- a/dlls/psapi/psapi_main.c
+++ b/dlls/psapi/psapi_main.c
@@ -507,8 +507,11 @@ DWORD WINAPI GetProcessImageFileNameA( HANDLE process, LPSTR file, DWORD size )
*/
DWORD WINAPI GetProcessImageFileNameW( HANDLE process, LPWSTR file, DWORD size )
{
- FIXME("(%p, %p, %d) stub\n", process, file, size );
- return 0;
+ BOOL success = QueryFullProcessImageNameW(process, PROCESS_NAME_NATIVE, file, &size);
+ if (success)
+ return size;
+ else
+ return 0;
}
/***********************************************************************
diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c
index 4cee7c6..be350b9 100644
--- a/dlls/psapi/tests/psapi_main.c
+++ b/dlls/psapi/tests/psapi_main.c
@@ -21,10 +21,17 @@
#include <stdarg.h>
#include <stdio.h>
-#include "wine/test.h"
#include "windows.h"
+#include "wine/test.h"
#include "psapi.h"
+#define expect_eq_d(expected, actual) \
+ do { \
+ int value = (actual); \
+ ok((expected) == value, "Expected " #actual " to be %d (" #expected ") is %d\n", \
+ (expected), value); \
+ } while (0)
+
#define PSAPI_GET_PROC(func) \
p ## func = (void*)GetProcAddress(hpsapi, #func); \
if(!p ## func) { \
@@ -63,6 +70,7 @@ static DWORD (WINAPI *pGetModuleFileNameExA)(HANDLE, HMODULE, LPSTR, DWORD);
static BOOL (WINAPI *pGetModuleInformation)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
static DWORD (WINAPI *pGetMappedFileNameA)(HANDLE, LPVOID, LPSTR, DWORD);
static DWORD (WINAPI *pGetProcessImageFileNameA)(HANDLE, LPSTR, DWORD);
+static DWORD (WINAPI *pGetProcessImageFileNameW)(HANDLE, LPWSTR, DWORD);
static BOOL (WINAPI *pGetProcessMemoryInfo)(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);
static BOOL (WINAPI *pGetWsChanges)(HANDLE, PPSAPI_WS_WATCH_INFORMATION, DWORD);
static BOOL (WINAPI *pInitializeProcessForWsWatch)(HANDLE);
@@ -84,6 +92,8 @@ static BOOL InitFunctionPtrs(HMODULE hpsapi)
/* GetProcessImageFileName is not exported on NT4 */
pGetProcessImageFileNameA =
(void *)GetProcAddress(hpsapi, "GetProcessImageFileNameA");
+ pGetProcessImageFileNameW =
+ (void *)GetProcAddress(hpsapi, "GetProcessImageFileNameW");
return TRUE;
}
@@ -166,6 +176,7 @@ static void test_GetProcessImageFileName(void)
{
HMODULE hMod = GetModuleHandle(NULL);
char szImgPath[MAX_PATH], szMapPath[MAX_PATH];
+ WCHAR szImgPathW[MAX_PATH];
DWORD ret;
if(pGetProcessImageFileNameA == NULL)
@@ -175,26 +186,49 @@ static void test_GetProcessImageFileName(void)
SetLastError(0xdeadbeef);
if(!pGetProcessImageFileNameA(hpQI, szImgPath, sizeof(szImgPath)))
{
- if(GetLastError() == ERROR_INVALID_FUNCTION)
+ if(GetLastError() == ERROR_INVALID_FUNCTION) {
win_skip("GetProcessImageFileName not implemented\n");
- else if(GetLastError() == 0xdeadbeef)
- ok(0, "failed without error code\n");
+ return;
+ }
+
+ if(GetLastError() == 0xdeadbeef)
+ todo_wine ok(0, "failed without error code\n");
else
- ok(0, "failed with %d\n", GetLastError());
+ todo_wine ok(0, "failed with %d\n", GetLastError());
+ }
- return;
+ todo_wine w32_err(pGetProcessImageFileNameA(NULL, szImgPath, sizeof(szImgPath)), ERROR_INVALID_HANDLE);
+ todo_wine w32_err(pGetProcessImageFileNameA(hpSR, szImgPath, sizeof(szImgPath)), ERROR_ACCESS_DENIED);
+ todo_wine w32_err(pGetProcessImageFileNameA(hpQI, szImgPath, 0), ERROR_INSUFFICIENT_BUFFER);
+ todo_wine
+ if(w32_suc(ret = pGetProcessImageFileNameA(hpQI, szImgPath, sizeof(szImgPath))) &&
+ w32_suc(pGetMappedFileNameA(hpQV, hMod, szMapPath, sizeof(szMapPath)))) {
+ /* Windows returns 2*strlen-1 */
+ ok(ret >= strlen(szImgPath), "szImgPath=\"%s\" ret=%d\n", szImgPath, ret);
+ ok(!strcmp(szImgPath, szMapPath),
+ "szImgPath=\"%s\" szMapPath=\"%s\"\n", szImgPath, szMapPath);
}
-
- w32_err(pGetProcessImageFileNameA(NULL, szImgPath, sizeof(szImgPath)), ERROR_INVALID_HANDLE);
- w32_err(pGetProcessImageFileNameA(hpSR, szImgPath, sizeof(szImgPath)), ERROR_ACCESS_DENIED);
- w32_err(pGetProcessImageFileNameA(hpQI, szImgPath, 0), ERROR_INSUFFICIENT_BUFFER);
- if(!w32_suc(ret = pGetProcessImageFileNameA(hpQI, szImgPath, sizeof(szImgPath))) ||
- !w32_suc(pGetMappedFileNameA(hpQV, hMod, szMapPath, sizeof(szMapPath))))
- return;
- /* Windows returns 2*strlen-1 */
- ok(ret >= strlen(szImgPath), "szImgPath=\"%s\" ret=%d\n", szImgPath, ret);
- ok(!strcmp(szImgPath, szMapPath),
- "szImgPath=\"%s\" szMapPath=\"%s\"\n", szImgPath, szMapPath);
+
+ w32_err(pGetProcessImageFileNameW(NULL, szImgPathW, sizeof(szImgPathW)), ERROR_INVALID_HANDLE);
+ /* no information about correct buffer size returned: */
+ w32_err(pGetProcessImageFileNameW(hpQI, szImgPathW, 0), ERROR_INSUFFICIENT_BUFFER);
+ w32_err(pGetProcessImageFileNameW(hpQI, NULL, 0), ERROR_INSUFFICIENT_BUFFER);
+
+ /* correct call */
+ memset(szImgPathW, 0xff, sizeof(szImgPathW));
+ ret = pGetProcessImageFileNameW(hpQI, szImgPathW, sizeof(szImgPathW)/sizeof(WCHAR));
+ ok(ret > 0, "GetProcessImageFileNameW should have succeeded.\n");
+ ok(szImgPathW[0] == '\\', "GetProcessImageFileNameW should have returned an NT path.\n");
+ expect_eq_d(lstrlenW(szImgPathW), ret);
+
+ /* boundary values of 'size' */
+ w32_err(pGetProcessImageFileNameW(hpQI, szImgPathW, ret), ERROR_INSUFFICIENT_BUFFER);
+
+ memset(szImgPathW, 0xff, sizeof(szImgPathW));
+ ret = pGetProcessImageFileNameW(hpQI, szImgPathW, ret + 1);
+ ok(ret > 0, "GetProcessImageFileNameW should have succeeded.\n");
+ ok(szImgPathW[0] == '\\', "GetProcessImageFileNameW should have returned an NT path.\n");
+ expect_eq_d(lstrlenW(szImgPathW), ret);
}
static void test_GetModuleFileNameEx(void)
@@ -309,7 +343,7 @@ START_TEST(psapi_main)
test_GetModuleInformation();
test_GetProcessMemoryInfo();
todo_wine test_GetMappedFileName();
- todo_wine test_GetProcessImageFileName();
+ test_GetProcessImageFileName();
test_GetModuleFileNameEx();
test_GetModuleBaseName();
test_ws_functions();
--
1.5.4
--------------090602010201090601060402--
More information about the wine-patches
mailing list