- Implement QueryFullProcessImageNameA/W (based on Wine code). +35 passed tests
authorDmitry Chapyshev <dmitry@reactos.org>
Sun, 12 Jul 2009 12:21:20 +0000 (12:21 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Sun, 12 Jul 2009 12:21:20 +0000 (12:21 +0000)
svn path=/trunk/; revision=41930

reactos/dll/win32/kernel32/kernel32.pspec
reactos/dll/win32/kernel32/process/proc.c

index 7918234..631a70a 100644 (file)
 @ stdcall lstrlen(str) lstrlenA
 @ stdcall lstrlenA(str)
 @ stdcall lstrlenW(wstr)
+
+; Functions added in Win Vista
+@ stdcall QueryFullProcessImageNameA(ptr long str ptr)
+@ stdcall QueryFullProcessImageNameW(ptr long wstr ptr)
index e116c29..4e8e5ee 100644 (file)
@@ -1006,4 +1006,106 @@ IsWow64Process(
     return TRUE;
 }
 
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+QueryFullProcessImageNameW(HANDLE hProcess,
+                           DWORD dwFlags,
+                           LPWSTR lpExeName,
+                           PDWORD pdwSize)
+{
+    BYTE Buffer[sizeof(UNICODE_STRING) + MAX_PATH * sizeof(WCHAR)];
+    UNICODE_STRING *DynamicBuffer = NULL;
+    UNICODE_STRING *Result = NULL;
+    NTSTATUS Status;
+    DWORD Needed;
+
+    Status = NtQueryInformationProcess(hProcess,
+                                       ProcessImageFileName,
+                                       Buffer,
+                                       sizeof(Buffer) - sizeof(WCHAR),
+                                       &Needed);
+    if (Status == STATUS_INFO_LENGTH_MISMATCH)
+    {
+        DynamicBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Needed + sizeof(WCHAR));
+        if (!DynamicBuffer)
+        {
+            SetLastErrorByStatus(STATUS_NO_MEMORY);
+            return FALSE;
+        }
+
+        Status = NtQueryInformationProcess(hProcess,
+                                           ProcessImageFileName,
+                                           (LPBYTE)DynamicBuffer,
+                                           Needed,
+                                           &Needed);
+        Result = DynamicBuffer;
+    }
+    else Result = (PUNICODE_STRING)Buffer;
+
+    if (!NT_SUCCESS(Status)) goto Cleanup;
+
+    if (Result->Length / sizeof(WCHAR) + 1 > *pdwSize)
+    {
+        Status = STATUS_BUFFER_TOO_SMALL;
+        goto Cleanup;
+    }
+
+    *pdwSize = Result->Length / sizeof(WCHAR);
+    memcpy(lpExeName, Result->Buffer, Result->Length);
+    lpExeName[*pdwSize] = 0;
+
+Cleanup:
+    RtlFreeHeap(RtlGetProcessHeap(), 0, DynamicBuffer);
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastErrorByStatus(Status);
+    }
+    return !Status;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+QueryFullProcessImageNameA(HANDLE hProcess,
+                           DWORD dwFlags,
+                           LPSTR lpExeName,
+                           PDWORD pdwSize)
+{
+    DWORD pdwSizeW = *pdwSize;
+    BOOL Result;
+    LPWSTR lpExeNameW;
+
+    lpExeNameW = RtlAllocateHeap(RtlGetProcessHeap(),
+                                 HEAP_ZERO_MEMORY,
+                                 *pdwSize * sizeof(WCHAR));
+    if (!lpExeNameW)
+    {
+        SetLastErrorByStatus(STATUS_NO_MEMORY);
+        return FALSE;
+    }
+
+    Result = QueryFullProcessImageNameW(hProcess, dwFlags, lpExeNameW, &pdwSizeW);
+
+    if (Result)
+        Result = (0 != WideCharToMultiByte(CP_ACP, 0,
+                                           lpExeNameW,
+                                           -1,
+                                           lpExeName,
+                                           *pdwSize,
+                                           NULL, NULL));
+    if (Result)
+        *pdwSize = strlen(lpExeName);
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, lpExeNameW);
+    return Result;
+}
+
 /* EOF */