1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW-w64 API
5  *
6  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7  * Source: $(DRUNTIMESRC core/sys/windows/_wtsapi32.d)
8  */
9 /// Automatically imported and edited from the druntime module
10 /// core.sys.windows.wtsapi32 for the auto-generated win32 package.
11 module win32.wtsapi32;
12 //version (Windows):
13 @system:
14 
15 version (ANSI) {} else version = Unicode;
16 version (Win32_UseLib) pragma(lib, "wtsapi32");
17 import win32.w32api;
18 import win32.windef;
19 
20 enum {
21     WTS_CURRENT_SERVER        = null,
22     WTS_CURRENT_SERVER_HANDLE = null,
23     WTS_CURRENT_SERVER_NAME   = null
24 }
25 
26 enum DWORD WTS_CURRENT_SESSION = cast(DWORD) -1;
27 
28 enum {
29     IDTIMEOUT = 32000,
30     IDASYNC   = 32001
31 }
32 
33 enum {
34     WTS_WSD_LOGOFF     = 0x01,
35     WTS_WSD_SHUTDOWN   = 0x02,
36     WTS_WSD_REBOOT     = 0x04,
37     WTS_WSD_POWEROFF   = 0x08,
38     WTS_WSD_FASTREBOOT = 0x10
39 }
40 
41 enum WTS_CONNECTSTATE_CLASS {
42     WTSActive,
43     WTSConnected,
44     WTSConnectQuery,
45     WTSShadow,
46     WTSDisconnected,
47     WTSIdle,
48     WTSListen,
49     WTSReset,
50     WTSDown,
51     WTSInit
52 }
53 
54 struct WTS_SERVER_INFOW {
55     LPWSTR pServerName;
56 }
57 alias WTS_SERVER_INFOW* PWTS_SERVER_INFOW;
58 
59 struct WTS_SERVER_INFOA {
60     LPSTR pServerName;
61 }
62 alias WTS_SERVER_INFOA* PWTS_SERVER_INFOA;
63 
64 version (Unicode) {
65     alias WTS_SERVER_INFOW  WTS_SERVER_INFO;
66     alias PWTS_SERVER_INFOW PWTS_SERVER_INFO;
67 } else {
68     alias WTS_SERVER_INFOA  WTS_SERVER_INFO;
69     alias PWTS_SERVER_INFOA PWTS_SERVER_INFO;
70 }
71 
72 struct WTS_SESSION_INFOW {
73     DWORD SessionId;
74     LPWSTR pWinStationName;
75     WTS_CONNECTSTATE_CLASS State;
76 }
77 alias WTS_SESSION_INFOW* PWTS_SESSION_INFOW;
78 
79 struct WTS_SESSION_INFOA {
80     DWORD SessionId;
81     LPSTR pWinStationName;
82     WTS_CONNECTSTATE_CLASS State;
83 }
84 alias WTS_SESSION_INFOA* PWTS_SESSION_INFOA;
85 
86 version (Unicode) {
87     alias WTS_SESSION_INFOW  WTS_SESSION_INFO;
88     alias PWTS_SESSION_INFOW PWTS_SESSION_INFO;
89 } else {
90     alias WTS_SESSION_INFOA  WTS_SESSION_INFO;
91     alias PWTS_SESSION_INFOA PWTS_SESSION_INFO;
92 }
93 
94 struct WTS_PROCESS_INFOW {
95     DWORD SessionId;
96     DWORD ProcessId;
97     LPWSTR pProcessName;
98     PSID pUserSid;
99 }
100 alias WTS_PROCESS_INFOW* PWTS_PROCESS_INFOW;
101 
102 struct WTS_PROCESS_INFOA {
103     DWORD SessionId;
104     DWORD ProcessId;
105     LPSTR pProcessName;
106     PSID pUserSid;
107 }
108 alias WTS_PROCESS_INFOA* PWTS_PROCESS_INFOA;
109 
110 version (Unicode) {
111     alias WTS_PROCESS_INFOW  WTS_PROCESS_INFO;
112     alias PWTS_PROCESS_INFOW PWTS_PROCESS_INFO;
113 } else {
114     alias WTS_PROCESS_INFOA  WTS_PROCESS_INFO;
115     alias PWTS_PROCESS_INFOA PWTS_PROCESS_INFO;
116 }
117 
118 enum {
119     WTS_PROTOCOL_TYPE_CONSOLE,
120     WTS_PROTOCOL_TYPE_ICA,
121     WTS_PROTOCOL_TYPE_RDP
122 }
123 
124 enum WTS_INFO_CLASS {
125     WTSInitialProgram,
126     WTSApplicationName,
127     WTSWorkingDirectory,
128     WTSOEMId,
129     WTSSessionId,
130     WTSUserName,
131     WTSWinStationName,
132     WTSDomainName,
133     WTSConnectState,
134     WTSClientBuildNumber,
135     WTSClientName,
136     WTSClientDirectory,
137     WTSClientProductId,
138     WTSClientHardwareId,
139     WTSClientAddress,
140     WTSClientDisplay,
141     WTSClientProtocolType,
142     WTSIdleTime,
143     WTSLogonTime,
144     WTSIncomingBytes,
145     WTSOutgoingBytes,
146     WTSIncomingFrames,
147     WTSOutgoingFrames,
148     WTSClientInfo,
149     WTSSessionInfo, // = 24
150 }
151 
152 struct WTS_CLIENT_ADDRESS {
153     DWORD    AddressFamily;
154     BYTE[20] Address;
155 }
156 alias WTS_CLIENT_ADDRESS* PWTS_CLIENT_ADDRESS;
157 
158 struct WTS_CLIENT_DISPLAY {
159     DWORD HorizontalResolution;
160     DWORD VerticalResolution;
161     DWORD ColorDepth;
162 }
163 alias WTS_CLIENT_DISPLAY* PWTS_CLIENT_DISPLAY;
164 
165 enum WTS_CONFIG_CLASS {
166     WTSUserConfigInitialProgram,
167     WTSUserConfigWorkingDirectory,
168     WTSUserConfigfInheritInitialProgram,
169     WTSUserConfigfAllowLogonTerminalServer,
170     WTSUserConfigTimeoutSettingsConnections,
171     WTSUserConfigTimeoutSettingsDisconnections,
172     WTSUserConfigTimeoutSettingsIdle,
173     WTSUserConfigfDeviceClientDrives,
174     WTSUserConfigfDeviceClientPrinters,
175     WTSUserConfigfDeviceClientDefaultPrinter,
176     WTSUserConfigBrokenTimeoutSettings,
177     WTSUserConfigReconnectSettings,
178     WTSUserConfigModemCallbackSettings,
179     WTSUserConfigModemCallbackPhoneNumber,
180     WTSUserConfigShadowingSettings,
181     WTSUserConfigTerminalServerProfilePath,
182     WTSUserConfigTerminalServerHomeDir,
183     WTSUserConfigTerminalServerHomeDirDrive,
184     WTSUserConfigfTerminalServerRemoteHomeDir
185 }
186 
187 enum {
188     WTS_EVENT_NONE        = 0x0,
189     WTS_EVENT_CREATE      = 0x1,
190     WTS_EVENT_DELETE      = 0x2,
191     WTS_EVENT_RENAME      = 0x4,
192     WTS_EVENT_CONNECT     = 0x8,
193     WTS_EVENT_DISCONNECT  = 0x10,
194     WTS_EVENT_LOGON       = 0x20,
195     WTS_EVENT_LOGOFF      = 0x40,
196     WTS_EVENT_STATECHANGE = 0x80,
197     WTS_EVENT_LICENSE     = 0x100,
198     WTS_EVENT_ALL         = 0x7fffffff,
199     WTS_EVENT_FLUSH       = 0x80000000
200 }
201 
202 enum WTS_VIRTUAL_CLASS {
203     WTSVirtualClientData,
204     WTSVirtualFileHandle
205 }
206 
207 version (Unicode) {
208     alias WTSEnumerateServersW WTSEnumerateServers;
209     alias WTSOpenServerW WTSOpenServer;
210     alias WTSEnumerateSessionsW WTSEnumerateSessions;
211     alias WTSEnumerateProcessesW WTSEnumerateProcesses;
212     alias WTSQuerySessionInformationW WTSQuerySessionInformation;
213     alias WTSQueryUserConfigW WTSQueryUserConfig;
214     alias WTSSetUserConfigW WTSSetUserConfig;
215     alias WTSSendMessageW WTSSendMessage;
216 } else {
217     alias WTSEnumerateServersA WTSEnumerateServers;
218     alias WTSOpenServerA WTSOpenServer;
219     alias WTSEnumerateSessionsA WTSEnumerateSessions;
220     alias WTSEnumerateProcessesA WTSEnumerateProcesses;
221     alias WTSQuerySessionInformationA WTSQuerySessionInformation;
222     alias WTSQueryUserConfigA WTSQueryUserConfig;
223     alias WTSSetUserConfigA WTSSetUserConfig;
224     alias WTSSendMessageA WTSSendMessage;
225 }
226 
227 extern(Windows) {
228     WINBOOL WTSEnumerateServersW(LPWSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOW* ppServerInfo, DWORD* pCount);
229     WINBOOL WTSEnumerateServersA(LPSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOA* ppServerInfo, DWORD* pCount);
230     HANDLE WTSOpenServerW(LPWSTR pServerName);
231     HANDLE WTSOpenServerA(LPSTR pServerName);
232     VOID WTSCloseServer(HANDLE hServer);
233     WINBOOL WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFOW* ppSessionInfo, DWORD* pCount);
234     WINBOOL WTSEnumerateSessionsA(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFOA* ppSessionInfo, DWORD* pCount);
235     WINBOOL WTSEnumerateProcessesW(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_PROCESS_INFOW* ppProcessInfo, DWORD* pCount);
236     WINBOOL WTSEnumerateProcessesA(HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_PROCESS_INFOA* ppProcessInfo, DWORD* pCount);
237     WINBOOL WTSTerminateProcess(HANDLE hServer, DWORD ProcessId, DWORD ExitCode);
238     WINBOOL WTSQuerySessionInformationW(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass, LPWSTR* ppBuffer, DWORD* pBytesReturned);
239     WINBOOL WTSQuerySessionInformationA(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass, LPSTR* ppBuffer, DWORD* pBytesReturned);
240     WINBOOL WTSQueryUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR* ppBuffer, DWORD* pBytesReturned);
241     WINBOOL WTSQueryUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR* ppBuffer, DWORD* pBytesReturned);
242     WINBOOL WTSSetUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR pBuffer, DWORD DataLength);
243     WINBOOL WTSSetUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR pBuffer, DWORD DataLength);
244     WINBOOL WTSSendMessageW(HANDLE hServer, DWORD SessionId, LPWSTR pTitle, DWORD TitleLength, LPWSTR pMessage, DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD* pResponse, WINBOOL bWait);
245     WINBOOL WTSSendMessageA(HANDLE hServer, DWORD SessionId, LPSTR pTitle, DWORD TitleLength, LPSTR pMessage, DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD* pResponse, WINBOOL bWait);
246     WINBOOL WTSDisconnectSession(HANDLE hServer, DWORD SessionId, WINBOOL bWait);
247     WINBOOL WTSLogoffSession(HANDLE hServer, DWORD SessionId, WINBOOL bWait);
248     WINBOOL WTSShutdownSystem(HANDLE hServer, DWORD ShutdownFlag);
249     WINBOOL WTSWaitSystemEvent(HANDLE hServer, DWORD EventMask, DWORD* pEventFlags);
250     HANDLE WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPSTR pVirtualName);
251     WINBOOL WTSVirtualChannelClose(HANDLE hChannelHandle);
252     WINBOOL WTSVirtualChannelRead(HANDLE hChannelHandle, ULONG TimeOut, PCHAR Buffer, ULONG BufferSize, PULONG pBytesRead);
253     WINBOOL WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer, ULONG Length, PULONG pBytesWritten);
254     WINBOOL WTSVirtualChannelPurgeInput(HANDLE hChannelHandle);
255     WINBOOL WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle);
256     WINBOOL WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLASS, PVOID* ppBuffer, DWORD* pBytesReturned);
257     VOID WTSFreeMemory(PVOID pMemory);
258 
259     WINBOOL WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags);
260     WINBOOL WTSUnRegisterSessionNotification(HWND hWnd);
261     WINBOOL WTSQueryUserToken(ULONG SessionId, PHANDLE phToken);
262 }
263 
264 enum {
265     NOTIFY_FOR_ALL_SESSIONS = 1,
266     NOTIFY_FOR_THIS_SESSION = 0
267 }
268 
269 enum {
270     USERNAME_LENGTH       = 20,
271     CLIENTNAME_LENGTH     = 20,
272     CLIENTADDRESS_LENGTH  = 30,
273     WINSTATIONNAME_LENGTH = 32,
274     DOMAIN_LENGTH         = 17
275 }
276 
277 static if (_WIN32_WINNT >= 0x600) {
278     struct WTSCLIENTW {
279         WCHAR[CLIENTNAME_LENGTH + 1]      ClientName = 0;
280         WCHAR[DOMAIN_LENGTH + 1]          Domain = 0;
281         WCHAR[USERNAME_LENGTH + 1]        UserName = 0;
282         WCHAR[MAX_PATH + 1]               WorkDirectory = 0;
283         WCHAR[MAX_PATH + 1]               InitialProgram = 0;
284         BYTE                              EncryptionLevel;
285         ULONG                             ClientAddressFamily;
286         USHORT[CLIENTADDRESS_LENGTH + 1]  ClientAddress;
287         USHORT                            HRes;
288         USHORT                            VRes;
289         USHORT                            ColorDepth;
290         WCHAR[MAX_PATH + 1]               ClientDirectory = 0;
291         ULONG                             ClientBuildNumber;
292         ULONG                             ClientHardwareId;
293         USHORT                            ClientProductId;
294         USHORT                            OutBufCountHost;
295         USHORT                            OutBufCountClient;
296         USHORT                            OutBufLength;
297         WCHAR[MAX_PATH + 1]               DeviceId = 0;
298     }
299     alias WTSCLIENTW* PWTSCLIENTW;
300 
301     struct WTSCLIENTA {
302         CHAR[CLIENTNAME_LENGTH + 1]       ClientName = 0;
303         CHAR[DOMAIN_LENGTH + 1 ]          Domain = 0;
304         CHAR[USERNAME_LENGTH + 1]         UserName = 0;
305         CHAR[MAX_PATH + 1]                WorkDirectory = 0;
306         CHAR[MAX_PATH + 1]                InitialProgram = 0;
307         BYTE                              EncryptionLevel;
308         ULONG                             ClientAddressFamily;
309         USHORT[CLIENTADDRESS_LENGTH + 1]  ClientAddress;
310         USHORT                            HRes;
311         USHORT                            VRes;
312         USHORT                            ColorDepth;
313         CHAR[MAX_PATH + 1]                ClientDirectory = 0;
314         ULONG                             ClientBuildNumber;
315         ULONG                             ClientHardwareId;
316         USHORT                            ClientProductId;
317         USHORT                            OutBufCountHost;
318         USHORT                            OutBufCountClient;
319         USHORT                            OutBufLength;
320         CHAR[MAX_PATH + 1]                DeviceId = 0;
321     }
322     alias WTSCLIENTA* PWTSCLIENTA;
323 
324     version (Unicode) {
325         alias WTSCLIENTW  WTSCLIENT;
326         alias PWTSCLIENTW PWTSCLIENT;
327     } else {
328         alias WTSCLIENTA  WTSCLIENT;
329         alias PWTSCLIENTA PWTSCLIENT;
330     }
331 
332     struct WTSINFOW {
333         WTS_CONNECTSTATE_CLASS       State;
334         DWORD                        SessionId;
335         DWORD                        IncomingBytes;
336         DWORD                        OutgoingBytes;
337         DWORD                        IncomingFrames;
338         DWORD                        OutgoingFrames;
339         DWORD                        IncomingCompressedBytes;
340         DWORD                        OutgoingCompressedBytes;
341         WCHAR[WINSTATIONNAME_LENGTH] WinStationName = 0;
342         WCHAR[DOMAIN_LENGTH]         Domain = 0;
343         WCHAR[USERNAME_LENGTH+1]     UserName = 0;
344         LARGE_INTEGER                ConnectTime;
345         LARGE_INTEGER                DisconnectTime;
346         LARGE_INTEGER                LastInputTime;
347         LARGE_INTEGER                LogonTime;
348         LARGE_INTEGER                CurrentTime;
349     }
350     alias WTSINFOW* PWTSINFOW;
351 
352     struct WTSINFOA {
353         WTS_CONNECTSTATE_CLASS      State;
354         DWORD                       SessionId;
355         DWORD                       IncomingBytes;
356         DWORD                       OutgoingBytes;
357         DWORD                       IncomingFrames;
358         DWORD                       OutgoingFrames;
359         DWORD                       IncomingCompressedBytes;
360         DWORD                       OutgoingCompressedBytes;
361         CHAR[WINSTATIONNAME_LENGTH] WinStationName = 0;
362         CHAR[DOMAIN_LENGTH]         Domain = 0;
363         CHAR[USERNAME_LENGTH+1]     UserName = 0;
364         LARGE_INTEGER               ConnectTime;
365         LARGE_INTEGER               DisconnectTime;
366         LARGE_INTEGER               LastInputTime;
367         LARGE_INTEGER               LogonTime;
368         LARGE_INTEGER               CurrentTime;
369     }
370     alias WTSINFOA* PWTSINFOA;
371 
372     version (Unicode) {
373         alias WTSINFOW  WTSINFO;
374         alias PWTSINFOW PWTSINFO;
375     } else {
376         alias WTSINFOA  WTSINFO;
377         alias PWTSINFOA PWTSINFO;
378     }
379 
380     extern(Windows) {
381         WINBOOL WTSConnectSessionA(
382             ULONG LogonId,
383             ULONG TargetLogonId,
384             PSTR   pPassword,
385             WINBOOL bWait
386         );
387 
388         WINBOOL WTSConnectSessionW(
389             ULONG LogonId,
390             ULONG TargetLogonId,
391             PWSTR  pPassword,
392             WINBOOL bWait
393         );
394 
395         WINBOOL WTSRegisterSessionNotificationEx(
396             HANDLE hServer,
397             HWND hWnd,
398             DWORD dwFlags
399         );
400 
401         WINBOOL WTSStartRemoteControlSessionA(
402             LPSTR pTargetServerName,
403             ULONG TargetLogonId,
404             BYTE HotkeyVk,
405             USHORT HotkeyModifiers
406         );
407 
408         WINBOOL WTSStartRemoteControlSessionW(
409             LPWSTR pTargetServerName,
410             ULONG TargetLogonId,
411             BYTE HotkeyVk,
412             USHORT HotkeyModifiers
413         );
414 
415         version (Unicode) {
416             alias WTSStartRemoteControlSessionW WTSStartRemoteControlSession;
417             alias WTSConnectSessionW WTSConnectSession;
418         } else {
419             alias WTSStartRemoteControlSessionA WTSStartRemoteControlSession;
420             alias WTSConnectSessionA WTSConnectSession;
421         }
422 
423         WINBOOL WTSStopRemoteControlSession(
424             ULONG LogonId
425         );
426 
427         WINBOOL WTSUnRegisterSessionNotificationEx(
428             HANDLE hServer,
429             HWND hWnd
430         );
431 
432         HANDLE WTSVirtualChannelOpenEx(
433             DWORD SessionId,
434             LPSTR pVirtualName,
435             DWORD flags
436         );
437     } /* extern(Windows) */
438 } /* static if (_WIN32_WINNT >= 0x600) */