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