1 use core::ptr::null_mut;
2 use crate::ntrtl::RTL_TIME_ZONE_INFORMATION;
3 use winapi::shared::basetsd::SIZE_T;
4 use winapi::shared::minwindef::{BYTE, DWORD, FILETIME};
5 use winapi::shared::ntdef::{
6     BOOLEAN, CHAR, HANDLE, LARGE_INTEGER, LONG, PULONG, PVOID, PWSTR, UCHAR, ULONG, UNICODE_STRING,
7     USHORT, WCHAR,
8 };
9 use winapi::shared::windef::HWND;
10 use winapi::um::winnt::{PSID, STANDARD_RIGHTS_REQUIRED};
11 pub const WINSTATION_QUERY: u32 = 0x00000001;
12 pub const WINSTATION_SET: u32 = 0x00000002;
13 pub const WINSTATION_RESET: u32 = 0x00000004;
14 pub const WINSTATION_VIRTUAL: u32 = 0x00000008;
15 pub const WINSTATION_SHADOW: u32 = 0x00000010;
16 pub const WINSTATION_LOGON: u32 = 0x00000020;
17 pub const WINSTATION_LOGOFF: u32 = 0x00000040;
18 pub const WINSTATION_MSG: u32 = 0x00000080;
19 pub const WINSTATION_CONNECT: u32 = 0x00000100;
20 pub const WINSTATION_DISCONNECT: u32 = 0x00000200;
21 pub const WINSTATION_GUEST_ACCESS: u32 = WINSTATION_LOGON;
22 pub const WINSTATION_CURRENT_GUEST_ACCESS: u32 = WINSTATION_VIRTUAL | WINSTATION_LOGOFF;
23 pub const WINSTATION_USER_ACCESS: u32 =
24     WINSTATION_GUEST_ACCESS | WINSTATION_QUERY | WINSTATION_CONNECT;
25 pub const WINSTATION_CURRENT_USER_ACCESS: u32 = WINSTATION_SET | WINSTATION_RESET
26     | WINSTATION_VIRTUAL | WINSTATION_LOGOFF | WINSTATION_DISCONNECT;
27 pub const WINSTATION_ALL_ACCESS: u32 = STANDARD_RIGHTS_REQUIRED | WINSTATION_QUERY | WINSTATION_SET
28     | WINSTATION_RESET | WINSTATION_VIRTUAL | WINSTATION_SHADOW | WINSTATION_LOGON | WINSTATION_MSG
29     | WINSTATION_CONNECT | WINSTATION_DISCONNECT;
30 pub const WDPREFIX_LENGTH: usize = 12;
31 pub const CALLBACK_LENGTH: usize = 50;
32 pub const DLLNAME_LENGTH: usize = 32;
33 pub const CDNAME_LENGTH: usize = 32;
34 pub const WDNAME_LENGTH: usize = 32;
35 pub const PDNAME_LENGTH: usize = 32;
36 pub const DEVICENAME_LENGTH: usize = 128;
37 pub const MODEMNAME_LENGTH: usize = DEVICENAME_LENGTH;
38 pub const STACK_ADDRESS_LENGTH: usize = 128;
39 pub const MAX_BR_NAME: usize = 65;
40 pub const DIRECTORY_LENGTH: usize = 256;
41 pub const INITIALPROGRAM_LENGTH: usize = 256;
42 pub const USERNAME_LENGTH: usize = 20;
43 pub const DOMAIN_LENGTH: usize = 17;
44 pub const PASSWORD_LENGTH: usize = 14;
45 pub const NASISPECIFICNAME_LENGTH: usize = 14;
46 pub const NASIUSERNAME_LENGTH: usize = 47;
47 pub const NASIPASSWORD_LENGTH: usize = 24;
48 pub const NASISESSIONNAME_LENGTH: usize = 16;
49 pub const NASIFILESERVER_LENGTH: usize = 47;
50 pub const CLIENTDATANAME_LENGTH: usize = 7;
51 pub const CLIENTNAME_LENGTH: usize = 20;
52 pub const CLIENTADDRESS_LENGTH: usize = 30;
53 pub const IMEFILENAME_LENGTH: usize = 32;
54 pub const CLIENTLICENSE_LENGTH: usize = 32;
55 pub const CLIENTMODEM_LENGTH: usize = 40;
56 pub const CLIENT_PRODUCT_ID_LENGTH: usize = 32;
57 pub const MAX_COUNTER_EXTENSIONS: u32 = 2;
58 pub const WINSTATIONNAME_LENGTH: usize = 32;
59 pub const TERMSRV_TOTAL_SESSIONS: u32 = 1;
60 pub const TERMSRV_DISC_SESSIONS: u32 = 2;
61 pub const TERMSRV_RECON_SESSIONS: u32 = 3;
62 pub const TERMSRV_CURRENT_ACTIVE_SESSIONS: u32 = 4;
63 pub const TERMSRV_CURRENT_DISC_SESSIONS: u32 = 5;
64 pub const TERMSRV_PENDING_SESSIONS: u32 = 6;
65 pub const TERMSRV_SUCC_TOTAL_LOGONS: u32 = 7;
66 pub const TERMSRV_SUCC_LOCAL_LOGONS: u32 = 8;
67 pub const TERMSRV_SUCC_REMOTE_LOGONS: u32 = 9;
68 pub const TERMSRV_SUCC_SESSION0_LOGONS: u32 = 10;
69 pub const TERMSRV_CURRENT_TERMINATING_SESSIONS: u32 = 11;
70 pub const TERMSRV_CURRENT_LOGGEDON_SESSIONS: u32 = 12;
71 pub type PTS_TIME_ZONE_INFORMATION = *mut RTL_TIME_ZONE_INFORMATION;
72 pub type TS_TIME_ZONE_INFORMATION = RTL_TIME_ZONE_INFORMATION;
73 pub type WINSTATIONNAME = [WCHAR; WINSTATIONNAME_LENGTH + 1];
74 STRUCT!{struct VARDATA_WIRE {
75     Size: USHORT,
76     Offset: USHORT,
77 }}
78 pub type PVARDATA_WIRE = *mut VARDATA_WIRE;
79 ENUM!{enum WINSTATIONSTATECLASS {
80     State_Active = 0,
81     State_Connected = 1,
82     State_ConnectQuery = 2,
83     State_Shadow = 3,
84     State_Disconnected = 4,
85     State_Idle = 5,
86     State_Listen = 6,
87     State_Reset = 7,
88     State_Down = 8,
89     State_Init = 9,
90 }}
91 UNION!{union SESSIONIDW_u {
92     SessionId: ULONG,
93     LogonId: ULONG,
94 }}
95 STRUCT!{struct SESSIONIDW {
96     u: SESSIONIDW_u,
97     WinStationName: WINSTATIONNAME,
98     State: WINSTATIONSTATECLASS,
99 }}
100 pub type PSESSIONIDW = *mut SESSIONIDW;
101 ENUM!{enum WINSTATIONINFOCLASS {
102     WinStationCreateData = 0,
103     WinStationConfiguration = 1,
104     WinStationPdParams = 2,
105     WinStationWd = 3,
106     WinStationPd = 4,
107     WinStationPrinter = 5,
108     WinStationClient = 6,
109     WinStationModules = 7,
110     WinStationInformation = 8,
111     WinStationTrace = 9,
112     WinStationBeep = 10,
113     WinStationEncryptionOff = 11,
114     WinStationEncryptionPerm = 12,
115     WinStationNtSecurity = 13,
116     WinStationUserToken = 14,
117     WinStationUnused1 = 15,
118     WinStationVideoData = 16,
119     WinStationInitialProgram = 17,
120     WinStationCd = 18,
121     WinStationSystemTrace = 19,
122     WinStationVirtualData = 20,
123     WinStationClientData = 21,
124     WinStationSecureDesktopEnter = 22,
125     WinStationSecureDesktopExit = 23,
126     WinStationLoadBalanceSessionTarget = 24,
127     WinStationLoadIndicator = 25,
128     WinStationShadowInfo = 26,
129     WinStationDigProductId = 27,
130     WinStationLockedState = 28,
131     WinStationRemoteAddress = 29,
132     WinStationIdleTime = 30,
133     WinStationLastReconnectType = 31,
134     WinStationDisallowAutoReconnect = 32,
135     WinStationMprNotifyInfo = 33,
136     WinStationExecSrvSystemPipe = 34,
137     WinStationSmartCardAutoLogon = 35,
138     WinStationIsAdminLoggedOn = 36,
139     WinStationReconnectedFromId = 37,
140     WinStationEffectsPolicy = 38,
141     WinStationType = 39,
142     WinStationInformationEx = 40,
143     WinStationValidationInfo = 41,
144 }}
145 STRUCT!{struct WINSTATIONCREATE {
146     Bitfields: ULONG,
147     MaxInstanceCount: ULONG,
148 }}
149 BITFIELD!{WINSTATIONCREATE Bitfields: ULONG [
150     fEnableWinStation set_fEnableWinStation[0..1],
151 ]}
152 pub type PWINSTATIONCREATE = *mut WINSTATIONCREATE;
153 STRUCT!{struct WINSTACONFIGWIRE {
154     Comment: [WCHAR; 61],
155     OEMId: [CHAR; 4],
156     UserConfig: VARDATA_WIRE,
157     NewFields: VARDATA_WIRE,
158 }}
159 pub type PWINSTACONFIGWIRE = *mut WINSTACONFIGWIRE;
160 ENUM!{enum CALLBACKCLASS {
161     Callback_Disable = 0,
162     Callback_Roving = 1,
163     Callback_Fixed = 2,
164 }}
165 ENUM!{enum SHADOWCLASS {
166     Shadow_Disable = 0,
167     Shadow_EnableInputNotify = 1,
168     Shadow_EnableInputNoNotify = 2,
169     Shadow_EnableNoInputNotify = 3,
170     Shadow_EnableNoInputNoNotify = 4,
171 }}
172 STRUCT!{struct USERCONFIG {
173     Bitfields: ULONG,
174     Bitfields2: ULONG,
175     UserName: [WCHAR; USERNAME_LENGTH + 1],
176     Domain: [WCHAR; DOMAIN_LENGTH + 1],
177     Password: [WCHAR; PASSWORD_LENGTH + 1],
178     WorkDirectory: [WCHAR; DIRECTORY_LENGTH + 1],
179     InitialProgram: [WCHAR; INITIALPROGRAM_LENGTH + 1],
180     CallbackNumber: [WCHAR; CALLBACK_LENGTH + 1],
181     Callback: CALLBACKCLASS,
182     Shadow: SHADOWCLASS,
183     MaxConnectionTime: ULONG,
184     MaxDisconnectionTime: ULONG,
185     MaxIdleTime: ULONG,
186     KeyboardLayout: ULONG,
187     MinEncryptionLevel: BYTE,
188     NWLogonServer: [WCHAR; NASIFILESERVER_LENGTH + 1],
189     PublishedName: [WCHAR; MAX_BR_NAME],
190     WFProfilePath: [WCHAR; DIRECTORY_LENGTH + 1],
191     WFHomeDir: [WCHAR; DIRECTORY_LENGTH + 1],
192     WFHomeDirDrive: [WCHAR; 4],
193 }}
194 BITFIELD!{USERCONFIG Bitfields: ULONG [
195     fInheritAutoLogon set_fInheritAutoLogon[0..1],
196     fInheritResetBroken set_fInheritResetBroken[1..2],
197     fInheritReconnectSame set_fInheritReconnectSame[2..3],
198     fInheritInitialProgram set_fInheritInitialProgram[3..4],
199     fInheritCallback set_fInheritCallback[4..5],
200     fInheritCallbackNumber set_fInheritCallbackNumber[5..6],
201     fInheritShadow set_fInheritShadow[6..7],
202     fInheritMaxSessionTime set_fInheritMaxSessionTime[7..8],
203     fInheritMaxDisconnectionTime set_fInheritMaxDisconnectionTime[8..9],
204     fInheritMaxIdleTime set_fInheritMaxIdleTime[9..10],
205     fInheritAutoClient set_fInheritAutoClient[10..11],
206     fInheritSecurity set_fInheritSecurity[11..12],
207     fPromptForPassword set_fPromptForPassword[12..13],
208     fResetBroken set_fResetBroken[13..14],
209     fReconnectSame set_fReconnectSame[14..15],
210     fLogonDisabled set_fLogonDisabled[15..16],
211     fWallPaperDisabled set_fWallPaperDisabled[16..17],
212     fAutoClientDrives set_fAutoClientDrives[17..18],
213     fAutoClientLpts set_fAutoClientLpts[18..19],
214     fForceClientLptDef set_fForceClientLptDef[19..20],
215     fRequireEncryption set_fRequireEncryption[20..21],
216     fDisableEncryption set_fDisableEncryption[21..22],
217     fUnused1 set_fUnused1[22..23],
218     fHomeDirectoryMapRoot set_fHomeDirectoryMapRoot[23..24],
219     fUseDefaultGina set_fUseDefaultGina[24..25],
220     fCursorBlinkDisabled set_fCursorBlinkDisabled[25..26],
221     fPublishedApp set_fPublishedApp[26..27],
222     fHideTitleBar set_fHideTitleBar[27..28],
223     fMaximize set_fMaximize[28..29],
224     fDisableCpm set_fDisableCpm[29..30],
225     fDisableCdm set_fDisableCdm[30..31],
226     fDisableCcm set_fDisableCcm[31..32],
227 ]}
228 BITFIELD!{USERCONFIG Bitfields2: ULONG [
229     fDisableLPT set_fDisableLPT[0..1],
230     fDisableClip set_fDisableClip[1..2],
231     fDisableExe set_fDisableExe[2..3],
232     fDisableCam set_fDisableCam[3..4],
233     fDisableAutoReconnect set_fDisableAutoReconnect[4..5],
234     ColorDepth set_ColorDepth[5..6],
235     fInheritColorDepth set_fInheritColorDepth[6..7],
236     fErrorInvalidProfile set_fErrorInvalidProfile[7..8],
237     fPasswordIsScPin set_fPasswordIsScPin[8..9],
238     fDisablePNPRedir set_fDisablePNPRedir[9..10],
239 ]}
240 pub type PUSERCONFIG = *mut USERCONFIG;
241 ENUM!{enum SDCLASS {
242     SdNone = 0,
243     SdConsole = 1,
244     SdNetwork = 2,
245     SdAsync = 3,
246     SdOemTransport = 4,
247 }}
248 pub type DEVICENAME = [WCHAR; DEVICENAME_LENGTH + 1];
249 pub type MODEMNAME = [WCHAR; MODEMNAME_LENGTH + 1];
250 pub type NASISPECIFICNAME = [WCHAR; NASISPECIFICNAME_LENGTH + 1];
251 pub type NASIUSERNAME = [WCHAR; NASIUSERNAME_LENGTH + 1];
252 pub type NASIPASSWORD = [WCHAR; NASIPASSWORD_LENGTH + 1];
253 pub type NASISESIONNAME = [WCHAR; NASISESSIONNAME_LENGTH + 1];
254 pub type NASIFILESERVER = [WCHAR; NASIFILESERVER_LENGTH + 1];
255 pub type WDNAME = [WCHAR; WDNAME_LENGTH + 1];
256 pub type WDPREFIX = [WCHAR; WDPREFIX_LENGTH + 1];
257 pub type CDNAME = [WCHAR; CDNAME_LENGTH + 1];
258 pub type DLLNAME = [WCHAR; DLLNAME_LENGTH + 1];
259 pub type PDNAME = [WCHAR; PDNAME_LENGTH + 1];
260 STRUCT!{struct NETWORKCONFIG {
261     LanAdapter: LONG,
262     NetworkName: DEVICENAME,
263     Flags: ULONG,
264 }}
265 pub type PNETWORKCONFIG = *mut NETWORKCONFIG;
266 ENUM!{enum FLOWCONTROLCLASS {
267     FlowControl_None = 0,
268     FlowControl_Hardware = 1,
269     FlowControl_Software = 2,
270 }}
271 ENUM!{enum RECEIVEFLOWCONTROLCLASS {
272     ReceiveFlowControl_None = 0,
273     ReceiveFlowControl_RTS = 1,
274     ReceiveFlowControl_DTR = 2,
275 }}
276 ENUM!{enum TRANSMITFLOWCONTROLCLASS {
277     TransmitFlowControl_None = 0,
278     TransmitFlowControl_CTS = 1,
279     TransmitFlowControl_DSR = 2,
280 }}
281 ENUM!{enum ASYNCCONNECTCLASS {
282     Connect_CTS = 0,
283     Connect_DSR = 1,
284     Connect_RI = 2,
285     Connect_DCD = 3,
286     Connect_FirstChar = 4,
287     Connect_Perm = 5,
288 }}
289 STRUCT!{struct FLOWCONTROLCONFIG {
290     Bitfields: ULONG,
291     XonChar: CHAR,
292     XoffChar: CHAR,
293     Type: FLOWCONTROLCLASS,
294     HardwareReceive: RECEIVEFLOWCONTROLCLASS,
295     HardwareTransmit: TRANSMITFLOWCONTROLCLASS,
296 }}
297 BITFIELD!{FLOWCONTROLCONFIG Bitfields: ULONG [
298     fEnableSoftwareTx set_fEnableSoftwareTx[0..1],
299     fEnableSoftwareRx set_fEnableSoftwareRx[1..2],
300     fEnableDTR set_fEnableDTR[2..3],
301     fEnableRTS set_fEnableRTS[3..4],
302 ]}
303 pub type PFLOWCONTROLCONFIG = *mut FLOWCONTROLCONFIG;
304 STRUCT!{struct CONNECTCONFIG {
305     Type: ASYNCCONNECTCLASS,
306     Bitfields: ULONG,
307 }}
308 BITFIELD!{CONNECTCONFIG Bitfields: ULONG [
309     fEnableBreakDisconnect set_fEnableBreakDisconnect[0..1],
310 ]}
311 pub type PCONNECTCONFIG = *mut CONNECTCONFIG;
312 STRUCT!{struct ASYNCCONFIG {
313     DeviceName: DEVICENAME,
314     ModemName: MODEMNAME,
315     BaudRate: ULONG,
316     Parity: ULONG,
317     StopBits: ULONG,
318     ByteSize: ULONG,
319     Bitfields: ULONG,
320     FlowControl: FLOWCONTROLCONFIG,
321     Connect: CONNECTCONFIG,
322 }}
323 BITFIELD!{ASYNCCONFIG Bitfields: ULONG [
324     fEnableDsrSensitivity set_fEnableDsrSensitivity[0..1],
325     fConnectionDriver set_fConnectionDriver[1..2],
326 ]}
327 pub type PASYNCCONFIG = *mut ASYNCCONFIG;
328 STRUCT!{struct NASICONFIG {
329     SpecificName: NASISPECIFICNAME,
330     UserName: NASIUSERNAME,
331     PassWord: NASIPASSWORD,
332     SessionName: NASISESIONNAME,
333     FileServer: NASIFILESERVER,
334     GlobalSession: BOOLEAN,
335 }}
336 pub type PNASICONFIG = *mut NASICONFIG;
337 STRUCT!{struct OEMTDCONFIG {
338     Adapter: LONG,
339     DeviceName: DEVICENAME,
340     Flags: ULONG,
341 }}
342 pub type POEMTDCONFIG = *mut OEMTDCONFIG;
343 UNION!{union PDPARAMS_u {
344     Network: NETWORKCONFIG,
345     Async: ASYNCCONFIG,
346     Nasi: NASICONFIG,
347     OemTd: OEMTDCONFIG,
348 }}
349 STRUCT!{struct PDPARAMS {
350     SdClass: SDCLASS,
351     u: PDPARAMS_u,
352 }}
353 pub type PPDPARAMS = *mut PDPARAMS;
354 STRUCT!{struct WDCONFIG {
355     WdName: WDNAME,
356     WdDLL: DLLNAME,
357     WsxDLL: DLLNAME,
358     WdFlag: ULONG,
359     WdInputBufferLength: ULONG,
360     CfgDLL: DLLNAME,
361     WdPrefix: WDPREFIX,
362 }}
363 pub type PWDCONFIG = *mut WDCONFIG;
364 STRUCT!{struct PDCONFIG2 {
365     PdName: PDNAME,
366     SdClass: SDCLASS,
367     PdDLL: DLLNAME,
368     PdFlag: ULONG,
369     OutBufLength: ULONG,
370     OutBufCount: ULONG,
371     OutBufDelay: ULONG,
372     InteractiveDelay: ULONG,
373     PortNumber: ULONG,
374     KeepAliveTimeout: ULONG,
375 }}
376 pub type PPDCONFIG2 = *mut PDCONFIG2;
377 STRUCT!{struct WINSTATIONCLIENT {
378     Bitfields: ULONG,
379     ClientName: [WCHAR; CLIENTNAME_LENGTH + 1],
380     Domain: [WCHAR; DOMAIN_LENGTH + 1],
381     UserName: [WCHAR; USERNAME_LENGTH + 1],
382     Password: [WCHAR; PASSWORD_LENGTH + 1],
383     WorkDirectory: [WCHAR; DIRECTORY_LENGTH + 1],
384     InitialProgram: [WCHAR; INITIALPROGRAM_LENGTH + 1],
385     SerialNumber: ULONG,
386     EncryptionLevel: BYTE,
387     ClientAddressFamily: ULONG,
388     ClientAddress: [WCHAR; CLIENTADDRESS_LENGTH + 1],
389     HRes: USHORT,
390     VRes: USHORT,
391     ColorDepth: USHORT,
392     ProtocolType: USHORT,
393     KeyboardLayout: ULONG,
394     KeyboardType: ULONG,
395     KeyboardSubType: ULONG,
396     KeyboardFunctionKey: ULONG,
397     ImeFileName: [WCHAR; IMEFILENAME_LENGTH + 1],
398     ClientDirectory: [WCHAR; DIRECTORY_LENGTH + 1],
399     ClientLicense: [WCHAR; CLIENTLICENSE_LENGTH + 1],
400     ClientModem: [WCHAR; CLIENTMODEM_LENGTH + 1],
401     ClientBuildNumber: ULONG,
402     ClientHardwareId: ULONG,
403     ClientProductId: USHORT,
404     OutBufCountHost: USHORT,
405     OutBufCountClient: USHORT,
406     OutBufLength: USHORT,
407     AudioDriverName: [WCHAR; 9],
408     ClientTimeZone: TS_TIME_ZONE_INFORMATION,
409     ClientSessionId: ULONG,
410     ClientDigProductId: [WCHAR; CLIENT_PRODUCT_ID_LENGTH],
411     PerformanceFlags: ULONG,
412     ActiveInputLocale: ULONG,
413 }}
414 BITFIELD!{WINSTATIONCLIENT Bitfields: ULONG [
415     fTextOnly set_fTextOnly[0..1],
416     fDisableCtrlAltDel set_fDisableCtrlAltDel[1..2],
417     fMouse set_fMouse[2..3],
418     fDoubleClickDetect set_fDoubleClickDetect[3..4],
419     fINetClient set_fINetClient[4..5],
420     fPromptForPassword set_fPromptForPassword[5..6],
421     fMaximizeShell set_fMaximizeShell[6..7],
422     fEnableWindowsKey set_fEnableWindowsKey[7..8],
423     fRemoteConsoleAudio set_fRemoteConsoleAudio[8..9],
424     fPasswordIsScPin set_fPasswordIsScPin[9..10],
425     fNoAudioPlayback set_fNoAudioPlayback[10..11],
426     fUsingSavedCreds set_fUsingSavedCreds[11..12],
427 ]}
428 pub type PWINSTATIONCLIENT = *mut WINSTATIONCLIENT;
429 STRUCT!{struct TSHARE_COUNTERS {
430     Reserved: ULONG,
431 }}
432 pub type PTSHARE_COUNTERS = *mut TSHARE_COUNTERS;
433 UNION!{union PROTOCOLCOUNTERS_Specific {
434     TShareCounters: TSHARE_COUNTERS,
435     Reserved: [ULONG; 100],
436 }}
437 STRUCT!{struct PROTOCOLCOUNTERS {
438     WdBytes: ULONG,
439     WdFrames: ULONG,
440     WaitForOutBuf: ULONG,
441     Frames: ULONG,
442     Bytes: ULONG,
443     CompressedBytes: ULONG,
444     CompressFlushes: ULONG,
445     Errors: ULONG,
446     Timeouts: ULONG,
447     AsyncFramingError: ULONG,
448     AsyncOverrunError: ULONG,
449     AsyncOverflowError: ULONG,
450     AsyncParityError: ULONG,
451     TdErrors: ULONG,
452     ProtocolType: USHORT,
453     Length: USHORT,
454     Specific: PROTOCOLCOUNTERS_Specific,
455 }}
456 pub type PPROTOCOLCOUNTERS = *mut PROTOCOLCOUNTERS;
457 STRUCT!{struct THINWIRECACHE {
458     CacheReads: ULONG,
459     CacheHits: ULONG,
460 }}
461 pub type PTHINWIRECACHE = *mut THINWIRECACHE;
462 pub const MAX_THINWIRECACHE: usize = 4;
463 STRUCT!{struct RESERVED_CACHE {
464     ThinWireCache: [THINWIRECACHE; MAX_THINWIRECACHE],
465 }}
466 pub type PRESERVED_CACHE = *mut RESERVED_CACHE;
467 STRUCT!{struct TSHARE_CACHE {
468     Reserved: ULONG,
469 }}
470 pub type PTSHARE_CACHE = *mut TSHARE_CACHE;
471 UNION!{union CACHE_STATISTICS_Specific {
472     ReservedCacheStats: RESERVED_CACHE,
473     TShareCacheStats: TSHARE_CACHE,
474     Reserved: [ULONG; 20],
475 }}
476 STRUCT!{struct CACHE_STATISTICS {
477     ProtocolType: USHORT,
478     Length: USHORT,
479     Specific: CACHE_STATISTICS_Specific,
480 }}
481 pub type PCACHE_STATISTICS = *mut CACHE_STATISTICS;
482 STRUCT!{struct PROTOCOLSTATUS {
483     Output: PROTOCOLCOUNTERS,
484     Input: PROTOCOLCOUNTERS,
485     Cache: CACHE_STATISTICS,
486     AsyncSignal: ULONG,
487     AsyncSignalMask: ULONG,
488 }}
489 pub type PPROTOCOLSTATUS = *mut PROTOCOLSTATUS;
490 STRUCT!{struct WINSTATIONINFORMATION {
491     ConnectState: WINSTATIONSTATECLASS,
492     WinStationName: WINSTATIONNAME,
493     LogonId: ULONG,
494     ConnectTime: LARGE_INTEGER,
495     DisconnectTime: LARGE_INTEGER,
496     LastInputTime: LARGE_INTEGER,
497     LogonTime: LARGE_INTEGER,
498     Status: PROTOCOLSTATUS,
499     Domain: [WCHAR; DOMAIN_LENGTH + 1],
500     UserName: [WCHAR; USERNAME_LENGTH + 1],
501     CurrentTime: LARGE_INTEGER,
502 }}
503 pub type PWINSTATIONINFORMATION = *mut WINSTATIONINFORMATION;
504 STRUCT!{struct WINSTATIONUSERTOKEN {
505     ProcessId: HANDLE,
506     ThreadId: HANDLE,
507     UserToken: HANDLE,
508 }}
509 pub type PWINSTATIONUSERTOKEN = *mut WINSTATIONUSERTOKEN;
510 STRUCT!{struct WINSTATIONVIDEODATA {
511     HResolution: USHORT,
512     VResolution: USHORT,
513     fColorDepth: USHORT,
514 }}
515 pub type PWINSTATIONVIDEODATA = *mut WINSTATIONVIDEODATA;
516 ENUM!{enum CDCLASS {
517     CdNone = 0,
518     CdModem = 1,
519     CdClass_Maximum = 2,
520 }}
521 STRUCT!{struct CDCONFIG {
522     CdClass: CDCLASS,
523     CdName: CDNAME,
524     CdDLL: DLLNAME,
525     CdFlag: ULONG,
526 }}
527 pub type PCDCONFIG = *mut CDCONFIG;
528 pub type CLIENTDATANAME = [CHAR; CLIENTDATANAME_LENGTH + 1];
529 pub type PCLIENTDATANAME = *mut CHAR;
530 STRUCT!{struct WINSTATIONCLIENTDATA {
531     DataName: CLIENTDATANAME,
532     fUnicodeData: BOOLEAN,
533 }}
534 pub type PWINSTATIONCLIENTDATA = *mut WINSTATIONCLIENTDATA;
535 ENUM!{enum LOADFACTORTYPE {
536     ErrorConstraint = 0,
537     PagedPoolConstraint = 1,
538     NonPagedPoolConstraint = 2,
539     AvailablePagesConstraint = 3,
540     SystemPtesConstraint = 4,
541     CPUConstraint = 5,
542 }}
543 STRUCT!{struct WINSTATIONLOADINDICATORDATA {
544     RemainingSessionCapacity: ULONG,
545     LoadFactor: LOADFACTORTYPE,
546     TotalSessions: ULONG,
547     DisconnectedSessions: ULONG,
548     IdleCPU: LARGE_INTEGER,
549     TotalCPU: LARGE_INTEGER,
550     RawSessionCapacity: ULONG,
551     reserved: [ULONG; 9],
552 }}
553 pub type PWINSTATIONLOADINDICATORDATA = *mut WINSTATIONLOADINDICATORDATA;
554 ENUM!{enum SHADOWSTATECLASS {
555     State_NoShadow = 0,
556     State_Shadowing = 1,
557     State_Shadowed = 2,
558 }}
559 STRUCT!{struct WINSTATIONSHADOW {
560     ShadowState: SHADOWSTATECLASS,
561     ShadowClass: SHADOWCLASS,
562     SessionId: ULONG,
563     ProtocolType: ULONG,
564 }}
565 pub type PWINSTATIONSHADOW = *mut WINSTATIONSHADOW;
566 STRUCT!{struct WINSTATIONPRODID {
567     DigProductId: [WCHAR; CLIENT_PRODUCT_ID_LENGTH],
568     ClientDigProductId: [WCHAR; CLIENT_PRODUCT_ID_LENGTH],
569     OuterMostDigProductId: [WCHAR; CLIENT_PRODUCT_ID_LENGTH],
570     CurrentSessionId: ULONG,
571     ClientSessionId: ULONG,
572     OuterMostSessionId: ULONG,
573 }}
574 pub type PWINSTATIONPRODID = *mut WINSTATIONPRODID;
575 STRUCT!{struct WINSTATIONREMOTEADDRESS_u_ipv4 {
576     sin_port: USHORT,
577     sin_addr: ULONG,
578     sin_zero: [UCHAR; 8],
579 }}
580 STRUCT!{struct WINSTATIONREMOTEADDRESS_u_ipv6 {
581     sin6_port: USHORT,
582     sin6_flowinfo: ULONG,
583     sin6_addr: [USHORT; 8],
584     sin6_scope_id: ULONG,
585 }}
586 UNION!{union WINSTATIONREMOTEADDRESS_u {
587     ipv4: WINSTATIONREMOTEADDRESS_u_ipv4,
588     ipv6: WINSTATIONREMOTEADDRESS_u_ipv6,
589 }}
590 STRUCT!{struct WINSTATIONREMOTEADDRESS {
591     sin_family: USHORT,
592     u: WINSTATIONREMOTEADDRESS_u,
593 }}
594 pub type PWINSTATIONREMOTEADDRESS = *mut WINSTATIONREMOTEADDRESS;
595 STRUCT!{struct WINSTATIONINFORMATIONEX_LEVEL1 {
596     SessionId: ULONG,
597     SessionState: WINSTATIONSTATECLASS,
598     SessionFlags: LONG,
599     WinStationName: WINSTATIONNAME,
600     UserName: [WCHAR; USERNAME_LENGTH + 1],
601     DomainName: [WCHAR; DOMAIN_LENGTH + 1],
602     LogonTime: LARGE_INTEGER,
603     ConnectTime: LARGE_INTEGER,
604     DisconnectTime: LARGE_INTEGER,
605     LastInputTime: LARGE_INTEGER,
606     CurrentTime: LARGE_INTEGER,
607     ProtocolStatus: PROTOCOLSTATUS,
608 }}
609 pub type PWINSTATIONINFORMATIONEX_LEVEL1 = *mut WINSTATIONINFORMATIONEX_LEVEL1;
610 STRUCT!{struct WINSTATIONINFORMATIONEX_LEVEL2 {
611     SessionId: ULONG,
612     SessionState: WINSTATIONSTATECLASS,
613     SessionFlags: LONG,
614     WinStationName: WINSTATIONNAME,
615     SamCompatibleUserName: [WCHAR; USERNAME_LENGTH + 1],
616     SamCompatibleDomainName: [WCHAR; DOMAIN_LENGTH + 1],
617     LogonTime: LARGE_INTEGER,
618     ConnectTime: LARGE_INTEGER,
619     DisconnectTime: LARGE_INTEGER,
620     LastInputTime: LARGE_INTEGER,
621     CurrentTime: LARGE_INTEGER,
622     ProtocolStatus: PROTOCOLSTATUS,
623     UserName: [WCHAR; 257],
624     DomainName: [WCHAR; 256],
625 }}
626 pub type PWINSTATIONINFORMATIONEX_LEVEL2 = *mut WINSTATIONINFORMATIONEX_LEVEL2;
627 UNION!{union WINSTATIONINFORMATIONEX_LEVEL {
628     WinStationInfoExLevel1: WINSTATIONINFORMATIONEX_LEVEL1,
629     WinStationInfoExLevel2: WINSTATIONINFORMATIONEX_LEVEL2,
630 }}
631 pub type PWINSTATIONINFORMATIONEX_LEVEL = *mut WINSTATIONINFORMATIONEX_LEVEL;
632 STRUCT!{struct WINSTATIONINFORMATIONEX {
633     Level: ULONG,
634     Data: WINSTATIONINFORMATIONEX_LEVEL,
635 }}
636 pub type PWINSTATIONINFORMATIONEX = *mut WINSTATIONINFORMATIONEX;
637 pub const TS_PROCESS_INFO_MAGIC_NT4: u32 = 0x23495452;
638 STRUCT!{struct TS_PROCESS_INFORMATION_NT4 {
639     MagicNumber: ULONG,
640     LogonId: ULONG,
641     ProcessSid: PVOID,
642     Pad: ULONG,
643 }}
644 pub type PTS_PROCESS_INFORMATION_NT4 = *mut TS_PROCESS_INFORMATION_NT4;
645 pub const SIZEOF_TS4_SYSTEM_THREAD_INFORMATION: u32 = 64;
646 pub const SIZEOF_TS4_SYSTEM_PROCESS_INFORMATION: u32 = 136;
647 STRUCT!{struct TS_SYS_PROCESS_INFORMATION {
648     NextEntryOffset: ULONG,
649     NumberOfThreads: ULONG,
650     SpareLi1: LARGE_INTEGER,
651     SpareLi2: LARGE_INTEGER,
652     SpareLi3: LARGE_INTEGER,
653     CreateTime: LARGE_INTEGER,
654     UserTime: LARGE_INTEGER,
655     KernelTime: LARGE_INTEGER,
656     ImageName: UNICODE_STRING,
657     BasePriority: LONG,
658     UniqueProcessId: ULONG,
659     InheritedFromUniqueProcessId: ULONG,
660     HandleCount: ULONG,
661     SessionId: ULONG,
662     SpareUl3: ULONG,
663     PeakVirtualSize: SIZE_T,
664     VirtualSize: SIZE_T,
665     PageFaultCount: ULONG,
666     PeakWorkingSetSize: ULONG,
667     WorkingSetSize: ULONG,
668     QuotaPeakPagedPoolUsage: SIZE_T,
669     QuotaPagedPoolUsage: SIZE_T,
670     QuotaPeakNonPagedPoolUsage: SIZE_T,
671     QuotaNonPagedPoolUsage: SIZE_T,
672     PagefileUsage: SIZE_T,
673     PeakPagefileUsage: SIZE_T,
674     PrivatePageCount: SIZE_T,
675 }}
676 pub type PTS_SYS_PROCESS_INFORMATION = *mut TS_SYS_PROCESS_INFORMATION;
677 STRUCT!{struct TS_ALL_PROCESSES_INFO {
678     pTsProcessInfo: PTS_SYS_PROCESS_INFORMATION,
679     SizeOfSid: ULONG,
680     pSid: PSID,
681 }}
682 pub type PTS_ALL_PROCESSES_INFO = *mut TS_ALL_PROCESSES_INFO;
683 STRUCT!{struct TS_COUNTER_HEADER {
684     dwCounterID: DWORD,
685     bResult: BOOLEAN,
686 }}
687 pub type PTS_COUNTER_HEADER = *mut TS_COUNTER_HEADER;
688 STRUCT!{struct TS_COUNTER {
689     CounterHead: TS_COUNTER_HEADER,
690     dwValue: DWORD,
691     StartTime: LARGE_INTEGER,
692 }}
693 pub type PTS_COUNTER = *mut TS_COUNTER;
694 pub const WSD_LOGOFF: ULONG = 0x1;
695 pub const WSD_SHUTDOWN: ULONG = 0x2;
696 pub const WSD_REBOOT: ULONG = 0x4;
697 pub const WSD_POWEROFF: ULONG = 0x8;
698 pub const WEVENT_NONE: ULONG = 0x0;
699 pub const WEVENT_CREATE: ULONG = 0x1;
700 pub const WEVENT_DELETE: ULONG = 0x2;
701 pub const WEVENT_RENAME: ULONG = 0x4;
702 pub const WEVENT_CONNECT: ULONG = 0x8;
703 pub const WEVENT_DISCONNECT: ULONG = 0x10;
704 pub const WEVENT_LOGON: ULONG = 0x20;
705 pub const WEVENT_LOGOFF: ULONG = 0x40;
706 pub const WEVENT_STATECHANGE: ULONG = 0x80;
707 pub const WEVENT_LICENSE: ULONG = 0x100;
708 pub const WEVENT_ALL: ULONG = 0x7fffffff;
709 pub const WEVENT_FLUSH: ULONG = 0x80000000;
710 pub const KBDSHIFT: USHORT = 0x1;
711 pub const KBDCTRL: USHORT = 0x2;
712 pub const KBDALT: USHORT = 0x4;
713 pub const WNOTIFY_ALL_SESSIONS: ULONG = 0x1;
714 pub const LOGONID_CURRENT: i32 = -1;
715 pub const SERVERNAME_CURRENT: PWSTR = null_mut();
716 EXTERN!{extern "system" {
717     fn WinStationFreeMemory(
718         Buffer: PVOID,
719     ) -> BOOLEAN;
720     fn WinStationOpenServerW(
721         ServerName: PWSTR,
722     ) -> HANDLE;
723     fn WinStationCloseServer(
724         ServerHandle: HANDLE,
725     ) -> BOOLEAN;
726     fn WinStationServerPing(
727         ServerHandle: HANDLE,
728     ) -> BOOLEAN;
729     fn WinStationGetTermSrvCountersValue(
730         ServerHandle: HANDLE,
731         Count: ULONG,
732         Counters: PTS_COUNTER,
733     ) -> BOOLEAN;
734     fn WinStationShutdownSystem(
735         ServerHandle: HANDLE,
736         ShutdownFlags: ULONG,
737     ) -> BOOLEAN;
738     fn WinStationWaitSystemEvent(
739         ServerHandle: HANDLE,
740         EventMask: ULONG,
741         EventFlags: PULONG,
742     ) -> BOOLEAN;
743     fn WinStationRegisterConsoleNotification(
744         ServerHandle: HANDLE,
745         WindowHandle: HWND,
746         Flags: ULONG,
747     ) -> BOOLEAN;
748     fn WinStationUnRegisterConsoleNotification(
749         ServerHandle: HANDLE,
750         WindowHandle: HWND,
751     ) -> BOOLEAN;
752     fn WinStationEnumerateW(
753         ServerHandle: HANDLE,
754         SessionIds: *mut PSESSIONIDW,
755         Count: PULONG,
756     ) -> BOOLEAN;
757     fn WinStationQueryInformationW(
758         ServerHandle: HANDLE,
759         SessionId: ULONG,
760         WinStationInformationClass: WINSTATIONINFOCLASS,
761         pWinStationInformation: PVOID,
762         WinStationInformationLength: ULONG,
763         pReturnLength: PULONG,
764     ) -> BOOLEAN;
765     fn WinStationSetInformationW(
766         ServerHandle: HANDLE,
767         SessionId: ULONG,
768         WinStationInformationClass: WINSTATIONINFOCLASS,
769         pWinStationInformation: PVOID,
770         WinStationInformationLength: ULONG,
771     ) -> BOOLEAN;
772     fn WinStationNameFromLogonIdW(
773         ServerHandle: HANDLE,
774         SessionId: ULONG,
775         pWinStationName: PWSTR,
776     ) -> BOOLEAN;
777     fn WinStationSendMessageW(
778         ServerHandle: HANDLE,
779         SessionId: ULONG,
780         Title: PWSTR,
781         TitleLength: ULONG,
782         Message: PWSTR,
783         MessageLength: ULONG,
784         Style: ULONG,
785         Timeout: ULONG,
786         Response: PULONG,
787         DoNotWait: BOOLEAN,
788     ) -> BOOLEAN;
789     fn WinStationConnectW(
790         ServerHandle: HANDLE,
791         SessionId: ULONG,
792         TargetSessionId: ULONG,
793         pPassword: PWSTR,
794         bWait: BOOLEAN,
795     ) -> BOOLEAN;
796     fn WinStationDisconnect(
797         ServerHandle: HANDLE,
798         SessionId: ULONG,
799         bWait: BOOLEAN,
800     ) -> BOOLEAN;
801     fn WinStationReset(
802         ServerHandle: HANDLE,
803         SessionId: ULONG,
804         bWait: BOOLEAN,
805     ) -> BOOLEAN;
806     fn WinStationShadow(
807         ServerHandle: HANDLE,
808         TargetServerName: PWSTR,
809         TargetSessionId: ULONG,
810         HotKeyVk: UCHAR,
811         HotkeyModifiers: USHORT,
812     ) -> BOOLEAN;
813     fn WinStationShadowStop(
814         ServerHandle: HANDLE,
815         SessionId: ULONG,
816         bWait: BOOLEAN,
817     ) -> BOOLEAN;
818     fn WinStationEnumerateProcesses(
819         ServerHandle: HANDLE,
820         Processes: *mut PVOID,
821     ) -> BOOLEAN;
822     fn WinStationGetAllProcesses(
823         ServerHandle: HANDLE,
824         Level: ULONG,
825         NumberOfProcesses: PULONG,
826         Processes: *mut PTS_ALL_PROCESSES_INFO,
827     ) -> BOOLEAN;
828     fn WinStationFreeGAPMemory(
829         Level: ULONG,
830         Processes: PTS_ALL_PROCESSES_INFO,
831         NumberOfProcesses: ULONG,
832     ) -> BOOLEAN;
833     fn WinStationTerminateProcess(
834         ServerHandle: HANDLE,
835         ProcessId: ULONG,
836         ExitCode: ULONG,
837     ) -> BOOLEAN;
838     fn WinStationGetProcessSid(
839         ServerHandle: HANDLE,
840         ProcessId: ULONG,
841         ProcessStartTime: FILETIME,
842         pProcessUserSid: PVOID,
843         dwSidSize: PULONG,
844     ) -> BOOLEAN;
845     fn WinStationSwitchToServicesSession() -> BOOLEAN;
846     fn WinStationRevertFromServicesSession() -> BOOLEAN;
847     fn _WinStationWaitForConnect() -> BOOLEAN;
848 }}
849