https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e88e8daabf6d1514d1337…
commit e88e8daabf6d1514d1337d796153208005c50715
Author:     Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sun Mar 25 12:41:55 2018 +0100
Commit:     Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Sun Mar 25 12:41:55 2018 +0100
    [WTSAPI32] Sync with Wine Staging 3.3. CORE-14434
---
 dll/win32/wtsapi32/wtsapi32.c | 109 +++++++++++++++++++++++++++++++++++-------
 media/doc/README.WINE         |   2 +-
 2 files changed, 94 insertions(+), 17 deletions(-)
diff --git a/dll/win32/wtsapi32/wtsapi32.c b/dll/win32/wtsapi32/wtsapi32.c
index 92a7396f54..fad7aa8d7d 100644
--- a/dll/win32/wtsapi32/wtsapi32.c
+++ b/dll/win32/wtsapi32/wtsapi32.c
@@ -15,19 +15,22 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
-#include <config.h>
+#include "config.h"
 #include <stdarg.h>
-//#include <stdlib.h>
-#include <ntstatus.h>
+#include <stdlib.h>
+#include "ntstatus.h"
 #define WIN32_NO_STATUS
-#include <windef.h>
-#include <winbase.h>
-#include <wine/winternl.h>
-#include <wtsapi32.h>
-#include <wine/debug.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wine/winternl.h"
+#include "wtsapi32.h"
+#include "wine/debug.h"
 WINE_DEFAULT_DEBUG_CHANNEL(wtsapi);
+#ifdef __REACTOS__ /* FIXME: Inspect */
+#define GetCurrentProcessToken() ((HANDLE)~(ULONG_PTR)3)
+#endif
 /************************************************************
  *                WTSCloseServer  (WTSAPI32.@)
@@ -96,8 +99,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);
+    WTS_PROCESS_INFOW *processInfo;
+    SYSTEM_PROCESS_INFORMATION *spi;
+    ULONG size = 0x4000;
+    void *buf = NULL;
+    NTSTATUS status;
+    DWORD count;
+    WCHAR *name;
     if (!ppProcessInfo || !pCount || Reserved != 0 || Version != 1)
     {
@@ -105,9 +113,71 @@ BOOL WINAPI WTSEnumerateProcessesW(HANDLE hServer, DWORD Reserved,
DWORD Version
         return FALSE;
     }
-    *pCount = 0;
-    *ppProcessInfo = NULL;
+    if (hServer != WTS_CURRENT_SERVER_HANDLE)
+    {
+        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+        return FALSE;
+    }
+
+    do
+    {
+        size *= 2;
+        HeapFree(GetProcessHeap(), 0, buf);
+        buf = HeapAlloc(GetProcessHeap(), 0, size);
+        if (!buf)
+        {
+            SetLastError(ERROR_OUTOFMEMORY);
+            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;
+    count = size = 0;
+    for (;;)
+    {
+        size += sizeof(WTS_PROCESS_INFOW) + spi->ProcessName.Length + sizeof(WCHAR);
+        count++;
+        if (spi->NextEntryOffset == 0) break;
+        spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset);
+    }
+    processInfo = HeapAlloc(GetProcessHeap(), 0, size);
+    if (!processInfo)
+    {
+        HeapFree(GetProcessHeap(), 0, buf);
+        SetLastError(ERROR_OUTOFMEMORY);
+        return FALSE;
+    }
+    name = (WCHAR *)&processInfo[count];
+
+    *ppProcessInfo = processInfo;
+    *pCount = count;
+
+    spi = buf;
+    while (count--)
+    {
+        processInfo->SessionId = 0;
+        processInfo->ProcessId = HandleToUlong(spi->UniqueProcessId);
+        processInfo->pProcessName = name;
+        processInfo->pUserSid = NULL;
+        memcpy( name, spi->ProcessName.Buffer, spi->ProcessName.Length );
+        name[ spi->ProcessName.Length/sizeof(WCHAR) ] = 0;
+
+        processInfo++;
+        name += (spi->ProcessName.Length + sizeof(WCHAR))/sizeof(WCHAR);
+        spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset);
+    }
+
+    HeapFree(GetProcessHeap(), 0, buf);
     return TRUE;
 }
@@ -171,9 +241,7 @@ BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved,
DWORD Version,
  */
 void WINAPI WTSFreeMemory(PVOID pMemory)
 {
-    static int once;
-
-    if (!once++) FIXME("Stub %p\n", pMemory);
+    HeapFree(GetProcessHeap(), 0, pMemory);
 }
 /************************************************************
@@ -246,7 +314,16 @@ BOOL WINAPI WTSQuerySessionInformationW(
 BOOL WINAPI WTSQueryUserToken(ULONG session_id, PHANDLE token)
 {
     FIXME("%u %p\n", session_id, token);
-    return FALSE;
+
+    if (!token)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    return DuplicateHandle(GetCurrentProcess(), GetCurrentProcessToken(),
+                           GetCurrentProcess(), token,
+                           0, FALSE, DUPLICATE_SAME_ACCESS);
 }
 /************************************************************
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index 0922d5ff44..4b31b28fcf 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -212,7 +212,7 @@ reactos/dll/win32/wmi                 # Synced to WineStaging-2.9
 reactos/dll/win32/wmiutils            # Synced to WineStaging-3.3
 reactos/dll/win32/wmvcore             # Synced to WineStaging-3.3
 reactos/dll/win32/wshom.ocx           # Synced to WineStaging-3.3
-reactos/dll/win32/wtsapi32            # Synced to Wine-3.0
+reactos/dll/win32/wtsapi32            # Synced to WineStaging-3.3
 reactos/dll/win32/wuapi               # Synced to WineStaging-2.9
 reactos/dll/win32/xinput1_1           # Synced to WineStaging-2.9
 reactos/dll/win32/xinput1_2           # Synced to WineStaging-2.9