diff --git a/dlls/wtsapi32/wtsapi32.c b/dlls/wtsapi32/wtsapi32.c index 898b95d..53c6325 100644 --- a/dlls/wtsapi32/wtsapi32.c +++ b/dlls/wtsapi32/wtsapi32.c @@ -18,9 +18,13 @@ #include "config.h" #include <stdarg.h> #include <stdlib.h> -#include "windef.h" -#include "winbase.h" +#include "ntstatus.h" +#define WIN32_NO_STATUS +#include "winternl.h" #include "wtsapi32.h" +#include "wine/library.h" +#include "wine/server.h" +#include "wine/unicode.h" #include "wine/debug.h"
do you need that all?
WINE_DEFAULT_DEBUG_CHANNEL(wtsapi); @@ -84,14 +88,65 @@ 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 = 0x4000; + void *buf = NULL; + NTSTATUS status; + DWORD i,lcount = 0; + WTS_PROCESS_INFOW *linfo;
can't you use sizeof(*spi) or a multiple of it for size? or clean it up somehow else...
if (!ppProcessInfo || !pCount) return FALSE;
*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;
why not dropping buf completely?
+ do { + lcount++; + spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset); + } while(spi->NextEntryOffset != 0);
isn't there an easier way to get the count?
+ linfo = HeapAlloc(GetProcessHeap(), 0, lcount * sizeof(WTS_PROCESS_INFOW)); + if(!linfo) + return FALSE; + + for(i = 0, spi = buf; i < lcount; i++) + { + linfo[i].SessionId = 0; + linfo[i].ProcessId = HandleToUlong(spi->UniqueProcessId); + linfo[i].pProcessName = spi->ProcessName.Buffer; + linfo[i].pUserSid = NULL; + spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset); + } + *ppProcessInfo = linfo; + *pCount = lcount; + FIXME("pUserSid not filled\n"); + + HeapFree(GetProcessHeap(), 0, buf); return TRUE; }
diff --git a/include/wtsapi32.h b/include/wtsapi32.h index f4bab56..0476478 100644 --- a/include/wtsapi32.h +++ b/include/wtsapi32.h @@ -135,6 +135,8 @@ typedef struct _WTS_SERVER_INFOW DECL_WINELIB_TYPE_AW(WTS_SERVER_INFO) DECL_WINELIB_TYPE_AW(PWTS_SERVER_INFO)
+#define WTS_CURRENT_SERVER_HANDLE NULL +
maybe some more WTS_ defines while you're at it
void WINAPI WTSCloseServer(HANDLE); BOOL WINAPI WTSConnectSessionA(ULONG, ULONG, PSTR, BOOL); BOOL WINAPI WTSConnectSessionW(ULONG, ULONG, PWSTR, BOOL);