Blame winpr/libwinpr/wtsapi/wtsapi.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Windows Terminal Services API
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 * Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
Packit 1fb8d4
 * Copyright 2015 Copyright 2015 Thincast Technologies GmbH
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/ini.h>
Packit 1fb8d4
#include <winpr/path.h>
Packit 1fb8d4
#include <winpr/synch.h>
Packit 1fb8d4
#include <winpr/library.h>
Packit 1fb8d4
#include <winpr/environment.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/wtsapi.h>
Packit 1fb8d4
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
#include "wtsapi_win32.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include "../log.h"
Packit 1fb8d4
#define TAG WINPR_TAG("wtsapi")
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * Remote Desktop Services API Functions:
Packit 1fb8d4
 * http://msdn.microsoft.com/en-us/library/windows/desktop/aa383464/
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static HMODULE g_WtsApiModule = NULL;
Packit 1fb8d4
Packit 1fb8d4
static PWtsApiFunctionTable g_WtsApi = NULL;
Packit 1fb8d4
Packit 1fb8d4
static HMODULE g_WtsApi32Module = NULL;
Packit 1fb8d4
Packit 1fb8d4
static WtsApiFunctionTable WtsApi32_WtsApiFunctionTable =
Packit 1fb8d4
{
Packit 1fb8d4
	0, /* dwVersion */
Packit 1fb8d4
	0, /* dwFlags */
Packit 1fb8d4
Packit 1fb8d4
	NULL, /* StopRemoteControlSession */
Packit 1fb8d4
	NULL, /* StartRemoteControlSessionW */
Packit 1fb8d4
	NULL, /* StartRemoteControlSessionA */
Packit 1fb8d4
	NULL, /* ConnectSessionW */
Packit 1fb8d4
	NULL, /* ConnectSessionA */
Packit 1fb8d4
	NULL, /* EnumerateServersW */
Packit 1fb8d4
	NULL, /* EnumerateServersA */
Packit 1fb8d4
	NULL, /* OpenServerW */
Packit 1fb8d4
	NULL, /* OpenServerA */
Packit 1fb8d4
	NULL, /* OpenServerExW */
Packit 1fb8d4
	NULL, /* OpenServerExA */
Packit 1fb8d4
	NULL, /* CloseServer */
Packit 1fb8d4
	NULL, /* EnumerateSessionsW */
Packit 1fb8d4
	NULL, /* EnumerateSessionsA */
Packit 1fb8d4
	NULL, /* EnumerateSessionsExW */
Packit 1fb8d4
	NULL, /* EnumerateSessionsExA */
Packit 1fb8d4
	NULL, /* EnumerateProcessesW */
Packit 1fb8d4
	NULL, /* EnumerateProcessesA */
Packit 1fb8d4
	NULL, /* TerminateProcess */
Packit 1fb8d4
	NULL, /* QuerySessionInformationW */
Packit 1fb8d4
	NULL, /* QuerySessionInformationA */
Packit 1fb8d4
	NULL, /* QueryUserConfigW */
Packit 1fb8d4
	NULL, /* QueryUserConfigA */
Packit 1fb8d4
	NULL, /* SetUserConfigW */
Packit 1fb8d4
	NULL, /* SetUserConfigA */
Packit 1fb8d4
	NULL, /* SendMessageW */
Packit 1fb8d4
	NULL, /* SendMessageA */
Packit 1fb8d4
	NULL, /* DisconnectSession */
Packit 1fb8d4
	NULL, /* LogoffSession */
Packit 1fb8d4
	NULL, /* ShutdownSystem */
Packit 1fb8d4
	NULL, /* WaitSystemEvent */
Packit 1fb8d4
	NULL, /* VirtualChannelOpen */
Packit 1fb8d4
	NULL, /* VirtualChannelOpenEx */
Packit 1fb8d4
	NULL, /* VirtualChannelClose */
Packit 1fb8d4
	NULL, /* VirtualChannelRead */
Packit 1fb8d4
	NULL, /* VirtualChannelWrite */
Packit 1fb8d4
	NULL, /* VirtualChannelPurgeInput */
Packit 1fb8d4
	NULL, /* VirtualChannelPurgeOutput */
Packit 1fb8d4
	NULL, /* VirtualChannelQuery */
Packit 1fb8d4
	NULL, /* FreeMemory */
Packit 1fb8d4
	NULL, /* RegisterSessionNotification */
Packit 1fb8d4
	NULL, /* UnRegisterSessionNotification */
Packit 1fb8d4
	NULL, /* RegisterSessionNotificationEx */
Packit 1fb8d4
	NULL, /* UnRegisterSessionNotificationEx */
Packit 1fb8d4
	NULL, /* QueryUserToken */
Packit 1fb8d4
	NULL, /* FreeMemoryExW */
Packit 1fb8d4
	NULL, /* FreeMemoryExA */
Packit 1fb8d4
	NULL, /* EnumerateProcessesExW */
Packit 1fb8d4
	NULL, /* EnumerateProcessesExA */
Packit 1fb8d4
	NULL, /* EnumerateListenersW */
Packit 1fb8d4
	NULL, /* EnumerateListenersA */
Packit 1fb8d4
	NULL, /* QueryListenerConfigW */
Packit 1fb8d4
	NULL, /* QueryListenerConfigA */
Packit 1fb8d4
	NULL, /* CreateListenerW */
Packit 1fb8d4
	NULL, /* CreateListenerA */
Packit 1fb8d4
	NULL, /* SetListenerSecurityW */
Packit 1fb8d4
	NULL, /* SetListenerSecurityA */
Packit 1fb8d4
	NULL, /* GetListenerSecurityW */
Packit 1fb8d4
	NULL, /* GetListenerSecurityA */
Packit 1fb8d4
	NULL, /* EnableChildSessions */
Packit 1fb8d4
	NULL, /* IsChildSessionsEnabled */
Packit 1fb8d4
	NULL, /* GetChildSessionId */
Packit 1fb8d4
	NULL  /* GetActiveConsoleSessionId */
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
#define WTSAPI32_LOAD_PROC(_name, _type) \
Packit 1fb8d4
	WtsApi32_WtsApiFunctionTable.p ## _name = (## _type) GetProcAddress(g_WtsApi32Module, "WTS" #_name);
Packit 1fb8d4
Packit 1fb8d4
BOOL WtsApi32_InitializeWtsApi(void)
Packit 1fb8d4
{
Packit 1fb8d4
	g_WtsApi32Module = LoadLibraryA("wtsapi32.dll");
Packit 1fb8d4
Packit 1fb8d4
	if (!g_WtsApi32Module)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(StopRemoteControlSession, WTS_STOP_REMOTE_CONTROL_SESSION_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(StartRemoteControlSessionW, WTS_START_REMOTE_CONTROL_SESSION_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(StartRemoteControlSessionA, WTS_START_REMOTE_CONTROL_SESSION_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(ConnectSessionW, WTS_CONNECT_SESSION_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(ConnectSessionA, WTS_CONNECT_SESSION_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateServersW, WTS_ENUMERATE_SERVERS_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateServersA, WTS_ENUMERATE_SERVERS_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(OpenServerW, WTS_OPEN_SERVER_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(OpenServerA, WTS_OPEN_SERVER_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(OpenServerExW, WTS_OPEN_SERVER_EX_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(OpenServerExA, WTS_OPEN_SERVER_EX_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(CloseServer, WTS_CLOSE_SERVER_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateSessionsW, WTS_ENUMERATE_SESSIONS_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateSessionsA, WTS_ENUMERATE_SESSIONS_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateSessionsExW, WTS_ENUMERATE_SESSIONS_EX_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateSessionsExA, WTS_ENUMERATE_SESSIONS_EX_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateProcessesW, WTS_ENUMERATE_PROCESSES_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateProcessesA, WTS_ENUMERATE_PROCESSES_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(TerminateProcess, WTS_TERMINATE_PROCESS_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(QuerySessionInformationW, WTS_QUERY_SESSION_INFORMATION_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(QuerySessionInformationA, WTS_QUERY_SESSION_INFORMATION_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(QueryUserConfigW, WTS_QUERY_USER_CONFIG_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(QueryUserConfigA, WTS_QUERY_USER_CONFIG_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(SetUserConfigW, WTS_SET_USER_CONFIG_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(SetUserConfigA, WTS_SET_USER_CONFIG_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(SendMessageW, WTS_SEND_MESSAGE_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(SendMessageA, WTS_SEND_MESSAGE_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(DisconnectSession, WTS_DISCONNECT_SESSION_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(LogoffSession, WTS_LOGOFF_SESSION_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(ShutdownSystem, WTS_SHUTDOWN_SYSTEM_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(WaitSystemEvent, WTS_WAIT_SYSTEM_EVENT_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelOpen, WTS_VIRTUAL_CHANNEL_OPEN_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelOpenEx, WTS_VIRTUAL_CHANNEL_OPEN_EX_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelClose, WTS_VIRTUAL_CHANNEL_CLOSE_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelRead, WTS_VIRTUAL_CHANNEL_READ_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelWrite, WTS_VIRTUAL_CHANNEL_WRITE_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelPurgeInput, WTS_VIRTUAL_CHANNEL_PURGE_INPUT_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelPurgeOutput, WTS_VIRTUAL_CHANNEL_PURGE_OUTPUT_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(VirtualChannelQuery, WTS_VIRTUAL_CHANNEL_QUERY_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(FreeMemory, WTS_FREE_MEMORY_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(RegisterSessionNotification, WTS_REGISTER_SESSION_NOTIFICATION_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(UnRegisterSessionNotification, WTS_UNREGISTER_SESSION_NOTIFICATION_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(RegisterSessionNotificationEx, WTS_REGISTER_SESSION_NOTIFICATION_EX_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(UnRegisterSessionNotificationEx, WTS_UNREGISTER_SESSION_NOTIFICATION_EX_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(QueryUserToken, WTS_QUERY_USER_TOKEN_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(FreeMemoryExW, WTS_FREE_MEMORY_EX_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(FreeMemoryExA, WTS_FREE_MEMORY_EX_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateProcessesExW, WTS_ENUMERATE_PROCESSES_EX_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateProcessesExA, WTS_ENUMERATE_PROCESSES_EX_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateListenersW, WTS_ENUMERATE_LISTENERS_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnumerateListenersA, WTS_ENUMERATE_LISTENERS_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(QueryListenerConfigW, WTS_QUERY_LISTENER_CONFIG_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(QueryListenerConfigA, WTS_QUERY_LISTENER_CONFIG_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(CreateListenerW, WTS_CREATE_LISTENER_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(CreateListenerA, WTS_CREATE_LISTENER_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(SetListenerSecurityW, WTS_SET_LISTENER_SECURITY_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(SetListenerSecurityA, WTS_SET_LISTENER_SECURITY_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(GetListenerSecurityW, WTS_GET_LISTENER_SECURITY_FN_W);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(GetListenerSecurityA, WTS_GET_LISTENER_SECURITY_FN_A);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(EnableChildSessions, WTS_ENABLE_CHILD_SESSIONS_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(IsChildSessionsEnabled, WTS_IS_CHILD_SESSIONS_ENABLED_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(GetChildSessionId, WTS_GET_CHILD_SESSION_ID_FN);
Packit 1fb8d4
	WTSAPI32_LOAD_PROC(GetActiveConsoleSessionId, WTS_GET_ACTIVE_CONSOLE_SESSION_ID_FN);
Packit 1fb8d4
Packit 1fb8d4
	Win32_InitializeWinSta(&WtsApi32_WtsApiFunctionTable);
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
	g_WtsApi = &WtsApi32_WtsApiFunctionTable;
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* WtsApi Functions */
Packit 1fb8d4
Packit 1fb8d4
static BOOL CALLBACK InitializeWtsApiStubs(PINIT_ONCE once, PVOID param, PVOID *context);
Packit 1fb8d4
static INIT_ONCE wtsapiInitOnce = INIT_ONCE_STATIC_INIT;
Packit 1fb8d4
Packit 1fb8d4
#define WTSAPI_STUB_CALL_VOID(_name, ...) \
Packit 1fb8d4
	InitOnceExecuteOnce(&wtsapiInitOnce, InitializeWtsApiStubs, NULL, NULL); \
Packit 1fb8d4
	if (!g_WtsApi || !g_WtsApi->p ## _name) \
Packit 1fb8d4
		return; \
Packit 1fb8d4
	g_WtsApi->p ## _name ( __VA_ARGS__ )
Packit 1fb8d4
Packit 1fb8d4
#define WTSAPI_STUB_CALL_BOOL(_name, ...) \
Packit 1fb8d4
	InitOnceExecuteOnce(&wtsapiInitOnce, InitializeWtsApiStubs, NULL, NULL); \
Packit 1fb8d4
	if (!g_WtsApi || !g_WtsApi->p ## _name) \
Packit 1fb8d4
		return FALSE; \
Packit 1fb8d4
	return g_WtsApi->p ## _name ( __VA_ARGS__ )
Packit 1fb8d4
Packit 1fb8d4
#define WTSAPI_STUB_CALL_HANDLE(_name, ...) \
Packit 1fb8d4
	InitOnceExecuteOnce(&wtsapiInitOnce, InitializeWtsApiStubs, NULL, NULL); \
Packit 1fb8d4
	if (!g_WtsApi || !g_WtsApi->p ## _name) \
Packit 1fb8d4
		return NULL; \
Packit 1fb8d4
	return g_WtsApi->p ## _name ( __VA_ARGS__ )
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSStartRemoteControlSessionW(LPWSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(StartRemoteControlSessionW, pTargetServerName, TargetLogonId, HotkeyVk, HotkeyModifiers);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSStartRemoteControlSessionA(LPSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(StartRemoteControlSessionA, pTargetServerName, TargetLogonId, HotkeyVk, HotkeyModifiers);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSStartRemoteControlSessionExW(LPWSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers, DWORD flags)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(StartRemoteControlSessionExW, pTargetServerName, TargetLogonId, HotkeyVk, HotkeyModifiers, flags);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSStartRemoteControlSessionExA(LPSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers, DWORD flags)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(StartRemoteControlSessionExA, pTargetServerName, TargetLogonId, HotkeyVk, HotkeyModifiers, flags);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSStopRemoteControlSession(ULONG LogonId)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(StopRemoteControlSession, LogonId);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSConnectSessionW(ULONG LogonId, ULONG TargetLogonId, PWSTR pPassword, BOOL bWait)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(ConnectSessionW, LogonId, TargetLogonId, pPassword, bWait);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSConnectSessionA(ULONG LogonId, ULONG TargetLogonId, PSTR pPassword, BOOL bWait)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(ConnectSessionA, LogonId, TargetLogonId, pPassword, bWait);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateServersW(LPWSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOW* ppServerInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateServersW, pDomainName, Reserved, Version, ppServerInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateServersA(LPSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOA* ppServerInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateServersA, pDomainName, Reserved, Version, ppServerInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
HANDLE WINAPI WTSOpenServerW(LPWSTR pServerName)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_HANDLE(OpenServerW, pServerName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
HANDLE WINAPI WTSOpenServerA(LPSTR pServerName)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_HANDLE(OpenServerA, pServerName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
HANDLE WINAPI WTSOpenServerExW(LPWSTR pServerName)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_HANDLE(OpenServerExW, pServerName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
HANDLE WINAPI WTSOpenServerExA(LPSTR pServerName)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_HANDLE(OpenServerExA, pServerName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
VOID WINAPI WTSCloseServer(HANDLE hServer)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_VOID(CloseServer, hServer);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFOW* ppSessionInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateSessionsW, hServer, Reserved, Version, ppSessionInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateSessionsA(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFOA* ppSessionInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateSessionsA, hServer, Reserved, Version, ppSessionInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateSessionsExW(HANDLE hServer, DWORD* pLevel, DWORD Filter, PWTS_SESSION_INFO_1W* ppSessionInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateSessionsExW, hServer, pLevel, Filter, ppSessionInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateSessionsExA(HANDLE hServer, DWORD* pLevel, DWORD Filter, PWTS_SESSION_INFO_1A* ppSessionInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateSessionsExA, hServer, pLevel, Filter, ppSessionInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateProcessesW(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_PROCESS_INFOW* ppProcessInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateProcessesW, hServer, Reserved, Version, ppProcessInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateProcessesA(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_PROCESS_INFOA* ppProcessInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateProcessesA, hServer, Reserved, Version, ppProcessInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSTerminateProcess(HANDLE hServer, DWORD ProcessId, DWORD ExitCode)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(TerminateProcess, hServer, ProcessId, ExitCode);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSQuerySessionInformationW(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass, LPWSTR* ppBuffer, DWORD* pBytesReturned)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(QuerySessionInformationW, hServer, SessionId, WTSInfoClass, ppBuffer, pBytesReturned);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSQuerySessionInformationA(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass, LPSTR* ppBuffer, DWORD* pBytesReturned)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(QuerySessionInformationA, hServer, SessionId, WTSInfoClass, ppBuffer, pBytesReturned);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSQueryUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR* ppBuffer, DWORD* pBytesReturned)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(QueryUserConfigW, pServerName, pUserName, WTSConfigClass, ppBuffer, pBytesReturned);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSQueryUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR* ppBuffer, DWORD* pBytesReturned)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(QueryUserConfigA, pServerName, pUserName, WTSConfigClass, ppBuffer, pBytesReturned);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSSetUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR pBuffer, DWORD DataLength)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(SetUserConfigW, pServerName, pUserName, WTSConfigClass, pBuffer, DataLength);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSSetUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR pBuffer, DWORD DataLength)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(SetUserConfigA, pServerName, pUserName, WTSConfigClass, pBuffer, DataLength);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSSendMessageW(HANDLE hServer, DWORD SessionId, LPWSTR pTitle, DWORD TitleLength,
Packit 1fb8d4
							LPWSTR pMessage, DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD* pResponse, BOOL bWait)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(SendMessageW, hServer, SessionId, pTitle, TitleLength,
Packit 1fb8d4
						  pMessage, MessageLength, Style, Timeout, pResponse, bWait);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSSendMessageA(HANDLE hServer, DWORD SessionId, LPSTR pTitle, DWORD TitleLength,
Packit 1fb8d4
							LPSTR pMessage, DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD* pResponse, BOOL bWait)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(SendMessageA, hServer, SessionId, pTitle, TitleLength,
Packit 1fb8d4
						  pMessage, MessageLength, Style, Timeout, pResponse, bWait);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSDisconnectSession(HANDLE hServer, DWORD SessionId, BOOL bWait)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(DisconnectSession, hServer, SessionId, bWait);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSLogoffSession(HANDLE hServer, DWORD SessionId, BOOL bWait)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(LogoffSession, hServer, SessionId, bWait);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSShutdownSystem(HANDLE hServer, DWORD ShutdownFlag)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(ShutdownSystem, hServer, ShutdownFlag);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSWaitSystemEvent(HANDLE hServer, DWORD EventMask, DWORD* pEventFlags)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(WaitSystemEvent, hServer, EventMask, pEventFlags);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
HANDLE WINAPI WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPSTR pVirtualName)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_HANDLE(VirtualChannelOpen, hServer, SessionId, pVirtualName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
HANDLE WINAPI WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualName, DWORD flags)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_HANDLE(VirtualChannelOpenEx, SessionId, pVirtualName, flags);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSVirtualChannelClose(HANDLE hChannelHandle)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(VirtualChannelClose, hChannelHandle);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSVirtualChannelRead(HANDLE hChannelHandle, ULONG TimeOut, PCHAR Buffer, ULONG BufferSize, PULONG pBytesRead)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(VirtualChannelRead, hChannelHandle, TimeOut, Buffer, BufferSize, pBytesRead);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer, ULONG Length, PULONG pBytesWritten)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(VirtualChannelWrite, hChannelHandle, Buffer, Length, pBytesWritten);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSVirtualChannelPurgeInput(HANDLE hChannelHandle)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(VirtualChannelPurgeInput, hChannelHandle);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(VirtualChannelPurgeOutput, hChannelHandle);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLASS WtsVirtualClass, PVOID* ppBuffer, DWORD* pBytesReturned)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(VirtualChannelQuery, hChannelHandle, WtsVirtualClass, ppBuffer, pBytesReturned);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
VOID WINAPI WTSFreeMemory(PVOID pMemory)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_VOID(FreeMemory, pMemory);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSFreeMemoryExW(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory, ULONG NumberOfEntries)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(FreeMemoryExW, WTSTypeClass, pMemory, NumberOfEntries);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSFreeMemoryExA(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory, ULONG NumberOfEntries)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(FreeMemoryExA, WTSTypeClass, pMemory, NumberOfEntries);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(RegisterSessionNotification, hWnd, dwFlags);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(UnRegisterSessionNotification, hWnd);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSRegisterSessionNotificationEx(HANDLE hServer, HWND hWnd, DWORD dwFlags)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(RegisterSessionNotificationEx, hServer, hWnd, dwFlags);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSUnRegisterSessionNotificationEx(HANDLE hServer, HWND hWnd)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(UnRegisterSessionNotificationEx, hServer, hWnd);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSQueryUserToken(ULONG SessionId, PHANDLE phToken)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(QueryUserToken, SessionId, phToken);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateProcessesExW(HANDLE hServer, DWORD* pLevel, DWORD SessionId, LPWSTR* ppProcessInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateProcessesExW, hServer, pLevel, SessionId, ppProcessInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateProcessesExA(HANDLE hServer, DWORD* pLevel, DWORD SessionId, LPSTR* ppProcessInfo, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateProcessesExA, hServer, pLevel, SessionId, ppProcessInfo, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateListenersW(HANDLE hServer, PVOID pReserved, DWORD Reserved, PWTSLISTENERNAMEW pListeners, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateListenersW, hServer, pReserved, Reserved, pListeners, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSEnumerateListenersA(HANDLE hServer, PVOID pReserved, DWORD Reserved, PWTSLISTENERNAMEA pListeners, DWORD* pCount)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnumerateListenersA, hServer, pReserved, Reserved, pListeners, pCount);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSQueryListenerConfigW(HANDLE hServer, PVOID pReserved, DWORD Reserved, LPWSTR pListenerName, PWTSLISTENERCONFIGW pBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(QueryListenerConfigW, hServer, pReserved, Reserved, pListenerName, pBuffer);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSQueryListenerConfigA(HANDLE hServer, PVOID pReserved, DWORD Reserved, LPSTR pListenerName, PWTSLISTENERCONFIGA pBuffer)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(QueryListenerConfigA, hServer, pReserved, Reserved, pListenerName, pBuffer);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSCreateListenerW(HANDLE hServer, PVOID pReserved, DWORD Reserved,
Packit 1fb8d4
							   LPWSTR pListenerName, PWTSLISTENERCONFIGW pBuffer, DWORD flag)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(CreateListenerW, hServer, pReserved, Reserved, pListenerName, pBuffer, flag);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSCreateListenerA(HANDLE hServer, PVOID pReserved, DWORD Reserved,
Packit 1fb8d4
							   LPSTR pListenerName, PWTSLISTENERCONFIGA pBuffer, DWORD flag)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(CreateListenerA, hServer, pReserved, Reserved, pListenerName, pBuffer, flag);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSSetListenerSecurityW(HANDLE hServer, PVOID pReserved, DWORD Reserved,
Packit 1fb8d4
									LPWSTR pListenerName, SECURITY_INFORMATION SecurityInformation,
Packit 1fb8d4
									PSECURITY_DESCRIPTOR pSecurityDescriptor)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(SetListenerSecurityW, hServer, pReserved, Reserved,
Packit 1fb8d4
						  pListenerName, SecurityInformation, pSecurityDescriptor);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSSetListenerSecurityA(HANDLE hServer, PVOID pReserved, DWORD Reserved,
Packit 1fb8d4
									LPSTR pListenerName, SECURITY_INFORMATION SecurityInformation,
Packit 1fb8d4
									PSECURITY_DESCRIPTOR pSecurityDescriptor)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(SetListenerSecurityA, hServer, pReserved, Reserved,
Packit 1fb8d4
						  pListenerName, SecurityInformation, pSecurityDescriptor);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSGetListenerSecurityW(HANDLE hServer, PVOID pReserved, DWORD Reserved,
Packit 1fb8d4
									LPWSTR pListenerName, SECURITY_INFORMATION SecurityInformation,
Packit 1fb8d4
									PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, LPDWORD lpnLengthNeeded)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(GetListenerSecurityW, hServer, pReserved, Reserved, pListenerName,
Packit 1fb8d4
						  SecurityInformation, pSecurityDescriptor, nLength, lpnLengthNeeded);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WINAPI WTSGetListenerSecurityA(HANDLE hServer, PVOID pReserved, DWORD Reserved,
Packit 1fb8d4
									LPSTR pListenerName, SECURITY_INFORMATION SecurityInformation,
Packit 1fb8d4
									PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, LPDWORD lpnLengthNeeded)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(GetListenerSecurityA, hServer, pReserved, Reserved, pListenerName,
Packit 1fb8d4
						  SecurityInformation, pSecurityDescriptor, nLength, lpnLengthNeeded);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL CDECL WTSEnableChildSessions(BOOL bEnable)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(EnableChildSessions, bEnable);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL CDECL WTSIsChildSessionsEnabled(PBOOL pbEnabled)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(IsChildSessionsEnabled, pbEnabled);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL CDECL WTSGetChildSessionId(PULONG pSessionId)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(GetChildSessionId, pSessionId);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL CDECL WTSLogonUser(HANDLE hServer, LPCSTR username, LPCSTR password, LPCSTR domain)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(LogonUser, hServer, username, password, domain);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL CDECL WTSLogoffUser(HANDLE hServer)
Packit 1fb8d4
{
Packit 1fb8d4
	WTSAPI_STUB_CALL_BOOL(LogoffUser, hServer);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#ifndef _WIN32
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * WTSGetActiveConsoleSessionId is declared in WinBase.h and exported by kernel32.dll
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
DWORD WINAPI WTSGetActiveConsoleSessionId(void)
Packit 1fb8d4
{
Packit 1fb8d4
	InitOnceExecuteOnce(&wtsapiInitOnce, InitializeWtsApiStubs, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!g_WtsApi || !g_WtsApi->pGetActiveConsoleSessionId)
Packit 1fb8d4
		return 0xFFFFFFFF;
Packit 1fb8d4
Packit 1fb8d4
	return g_WtsApi->pGetActiveConsoleSessionId();
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
const CHAR* WTSErrorToString(UINT error)
Packit 1fb8d4
{
Packit 1fb8d4
	switch(error)
Packit 1fb8d4
	{
Packit 1fb8d4
	case CHANNEL_RC_OK:
Packit 1fb8d4
		return "CHANNEL_RC_OK";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_ALREADY_INITIALIZED:
Packit 1fb8d4
		return "CHANNEL_RC_ALREADY_INITIALIZED";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_NOT_INITIALIZED:
Packit 1fb8d4
		return "CHANNEL_RC_NOT_INITIALIZED";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_ALREADY_CONNECTED:
Packit 1fb8d4
		return "CHANNEL_RC_ALREADY_CONNECTED";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_NOT_CONNECTED:
Packit 1fb8d4
		return "CHANNEL_RC_NOT_CONNECTED";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_TOO_MANY_CHANNELS:
Packit 1fb8d4
		return "CHANNEL_RC_TOO_MANY_CHANNELS";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_BAD_CHANNEL:
Packit 1fb8d4
		return "CHANNEL_RC_BAD_CHANNEL";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_BAD_CHANNEL_HANDLE:
Packit 1fb8d4
		return "CHANNEL_RC_BAD_CHANNEL_HANDLE";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_NO_BUFFER:
Packit 1fb8d4
		return "CHANNEL_RC_NO_BUFFER";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_BAD_INIT_HANDLE:
Packit 1fb8d4
		return "CHANNEL_RC_BAD_INIT_HANDLE";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_NOT_OPEN:
Packit 1fb8d4
		return "CHANNEL_RC_NOT_OPEN";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_BAD_PROC:
Packit 1fb8d4
		return "CHANNEL_RC_BAD_PROC";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_NO_MEMORY:
Packit 1fb8d4
		return "CHANNEL_RC_NO_MEMORY";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_UNKNOWN_CHANNEL_NAME:
Packit 1fb8d4
		return "CHANNEL_RC_UNKNOWN_CHANNEL_NAME";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_ALREADY_OPEN:
Packit 1fb8d4
		return "CHANNEL_RC_ALREADY_OPEN";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_NOT_IN_VIRTUALCHANNELENTRY:
Packit 1fb8d4
		return "CHANNEL_RC_NOT_IN_VIRTUALCHANNELENTRY";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_NULL_DATA:
Packit 1fb8d4
		return "CHANNEL_RC_NULL_DATA";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_ZERO_LENGTH:
Packit 1fb8d4
		return "CHANNEL_RC_ZERO_LENGTH";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_INVALID_INSTANCE:
Packit 1fb8d4
		return "CHANNEL_RC_INVALID_INSTANCE";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_UNSUPPORTED_VERSION:
Packit 1fb8d4
		return "CHANNEL_RC_UNSUPPORTED_VERSION";
Packit 1fb8d4
Packit 1fb8d4
	case CHANNEL_RC_INITIALIZATION_ERROR:
Packit 1fb8d4
		return "CHANNEL_RC_INITIALIZATION_ERROR";
Packit 1fb8d4
Packit 1fb8d4
	default:
Packit 1fb8d4
		return "UNKNOWN";
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
const CHAR* WTSSessionStateToString(WTS_CONNECTSTATE_CLASS state)
Packit 1fb8d4
{
Packit 1fb8d4
	switch (state)
Packit 1fb8d4
	{
Packit 1fb8d4
	case WTSActive:
Packit 1fb8d4
		return "WTSActive";
Packit 1fb8d4
	case WTSConnected:
Packit 1fb8d4
		return "WTSConnected";
Packit 1fb8d4
	case WTSConnectQuery:
Packit 1fb8d4
		return "WTSConnectQuery";
Packit 1fb8d4
	case WTSShadow:
Packit 1fb8d4
		return "WTSShadow";
Packit 1fb8d4
	case WTSDisconnected:
Packit 1fb8d4
		return "WTSDisconnected";
Packit 1fb8d4
	case WTSIdle:
Packit 1fb8d4
		return "WTSIdle";
Packit 1fb8d4
	case WTSListen:
Packit 1fb8d4
		return "WTSListen";
Packit 1fb8d4
	case WTSReset:
Packit 1fb8d4
		return "WTSReset";
Packit 1fb8d4
	case WTSDown:
Packit 1fb8d4
		return "WTSDown";
Packit 1fb8d4
	case WTSInit:
Packit 1fb8d4
		return "WTSInit";
Packit 1fb8d4
	}
Packit 1fb8d4
	return "INVALID_STATE";
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WTSRegisterWtsApiFunctionTable(PWtsApiFunctionTable table)
Packit 1fb8d4
{
Packit 1fb8d4
	/* Use InitOnceExecuteOnce here as well - otherwise a table set with this
Packit 1fb8d4
	   function is overriden on the first use of a WTS* API call (due to
Packit 1fb8d4
	   wtsapiInitOnce not being set). */
Packit 1fb8d4
	InitOnceExecuteOnce(&wtsapiInitOnce, InitializeWtsApiStubs, (PVOID)table, NULL);
Packit 1fb8d4
	if (!g_WtsApi)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL LoadAndInitialize(char* library)
Packit 1fb8d4
{
Packit 1fb8d4
	INIT_WTSAPI_FN pInitWtsApi;
Packit 1fb8d4
	g_WtsApiModule = LoadLibraryA(library);
Packit 1fb8d4
Packit 1fb8d4
	if (!g_WtsApiModule)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	pInitWtsApi = (INIT_WTSAPI_FN) GetProcAddress(g_WtsApiModule, "InitWtsApi");
Packit 1fb8d4
Packit 1fb8d4
	if (!pInitWtsApi)
Packit 1fb8d4
	{
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	g_WtsApi = pInitWtsApi();
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static void InitializeWtsApiStubs_Env()
Packit 1fb8d4
{
Packit 1fb8d4
	DWORD nSize;
Packit 1fb8d4
	char *env = NULL;
Packit 1fb8d4
	LPCSTR wts = "WTSAPI_LIBRARY";
Packit 1fb8d4
Packit 1fb8d4
	if (g_WtsApi)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	nSize = GetEnvironmentVariableA(wts, NULL, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (!nSize)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	env = (LPSTR) malloc(nSize);
Packit 1fb8d4
	if (env)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (GetEnvironmentVariableA(wts, env, nSize) == nSize - 1)
Packit 1fb8d4
			LoadAndInitialize(env);
Packit 1fb8d4
		free(env);
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#define FREERDS_LIBRARY_NAME "libfreerds-fdsapi.so"
Packit 1fb8d4
Packit 1fb8d4
static void InitializeWtsApiStubs_FreeRDS()
Packit 1fb8d4
{
Packit 1fb8d4
	wIniFile* ini;
Packit 1fb8d4
	const char* prefix;
Packit 1fb8d4
	const char* libdir;
Packit 1fb8d4
Packit 1fb8d4
	if (g_WtsApi)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	ini = IniFile_New();
Packit 1fb8d4
Packit 1fb8d4
	if (IniFile_ReadFile(ini, "/var/run/freerds.instance") < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		IniFile_Free(ini);
Packit 1fb8d4
		WLog_ERR(TAG, "failed to parse freerds.instance");
Packit 1fb8d4
		LoadAndInitialize(FREERDS_LIBRARY_NAME);
Packit 1fb8d4
		return;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	prefix = IniFile_GetKeyValueString(ini, "FreeRDS", "prefix");
Packit 1fb8d4
	libdir = IniFile_GetKeyValueString(ini, "FreeRDS", "libdir");
Packit 1fb8d4
	WLog_INFO(TAG, "FreeRDS (prefix / libdir): %s / %s", prefix, libdir);
Packit 1fb8d4
Packit 1fb8d4
	if (prefix && libdir)
Packit 1fb8d4
	{
Packit 1fb8d4
		char* prefix_libdir;
Packit 1fb8d4
		char* wtsapi_library;
Packit 1fb8d4
		prefix_libdir = GetCombinedPath(prefix, libdir);
Packit 1fb8d4
		wtsapi_library = GetCombinedPath(prefix_libdir, FREERDS_LIBRARY_NAME);
Packit 1fb8d4
Packit 1fb8d4
		if (wtsapi_library)
Packit 1fb8d4
		{
Packit 1fb8d4
			LoadAndInitialize(wtsapi_library);
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		free(prefix_libdir);
Packit 1fb8d4
		free(wtsapi_library);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	IniFile_Free(ini);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
static BOOL CALLBACK InitializeWtsApiStubs(PINIT_ONCE once, PVOID param, PVOID *context)
Packit 1fb8d4
{
Packit 1fb8d4
	if (param)
Packit 1fb8d4
	{
Packit 1fb8d4
		g_WtsApi = (PWtsApiFunctionTable)param;
Packit 1fb8d4
		return TRUE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	InitializeWtsApiStubs_Env();
Packit 1fb8d4
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
	WtsApi32_InitializeWtsApi();
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
	if (!g_WtsApi)
Packit 1fb8d4
		InitializeWtsApiStubs_FreeRDS();
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}