Stefan Leichter : kernel32: Implement QueryFullProcessImageNameA.
Alexandre Julliard
julliard at winehq.org
Thu Jun 11 10:54:28 CDT 2009
Module: wine
Branch: master
Commit: 57f923674177789b9edf9b5405d88f9b02e33f66
URL: http://source.winehq.org/git/wine.git/?a=commit;h=57f923674177789b9edf9b5405d88f9b02e33f66
Author: Stefan Leichter <Stefan.Leichter at camline.com>
Date: Wed Jun 10 20:39:42 2009 +0200
kernel32: Implement QueryFullProcessImageNameA.
---
dlls/kernel32/kernel32.spec | 2 +-
dlls/kernel32/process.c | 21 +++++++++++++++
dlls/kernel32/tests/process.c | 56 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 78 insertions(+), 1 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 1734460..5182e71 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -865,7 +865,7 @@
@ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList
@ stdcall QueryDosDeviceA(str ptr long)
@ stdcall QueryDosDeviceW(wstr ptr long)
-@ stub QueryFullProcessImageNameA
+@ stdcall QueryFullProcessImageNameA(ptr long ptr ptr)
@ stdcall QueryFullProcessImageNameW(ptr long ptr ptr)
@ stdcall QueryInformationJobObject(long long ptr long ptr)
# @ stub QueryMemoryResourceNotification
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index f00d972..31faf73 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -3134,6 +3134,27 @@ BOOL WINAPI GetProcessHandleCount(HANDLE hProcess, DWORD *cnt)
}
/******************************************************************
+ * QueryFullProcessImageNameA (KERNEL32.@)
+ */
+BOOL WINAPI QueryFullProcessImageNameA(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD pdwSize)
+{
+ BOOL retval;
+ DWORD pdwSizeW = *pdwSize;
+ LPWSTR lpExeNameW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *pdwSize * sizeof(WCHAR));
+
+ retval = QueryFullProcessImageNameW(hProcess, dwFlags, lpExeNameW, &pdwSizeW);
+
+ if(retval)
+ retval = (0 != WideCharToMultiByte(CP_ACP, 0, lpExeNameW, -1,
+ lpExeName, *pdwSize, NULL, NULL));
+ if(retval)
+ *pdwSize = strlen(lpExeName);
+
+ HeapFree(GetProcessHeap(), 0, lpExeNameW);
+ return retval;
+}
+
+/******************************************************************
* QueryFullProcessImageNameW (KERNEL32.@)
*/
BOOL WINAPI QueryFullProcessImageNameW(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD pdwSize)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 05fab17..d8087a6 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -41,6 +41,12 @@
ok((expected) == value, "Expected " #actual " to be %d (" #expected ") is %d\n", \
(expected), value); \
} while (0)
+#define expect_eq_s(expected, actual) \
+ do { \
+ LPCSTR value = (actual); \
+ ok(lstrcmpA((expected), value) == 0, "Expected " #actual " to be L\"%s\" (" #expected ") is L\"%s\"\n", \
+ expected, value); \
+ } while (0)
#define expect_eq_ws_i(expected, actual) \
do { \
LPCWSTR value = (actual); \
@@ -68,6 +74,7 @@ static const char *wine_dbgstr_w(LPCWSTR wstr)
static HINSTANCE hkernel32;
static LPVOID (WINAPI *pVirtualAllocEx)(HANDLE, LPVOID, SIZE_T, DWORD, DWORD);
static BOOL (WINAPI *pVirtualFreeEx)(HANDLE, LPVOID, SIZE_T, DWORD);
+static BOOL (WINAPI *pQueryFullProcessImageNameA)(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize);
static BOOL (WINAPI *pQueryFullProcessImageNameW)(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD lpdwSize);
/* ############################### */
@@ -206,6 +213,7 @@ static int init(void)
hkernel32 = GetModuleHandleA("kernel32");
pVirtualAllocEx = (void *) GetProcAddress(hkernel32, "VirtualAllocEx");
pVirtualFreeEx = (void *) GetProcAddress(hkernel32, "VirtualFreeEx");
+ pQueryFullProcessImageNameA = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameA");
pQueryFullProcessImageNameW = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameW");
return 1;
}
@@ -1618,6 +1626,53 @@ static void test_GetProcessVersion(void)
CloseHandle(pi.hThread);
}
+static void test_ProcessNameA(void)
+{
+#define INIT_STR "Just some words"
+ DWORD length, size;
+ CHAR buf[1024];
+
+ if (!pQueryFullProcessImageNameA)
+ {
+ win_skip("QueryFullProcessImageNameA unavailable (added in Windows Vista)\n");
+ return;
+ }
+ /* get the buffer length without \0 terminator */
+ length = 1024;
+ expect_eq_d(TRUE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &length));
+ expect_eq_d(length, lstrlenA(buf));
+
+ /* when the buffer is too small
+ * - function fail with error ERROR_INSUFFICIENT_BUFFER
+ * - the size variable is not modified
+ * tested with the biggest too small size
+ */
+ size = length;
+ sprintf(buf,INIT_STR);
+ expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &size));
+ expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError());
+ expect_eq_d(length, size);
+ expect_eq_s(INIT_STR, buf);
+
+ /* retest with smaller buffer size
+ */
+ size = 4;
+ sprintf(buf,INIT_STR);
+ expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &size));
+ expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError());
+ expect_eq_d(4, size);
+ expect_eq_s(INIT_STR, buf);
+
+ /* this is a difference between the ascii and the unicode version
+ * the unicode version crashes when the size is big enough to hold the result
+ * ascii version throughs an error
+ */
+ size = 1024;
+ expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, NULL, &size));
+ expect_eq_d(1024, size);
+ expect_eq_d(ERROR_INVALID_PARAMETER, GetLastError());
+}
+
static void test_ProcessName(void)
{
HANDLE hSelf;
@@ -1741,6 +1796,7 @@ START_TEST(process)
test_ExitCode();
test_OpenProcess();
test_GetProcessVersion();
+ test_ProcessNameA();
test_ProcessName();
test_Handles();
/* things that can be tested:
More information about the wine-cvs
mailing list