[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: wtsapi32: Partial implementation of WTSEnumerateProcessesW (try 4)
From:       Stefan Leichter <Stefan.Leichter () camline ! com>
Date:       2014-04-28 21:27:45
Message-ID: 201404282327.45587.Stefan.Leichter () camline ! com
[Download RAW message or body]

Hello,

after this patch has left http://source.winehq.org/patches/ without any 
comment, i like to know what needs to be change to get this patch commited.

Regards Stefan
---
 dlls/wtsapi32/tests/wtsapi.c |    1 -
 dlls/wtsapi32/wtsapi32.c     |   65 
++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 63 insertions(+), 3 deletions(-)


["0001-wtsapi32-Partial-implementation-of-WTSEnumerateProcess.txt" (text/x-patch)]

diff --git a/dlls/wtsapi32/tests/wtsapi.c b/dlls/wtsapi32/tests/wtsapi.c
index e8dced7..a317e5f 100644
--- a/dlls/wtsapi32/tests/wtsapi.c
+++ b/dlls/wtsapi32/tests/wtsapi.c
@@ -85,7 +85,6 @@ static void test_WTSEnumerateProcessesW(void)
     {
         found = found || !lstrcmpW(pname, info[i].pProcessName);
     }
-    todo_wine
     ok(found || broken(!ret), "process name %s not found\n", wine_dbgstr_w(pname));
     if (info) WTSFreeMemory(info);
 }
diff --git a/dlls/wtsapi32/wtsapi32.c b/dlls/wtsapi32/wtsapi32.c
index 79d5a7f..9066f95 100644
--- a/dlls/wtsapi32/wtsapi32.c
+++ b/dlls/wtsapi32/wtsapi32.c
@@ -18,8 +18,11 @@
 #include "config.h"
 #include <stdarg.h>
 #include <stdlib.h>
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
 #include "windef.h"
 #include "winbase.h"
+#include "winternl.h"
 #include "wtsapi32.h"
 #include "wine/debug.h"
 
@@ -84,8 +87,13 @@ BOOL WINAPI WTSEnumerateProcessesA(HANDLE hServer, DWORD Reserved, \
DWORD Version  BOOL WINAPI WTSEnumerateProcessesW(HANDLE hServer, DWORD Reserved, \
DWORD Version,  PWTS_PROCESS_INFOW* ppProcessInfo, DWORD* pCount)
 {
-    FIXME("Stub %p 0x%08x 0x%08x %p %p\n", hServer, Reserved, Version,
-          ppProcessInfo, pCount);
+    SYSTEM_PROCESS_INFORMATION *spi;
+    ULONG size = 100 * sizeof(SYSTEM_PROCESS_INFORMATION);
+    void *buf = NULL;
+    NTSTATUS status;
+    DWORD i,lcount = 0, strsize = 0;
+    WCHAR *name;
+    WTS_PROCESS_INFOW *linfo;
 
     if (!ppProcessInfo || !pCount || Reserved != 0 || Version != 1)
     {
@@ -96,6 +104,59 @@ BOOL WINAPI WTSEnumerateProcessesW(HANDLE hServer, DWORD \
                Reserved, DWORD Version
     *pCount = 0;
     *ppProcessInfo = NULL;
 
+    if (hServer != WTS_CURRENT_SERVER_HANDLE)
+    {
+        FIXME("Only WTS_CURRENT_SERVER_HANDLE is impemented\n");
+        return FALSE;
+    }
+
+    do {
+        size *= 2;
+        HeapFree(GetProcessHeap(), 0, buf);
+        buf = HeapAlloc(GetProcessHeap(), 0, size);
+        if (!buf)
+            return FALSE;
+
+        status = NtQuerySystemInformation(SystemProcessInformation, buf, size, \
NULL); +    } while(status == STATUS_INFO_LENGTH_MISMATCH);
+
+    if (status != STATUS_SUCCESS)
+    {
+        HeapFree(GetProcessHeap(), 0, buf);
+        SetLastError(RtlNtStatusToDosError(status));
+        return FALSE;
+    }
+
+    spi = buf;
+
+    do {
+        lcount++;
+        strsize += spi->ProcessName.MaximumLength;
+        spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset);
+    } while(spi->NextEntryOffset != 0);
+
+    linfo = HeapAlloc(GetProcessHeap(), 0, lcount * sizeof(WTS_PROCESS_INFOW) + \
strsize * sizeof(WCHAR)); +    if (!linfo)
+        return FALSE;
+
+    name = (WCHAR*) &linfo[lcount];
+
+    for (i = 0, spi = buf; i < lcount; i++)
+    {
+        linfo[i].SessionId = 0;
+        linfo[i].ProcessId = HandleToUlong(spi->UniqueProcessId);
+        linfo[i].pProcessName = name;
+        linfo[i].pUserSid = NULL;
+        memcpy( name, spi->ProcessName.Buffer, spi->ProcessName.MaximumLength );
+
+        name += spi->ProcessName.MaximumLength;
+        spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset);
+    }
+    *ppProcessInfo = linfo;
+    *pCount = lcount;
+    FIXME("pUserSid not filled\n");
+
+    HeapFree(GetProcessHeap(), 0, buf);
     return TRUE;
 }
 





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic