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