winepulse: Remove AudioSessionManager.
[wine.git] / dlls / wtsapi32 / wtsapi32.c
blob7de1b8124eaca38e27e3a9028d25df7c0c9bd0c3
1 /* Copyright 2005 Ulrich Czekalla
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 #include "ntstatus.h"
19 #define WIN32_NO_STATUS
20 #include <stdarg.h>
21 #include <stdlib.h>
22 #include "windef.h"
23 #include "winbase.h"
24 #include "winternl.h"
25 #include "winnls.h"
26 #include "lmcons.h"
27 #include "wtsapi32.h"
28 #include "wine/debug.h"
29 #include "wine/heap.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(wtsapi);
34 /************************************************************
35 * WTSCloseServer (WTSAPI32.@)
37 void WINAPI WTSCloseServer(HANDLE hServer)
39 FIXME("Stub %p\n", hServer);
42 /************************************************************
43 * WTSConnectSessionA (WTSAPI32.@)
45 BOOL WINAPI WTSConnectSessionA(ULONG LogonId, ULONG TargetLogonId, PSTR pPassword, BOOL bWait)
47 FIXME("Stub %ld %ld (%s) %d\n", LogonId, TargetLogonId, debugstr_a(pPassword), bWait);
48 return TRUE;
51 /************************************************************
52 * WTSConnectSessionW (WTSAPI32.@)
54 BOOL WINAPI WTSConnectSessionW(ULONG LogonId, ULONG TargetLogonId, PWSTR pPassword, BOOL bWait)
56 FIXME("Stub %ld %ld (%s) %d\n", LogonId, TargetLogonId, debugstr_w(pPassword), bWait);
57 return TRUE;
60 /************************************************************
61 * WTSDisconnectSession (WTSAPI32.@)
63 BOOL WINAPI WTSDisconnectSession(HANDLE hServer, DWORD SessionId, BOOL bWait)
65 FIXME("Stub %p 0x%08lx %d\n", hServer, SessionId, bWait);
66 return TRUE;
69 /************************************************************
70 * WTSEnableChildSessions (WTSAPI32.@)
72 BOOL WINAPI WTSEnableChildSessions(BOOL enable)
74 FIXME("Stub %d\n", enable);
75 return TRUE;
79 /************************************************************
80 * WTSEnumerateProcessesExW (WTSAPI32.@)
82 BOOL WINAPI WTSEnumerateProcessesExW(HANDLE server, DWORD *level, DWORD session_id,
83 WCHAR **ret_info, DWORD *ret_count)
85 SYSTEM_PROCESS_INFORMATION *nt_info, *nt_process;
86 WTS_PROCESS_INFOW *info;
87 ULONG nt_size = 4096;
88 DWORD count, size;
89 NTSTATUS status;
90 char *p;
92 TRACE("server %p, level %lu, session_id %#lx, ret_info %p, ret_count %p\n",
93 server, *level, session_id, ret_info, ret_count);
95 if (!ret_info || !ret_count)
97 SetLastError(ERROR_INVALID_PARAMETER);
98 return FALSE;
101 if (session_id != WTS_ANY_SESSION)
102 FIXME("ignoring session id %#lx\n", session_id);
104 if (*level)
106 FIXME("unhandled level %lu\n", *level);
107 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
108 return FALSE;
111 if (!(nt_info = malloc(nt_size)))
113 SetLastError(ERROR_OUTOFMEMORY);
114 return FALSE;
117 while ((status = NtQuerySystemInformation(SystemProcessInformation, nt_info,
118 nt_size, NULL)) == STATUS_INFO_LENGTH_MISMATCH)
120 SYSTEM_PROCESS_INFORMATION *new_info;
122 nt_size *= 2;
123 if (!(new_info = realloc(nt_info, nt_size)))
125 free(nt_info);
126 SetLastError(ERROR_OUTOFMEMORY);
127 return FALSE;
129 nt_info = new_info;
131 if (status)
133 free(nt_info);
134 SetLastError(RtlNtStatusToDosError(status));
135 return FALSE;
138 size = 0;
139 count = 0;
140 nt_process = nt_info;
141 for (;;)
143 size += sizeof(WTS_PROCESS_INFOW) + nt_process->ProcessName.Length + sizeof(WCHAR);
144 size += offsetof(SID, SubAuthority[SID_MAX_SUB_AUTHORITIES]);
145 ++count;
147 if (!nt_process->NextEntryOffset)
148 break;
149 nt_process = (SYSTEM_PROCESS_INFORMATION *)((char *)nt_process + nt_process->NextEntryOffset);
152 if (!(info = heap_alloc(size)))
154 free(nt_info);
155 SetLastError(ERROR_OUTOFMEMORY);
156 return FALSE;
158 p = (char *)(info + count);
160 count = 0;
161 nt_process = nt_info;
162 for (;;)
164 HANDLE process, token;
166 info[count].SessionId = nt_process->SessionId;
167 info[count].ProcessId = (DWORD_PTR)nt_process->UniqueProcessId;
169 info[count].pProcessName = (WCHAR *)p;
170 memcpy(p, nt_process->ProcessName.Buffer, nt_process->ProcessName.Length);
171 info[count].pProcessName[nt_process->ProcessName.Length / sizeof(WCHAR)] = 0;
172 p += nt_process->ProcessName.Length + sizeof(WCHAR);
174 info[count].pUserSid = NULL;
175 if ((process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, info[count].ProcessId)))
177 if (OpenProcessToken(process, TOKEN_QUERY, &token))
179 char buffer[sizeof(TOKEN_USER) + offsetof(SID, SubAuthority[SID_MAX_SUB_AUTHORITIES])];
180 TOKEN_USER *user = (TOKEN_USER *)buffer;
181 DWORD size;
183 GetTokenInformation(token, TokenUser, buffer, sizeof(buffer), &size);
184 info[count].pUserSid = p;
185 size = GetLengthSid(user->User.Sid);
186 memcpy(p, user->User.Sid, size);
187 p += size;
188 CloseHandle(token);
190 CloseHandle(process);
193 ++count;
194 if (!nt_process->NextEntryOffset)
195 break;
196 nt_process = (SYSTEM_PROCESS_INFORMATION *)((char *)nt_process + nt_process->NextEntryOffset);
199 *ret_info = (WCHAR *)info;
200 *ret_count = count;
201 SetLastError(0);
202 return TRUE;
205 /************************************************************
206 * WTSEnumerateProcessesExA (WTSAPI32.@)
208 BOOL WINAPI WTSEnumerateProcessesExA(HANDLE server, DWORD *level, DWORD session_id, char **info, DWORD *count)
210 FIXME("Stub %p %p %ld %p %p\n", server, level, session_id, info, count);
211 if (count) *count = 0;
212 return FALSE;
215 /************************************************************
216 * WTSEnumerateProcessesA (WTSAPI32.@)
218 BOOL WINAPI WTSEnumerateProcessesA(HANDLE hServer, DWORD Reserved, DWORD Version,
219 PWTS_PROCESS_INFOA* ppProcessInfo, DWORD* pCount)
221 FIXME("Stub %p 0x%08lx 0x%08lx %p %p\n", hServer, Reserved, Version,
222 ppProcessInfo, pCount);
224 if (!ppProcessInfo || !pCount) return FALSE;
226 *pCount = 0;
227 *ppProcessInfo = NULL;
229 return TRUE;
232 /************************************************************
233 * WTSEnumerateProcessesW (WTSAPI32.@)
235 BOOL WINAPI WTSEnumerateProcessesW(HANDLE server, DWORD reserved, DWORD version,
236 WTS_PROCESS_INFOW **info, DWORD *count)
238 DWORD level = 0;
240 TRACE("server %p, reserved %#lx, version %lu, info %p, count %p\n", server, reserved, version, info, count);
242 if (reserved || version != 1)
244 SetLastError(ERROR_INVALID_PARAMETER);
245 return FALSE;
248 return WTSEnumerateProcessesExW(server, &level, WTS_ANY_SESSION, (WCHAR **)info, count);
251 /************************************************************
252 * WTSEnumerateServersA (WTSAPI32.@)
254 BOOL WINAPI WTSEnumerateServersA(LPSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOA *ppServerInfo, DWORD *pCount)
256 FIXME("Stub %s 0x%08lx 0x%08lx %p %p\n", debugstr_a(pDomainName), Reserved, Version, ppServerInfo, pCount);
257 return FALSE;
260 /************************************************************
261 * WTSEnumerateServersW (WTSAPI32.@)
263 BOOL WINAPI WTSEnumerateServersW(LPWSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOW *ppServerInfo, DWORD *pCount)
265 FIXME("Stub %s 0x%08lx 0x%08lx %p %p\n", debugstr_w(pDomainName), Reserved, Version, ppServerInfo, pCount);
266 return FALSE;
270 /************************************************************
271 * WTSEnumerateEnumerateSessionsExW (WTSAPI32.@)
273 BOOL WINAPI WTSEnumerateSessionsExW(HANDLE server, DWORD *level, DWORD filter, WTS_SESSION_INFO_1W* info, DWORD *count)
275 FIXME("Stub %p %p %ld %p %p\n", server, level, filter, info, count);
276 if (count) *count = 0;
277 return FALSE;
280 /************************************************************
281 * WTSEnumerateEnumerateSessionsExA (WTSAPI32.@)
283 BOOL WINAPI WTSEnumerateSessionsExA(HANDLE server, DWORD *level, DWORD filter, WTS_SESSION_INFO_1A* info, DWORD *count)
285 FIXME("Stub %p %p %ld %p %p\n", server, level, filter, info, count);
286 if (count) *count = 0;
287 return FALSE;
290 /************************************************************
291 * WTSEnumerateEnumerateSessionsA (WTSAPI32.@)
293 BOOL WINAPI WTSEnumerateSessionsA(HANDLE hServer, DWORD Reserved, DWORD Version,
294 PWTS_SESSION_INFOA* ppSessionInfo, DWORD* pCount)
296 static int once;
298 if (!once++) FIXME("Stub %p 0x%08lx 0x%08lx %p %p\n", hServer, Reserved, Version,
299 ppSessionInfo, pCount);
301 if (!ppSessionInfo || !pCount) return FALSE;
303 *pCount = 0;
304 *ppSessionInfo = NULL;
306 return TRUE;
309 /************************************************************
310 * WTSEnumerateEnumerateSessionsW (WTSAPI32.@)
312 BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version,
313 PWTS_SESSION_INFOW* ppSessionInfo, DWORD* pCount)
315 FIXME("Stub %p 0x%08lx 0x%08lx %p %p\n", hServer, Reserved, Version,
316 ppSessionInfo, pCount);
318 if (!ppSessionInfo || !pCount) return FALSE;
320 *pCount = 0;
321 *ppSessionInfo = NULL;
323 return TRUE;
326 /************************************************************
327 * WTSFreeMemory (WTSAPI32.@)
329 void WINAPI WTSFreeMemory(PVOID pMemory)
331 heap_free(pMemory);
334 /************************************************************
335 * WTSFreeMemoryExA (WTSAPI32.@)
337 BOOL WINAPI WTSFreeMemoryExA(WTS_TYPE_CLASS type, void *ptr, ULONG nmemb)
339 TRACE("%d %p %ld\n", type, ptr, nmemb);
340 heap_free(ptr);
341 return TRUE;
344 /************************************************************
345 * WTSFreeMemoryExW (WTSAPI32.@)
347 BOOL WINAPI WTSFreeMemoryExW(WTS_TYPE_CLASS type, void *ptr, ULONG nmemb)
349 TRACE("%d %p %ld\n", type, ptr, nmemb);
350 heap_free(ptr);
351 return TRUE;
355 /************************************************************
356 * WTSLogoffSession (WTSAPI32.@)
358 BOOL WINAPI WTSLogoffSession(HANDLE hserver, DWORD session_id, BOOL bwait)
360 FIXME("(%p, 0x%lx, %d): stub\n", hserver, session_id, bwait);
361 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
362 return FALSE;
366 /************************************************************
367 * WTSOpenServerExW (WTSAPI32.@)
369 HANDLE WINAPI WTSOpenServerExW(WCHAR *server_name)
371 FIXME("(%s) stub\n", debugstr_w(server_name));
372 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
373 return NULL;
376 /************************************************************
377 * WTSOpenServerExA (WTSAPI32.@)
379 HANDLE WINAPI WTSOpenServerExA(char *server_name)
381 FIXME("(%s) stub\n", debugstr_a(server_name));
382 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
383 return NULL;
386 /************************************************************
387 * WTSOpenServerA (WTSAPI32.@)
389 HANDLE WINAPI WTSOpenServerA(LPSTR pServerName)
391 FIXME("(%s) stub\n", debugstr_a(pServerName));
392 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
393 return NULL;
396 /************************************************************
397 * WTSOpenServerW (WTSAPI32.@)
399 HANDLE WINAPI WTSOpenServerW(LPWSTR pServerName)
401 FIXME("(%s) stub\n", debugstr_w(pServerName));
402 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
403 return NULL;
406 /************************************************************
407 * WTSQuerySessionInformationA (WTSAPI32.@)
409 BOOL WINAPI WTSQuerySessionInformationA(HANDLE server, DWORD session_id, WTS_INFO_CLASS class, char **buffer, DWORD *count)
411 WCHAR *bufferW = NULL;
413 TRACE("%p 0x%08lx %d %p %p\n", server, session_id, class, buffer, count);
415 if (!buffer || !count)
417 SetLastError(ERROR_INVALID_USER_BUFFER);
418 return FALSE;
421 if (class == WTSClientProtocolType)
423 USHORT *protocol;
425 if (!(protocol = heap_alloc(sizeof(*protocol)))) return FALSE;
426 FIXME("returning 0 protocol type\n");
427 *protocol = 0;
428 *buffer = (char *)protocol;
429 *count = sizeof(*protocol);
430 return TRUE;
433 if (!WTSQuerySessionInformationW(server, session_id, class, &bufferW, count))
434 return FALSE;
436 *count = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL);
437 if (!*count)
439 WTSFreeMemory(bufferW);
440 return FALSE;
443 if (!(*buffer = heap_alloc(*count)))
445 WTSFreeMemory(bufferW);
446 return FALSE;
449 if (!(*count = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, *buffer, *count, NULL, NULL)))
451 WTSFreeMemory(bufferW);
452 heap_free(*buffer);
453 return FALSE;
456 WTSFreeMemory(bufferW);
457 return TRUE;
460 /************************************************************
461 * WTSQuerySessionInformationW (WTSAPI32.@)
463 BOOL WINAPI WTSQuerySessionInformationW(HANDLE server, DWORD session_id, WTS_INFO_CLASS class, WCHAR **buffer, DWORD *count)
465 TRACE("%p 0x%08lx %d %p %p\n", server, session_id, class, buffer, count);
467 if (!buffer || !count)
469 SetLastError(ERROR_INVALID_USER_BUFFER);
470 return FALSE;
473 if (class == WTSClientProtocolType)
475 USHORT *protocol;
477 if (!(protocol = heap_alloc(sizeof(*protocol)))) return FALSE;
478 FIXME("returning 0 protocol type\n");
479 *protocol = 0;
480 *buffer = (WCHAR *)protocol;
481 *count = sizeof(*protocol);
482 return TRUE;
485 if (class == WTSUserName)
487 DWORD size = UNLEN + 1;
488 WCHAR *username;
490 if (!(username = heap_alloc(size * sizeof(WCHAR)))) return FALSE;
491 GetUserNameW(username, &size);
492 *buffer = username;
493 *count = size * sizeof(WCHAR);
494 return TRUE;
497 if (class == WTSDomainName)
499 DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
500 WCHAR *computername;
502 if (!(computername = heap_alloc(size * sizeof(WCHAR)))) return FALSE;
503 GetComputerNameW(computername, &size);
504 *buffer = computername;
505 /* GetComputerNameW() return size doesn't include terminator */
506 size++;
507 *count = size * sizeof(WCHAR);
508 return TRUE;
511 FIXME("Unimplemented class %d\n", class);
513 *buffer = NULL;
514 *count = 0;
515 return FALSE;
518 /************************************************************
519 * WTSQueryUserToken (WTSAPI32.@)
521 BOOL WINAPI WTSQueryUserToken(ULONG session_id, PHANDLE token)
523 FIXME("%lu %p semi-stub!\n", session_id, token);
525 if (!token)
527 SetLastError(ERROR_INVALID_PARAMETER);
528 return FALSE;
531 return DuplicateHandle(GetCurrentProcess(), GetCurrentProcessToken(),
532 GetCurrentProcess(), token,
533 0, FALSE, DUPLICATE_SAME_ACCESS);
536 /************************************************************
537 * WTSQueryUserConfigA (WTSAPI32.@)
539 BOOL WINAPI WTSQueryUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR *ppBuffer, DWORD *pBytesReturned)
541 FIXME("Stub (%s) (%s) 0x%08x %p %p\n", debugstr_a(pServerName), debugstr_a(pUserName), WTSConfigClass,
542 ppBuffer, pBytesReturned);
543 return FALSE;
546 /************************************************************
547 * WTSQueryUserConfigW (WTSAPI32.@)
549 BOOL WINAPI WTSQueryUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR *ppBuffer, DWORD *pBytesReturned)
551 FIXME("Stub (%s) (%s) 0x%08x %p %p\n", debugstr_w(pServerName), debugstr_w(pUserName), WTSConfigClass,
552 ppBuffer, pBytesReturned);
553 return FALSE;
557 /************************************************************
558 * WTSRegisterSessionNotification (WTSAPI32.@)
560 BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags)
562 FIXME("Stub %p 0x%08lx\n", hWnd, dwFlags);
563 return TRUE;
566 /************************************************************
567 * WTSRegisterSessionNotificationEx (WTSAPI32.@)
569 BOOL WINAPI WTSRegisterSessionNotificationEx(HANDLE hServer, HWND hWnd, DWORD dwFlags)
571 FIXME("Stub %p %p 0x%08lx\n", hServer, hWnd, dwFlags);
572 return TRUE;
576 /************************************************************
577 * WTSSendMessageA (WTSAPI32.@)
579 BOOL WINAPI WTSSendMessageA(HANDLE hServer, DWORD SessionId, LPSTR pTitle, DWORD TitleLength, LPSTR pMessage,
580 DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD *pResponse, BOOL bWait)
582 FIXME("Stub %p 0x%08lx (%s) %ld (%s) %ld 0x%08lx %ld %p %d\n", hServer, SessionId, debugstr_a(pTitle), TitleLength, debugstr_a(pMessage), MessageLength, Style, Timeout, pResponse, bWait);
583 return FALSE;
586 /************************************************************
587 * WTSSendMessageW (WTSAPI32.@)
589 BOOL WINAPI WTSSendMessageW(HANDLE hServer, DWORD SessionId, LPWSTR pTitle, DWORD TitleLength, LPWSTR pMessage,
590 DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD *pResponse, BOOL bWait)
592 FIXME("Stub %p 0x%08lx (%s) %ld (%s) %ld 0x%08lx %ld %p %d\n", hServer, SessionId, debugstr_w(pTitle), TitleLength, debugstr_w(pMessage), MessageLength, Style, Timeout, pResponse, bWait);
593 return FALSE;
596 /************************************************************
597 * WTSSetUserConfigA (WTSAPI32.@)
599 BOOL WINAPI WTSSetUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR pBuffer, DWORD DataLength)
601 FIXME("Stub (%s) (%s) 0x%08x %p %ld\n", debugstr_a(pServerName), debugstr_a(pUserName), WTSConfigClass,pBuffer, DataLength);
602 return FALSE;
605 /************************************************************
606 * WTSSetUserConfigW (WTSAPI32.@)
608 BOOL WINAPI WTSSetUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR pBuffer, DWORD DataLength)
610 FIXME("Stub (%s) (%s) 0x%08x %p %ld\n", debugstr_w(pServerName), debugstr_w(pUserName), WTSConfigClass,pBuffer, DataLength);
611 return FALSE;
614 /************************************************************
615 * WTSShutdownSystem (WTSAPI32.@)
617 BOOL WINAPI WTSShutdownSystem(HANDLE hServer, DWORD ShutdownFlag)
619 FIXME("Stub %p 0x%08lx\n", hServer,ShutdownFlag);
620 return FALSE;
623 /************************************************************
624 * WTSStartRemoteControlSessionA (WTSAPI32.@)
626 BOOL WINAPI WTSStartRemoteControlSessionA(LPSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers)
628 FIXME("Stub (%s) %ld %d %d\n", debugstr_a(pTargetServerName), TargetLogonId, HotkeyVk, HotkeyModifiers);
629 return FALSE;
632 /************************************************************
633 * WTSStartRemoteControlSessionW (WTSAPI32.@)
635 BOOL WINAPI WTSStartRemoteControlSessionW(LPWSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers)
637 FIXME("Stub (%s) %ld %d %d\n", debugstr_w(pTargetServerName), TargetLogonId, HotkeyVk, HotkeyModifiers);
638 return FALSE;
641 /************************************************************
642 * WTSStopRemoteControlSession (WTSAPI32.@)
644 BOOL WINAPI WTSStopRemoteControlSession(ULONG LogonId)
646 FIXME("Stub %ld\n", LogonId);
647 return FALSE;
650 /************************************************************
651 * WTSTerminateProcess (WTSAPI32.@)
653 BOOL WINAPI WTSTerminateProcess(HANDLE hServer, DWORD ProcessId, DWORD ExitCode)
655 FIXME("Stub %p %ld %ld\n", hServer, ProcessId, ExitCode);
656 return FALSE;
659 /************************************************************
660 * WTSUnRegisterSessionNotification (WTSAPI32.@)
662 BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd)
664 FIXME("Stub %p\n", hWnd);
665 return FALSE;
668 /************************************************************
669 * WTSUnRegisterSessionNotification (WTSAPI32.@)
671 BOOL WINAPI WTSUnRegisterSessionNotificationEx(HANDLE hServer, HWND hWnd)
673 FIXME("Stub %p %p\n", hServer, hWnd);
674 return FALSE;
678 /************************************************************
679 * WTSVirtualChannelClose (WTSAPI32.@)
681 BOOL WINAPI WTSVirtualChannelClose(HANDLE hChannelHandle)
683 FIXME("Stub %p\n", hChannelHandle);
684 return FALSE;
687 /************************************************************
688 * WTSVirtualChannelOpen (WTSAPI32.@)
690 HANDLE WINAPI WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPSTR pVirtualName)
692 FIXME("Stub %p %ld (%s)\n", hServer, SessionId, debugstr_a(pVirtualName));
693 return NULL;
696 /************************************************************
697 * WTSVirtualChannelOpen (WTSAPI32.@)
699 HANDLE WINAPI WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualName, DWORD flags)
701 FIXME("Stub %ld (%s) %ld\n", SessionId, debugstr_a(pVirtualName), flags);
702 return NULL;
705 /************************************************************
706 * WTSVirtualChannelPurgeInput (WTSAPI32.@)
708 BOOL WINAPI WTSVirtualChannelPurgeInput(HANDLE hChannelHandle)
710 FIXME("Stub %p\n", hChannelHandle);
711 return FALSE;
714 /************************************************************
715 * WTSVirtualChannelPurgeOutput (WTSAPI32.@)
717 BOOL WINAPI WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle)
719 FIXME("Stub %p\n", hChannelHandle);
720 return FALSE;
724 /************************************************************
725 * WTSVirtualChannelQuery (WTSAPI32.@)
727 BOOL WINAPI WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLASS WtsVirtualClass, PVOID *ppBuffer, DWORD *pBytesReturned)
729 FIXME("Stub %p %d %p %p\n", hChannelHandle, WtsVirtualClass, ppBuffer, pBytesReturned);
730 return FALSE;
733 /************************************************************
734 * WTSVirtualChannelRead (WTSAPI32.@)
736 BOOL WINAPI WTSVirtualChannelRead(HANDLE hChannelHandle, ULONG TimeOut, PCHAR Buffer, ULONG BufferSize, PULONG pBytesRead)
738 FIXME("Stub %p %ld %p %ld %p\n", hChannelHandle, TimeOut, Buffer, BufferSize, pBytesRead);
739 return FALSE;
742 /************************************************************
743 * WTSVirtualChannelWrite (WTSAPI32.@)
745 BOOL WINAPI WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer, ULONG Length, PULONG pBytesWritten)
747 FIXME("Stub %p %p %ld %p\n", hChannelHandle, Buffer, Length, pBytesWritten);
748 return FALSE;
751 /************************************************************
752 * WTSWaitSystemEvent (WTSAPI32.@)
754 BOOL WINAPI WTSWaitSystemEvent(HANDLE hServer, DWORD Mask, DWORD* Flags)
756 /* FIXME: Forward request to winsta.dll::WinStationWaitSystemEvent */
757 FIXME("Stub %p 0x%08lx %p\n", hServer, Mask, Flags);
758 return FALSE;