1 // Copyright © 2017 winapi-rs developers 2 // Licensed under the Apache License, Version 2.0 3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license 4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option. 5 // All files in the project carrying such notice may not be copied, modified, or distributed 6 // except according to those terms. 7 use ctypes::c_int; 8 use shared::basetsd::{DWORD_PTR, SIZE_T}; 9 use shared::guiddef::GUID; 10 use shared::minwindef::{BOOL, DWORD, LPBOOL, LPDWORD, PULONG}; 11 use um::winnt::{HRESULT, LARGE_INTEGER, WCHAR}; 12 ENUM!{enum WCT_OBJECT_TYPE { 13 WctCriticalSectionType = 1, 14 WctSendMessageType, 15 WctMutexType, 16 WctAlpcType, 17 WctComType, 18 WctThreadWaitType, 19 WctProcessWaitType, 20 WctThreadType, 21 WctComActivationType, 22 WctUnknownType, 23 WctSocketIoType, 24 WctSmbIoType, 25 WctMaxType, 26 }} 27 ENUM!{enum WCT_OBJECT_STATUS { 28 WctStatusNoAccess = 1, 29 WctStatusRunning, 30 WctStatusBlocked, 31 WctStatusPidOnly, 32 WctStatusPidOnlyRpcss, 33 WctStatusOwned, 34 WctStatusNotOwned, 35 WctStatusAbandoned, 36 WctStatusUnknown, 37 WctStatusError, 38 WctStatusMax, 39 }} 40 pub const WCT_MAX_NODE_COUNT: SIZE_T = 16; 41 pub const WCT_OBJNAME_LENGTH: SIZE_T = 128; 42 STRUCT!{struct WAITCHAIN_NODE_INFO_LOCK_OBJECT { 43 ObjectName: [WCHAR; WCT_OBJNAME_LENGTH], 44 Timeout: LARGE_INTEGER, 45 Alertable: BOOL, 46 }} 47 STRUCT!{struct WAITCHAIN_NODE_INFO_THREAD_OBJECT { 48 ProcessId: DWORD, 49 ThreadId: DWORD, 50 WaitTime: DWORD, 51 ContextSwitches: DWORD, 52 }} 53 UNION!{union WAITCHAIN_NODE_INFO_u { 54 [u64; 34], 55 LockObject LockObject_mut: WAITCHAIN_NODE_INFO_LOCK_OBJECT, 56 ThreadObject ThreadObject_mut: WAITCHAIN_NODE_INFO_THREAD_OBJECT, 57 }} 58 STRUCT!{struct WAITCHAIN_NODE_INFO { 59 ObjectType: WCT_OBJECT_TYPE, 60 ObjectStatus: WCT_OBJECT_STATUS, 61 u: WAITCHAIN_NODE_INFO_u, 62 }} 63 pub type PWAITCHAIN_NODE_INFO = *mut WAITCHAIN_NODE_INFO; 64 DECLARE_HANDLE!{HWCT, HWCT__} 65 FN!{cdecl PWAITCHAINCALLBACK( 66 WctHandle: HWCT, 67 Context: DWORD_PTR, 68 CallbackStatus: DWORD, 69 NodeCount: LPDWORD, 70 NodeInfoArray: PWAITCHAIN_NODE_INFO, 71 IsCycle: LPBOOL, 72 ) -> ()} 73 pub const WCT_ASYNC_OPEN_FLAG: DWORD = 1; 74 pub const WCTP_OPEN_ALL_FLAGS: DWORD = WCT_ASYNC_OPEN_FLAG; 75 extern "system" { OpenThreadWaitChainSession( Flags: DWORD, callback: PWAITCHAINCALLBACK, ) -> HWCT76 pub fn OpenThreadWaitChainSession( 77 Flags: DWORD, 78 callback: PWAITCHAINCALLBACK, 79 ) -> HWCT; CloseThreadWaitChainSession( WctHandle: HWCT, )80 pub fn CloseThreadWaitChainSession( 81 WctHandle: HWCT, 82 ); 83 } 84 pub const WCT_OUT_OF_PROC_FLAG: DWORD = 0x1; 85 pub const WCT_OUT_OF_PROC_COM_FLAG: DWORD = 0x2; 86 pub const WCT_OUT_OF_PROC_CS_FLAG: DWORD = 0x4; 87 pub const WCT_NETWORK_IO_FLAG: DWORD = 0x8; 88 pub const WCTP_GETINFO_ALL_FLAGS: DWORD = WCT_OUT_OF_PROC_FLAG | WCT_OUT_OF_PROC_COM_FLAG 89 | WCT_OUT_OF_PROC_CS_FLAG; 90 extern "system" { GetThreadWaitChain( WctHandle: HWCT, Context: DWORD_PTR, Flags: DWORD, ThreadId: DWORD, NodeCount: LPDWORD, NodeInfoArray: PWAITCHAIN_NODE_INFO, IsCycle: LPBOOL, ) -> BOOL91 pub fn GetThreadWaitChain( 92 WctHandle: HWCT, 93 Context: DWORD_PTR, 94 Flags: DWORD, 95 ThreadId: DWORD, 96 NodeCount: LPDWORD, 97 NodeInfoArray: PWAITCHAIN_NODE_INFO, 98 IsCycle: LPBOOL, 99 ) -> BOOL; 100 } 101 FN!{cdecl PCOGETCALLSTATE( 102 c_int, 103 PULONG, 104 ) -> HRESULT} 105 FN!{cdecl PCOGETACTIVATIONSTATE( 106 GUID, 107 DWORD, 108 *mut DWORD, 109 ) -> HRESULT} 110 extern "system" { RegisterWaitChainCOMCallback( CallStateCallback: PCOGETCALLSTATE, ActivationStateCallback: PCOGETACTIVATIONSTATE, )111 pub fn RegisterWaitChainCOMCallback( 112 CallStateCallback: PCOGETCALLSTATE, 113 ActivationStateCallback: PCOGETACTIVATIONSTATE, 114 ); 115 } 116