// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. use ctypes::c_int; use shared::basetsd::{DWORD_PTR, SIZE_T}; use shared::guiddef::GUID; use shared::minwindef::{BOOL, DWORD, LPBOOL, LPDWORD, PULONG}; use um::winnt::{HRESULT, LARGE_INTEGER, WCHAR}; ENUM!{enum WCT_OBJECT_TYPE { WctCriticalSectionType = 1, WctSendMessageType, WctMutexType, WctAlpcType, WctComType, WctThreadWaitType, WctProcessWaitType, WctThreadType, WctComActivationType, WctUnknownType, WctSocketIoType, WctSmbIoType, WctMaxType, }} ENUM!{enum WCT_OBJECT_STATUS { WctStatusNoAccess = 1, WctStatusRunning, WctStatusBlocked, WctStatusPidOnly, WctStatusPidOnlyRpcss, WctStatusOwned, WctStatusNotOwned, WctStatusAbandoned, WctStatusUnknown, WctStatusError, WctStatusMax, }} pub const WCT_MAX_NODE_COUNT: SIZE_T = 16; pub const WCT_OBJNAME_LENGTH: SIZE_T = 128; STRUCT!{struct WAITCHAIN_NODE_INFO_LOCK_OBJECT { ObjectName: [WCHAR; WCT_OBJNAME_LENGTH], Timeout: LARGE_INTEGER, Alertable: BOOL, }} STRUCT!{struct WAITCHAIN_NODE_INFO_THREAD_OBJECT { ProcessId: DWORD, ThreadId: DWORD, WaitTime: DWORD, ContextSwitches: DWORD, }} UNION!{union WAITCHAIN_NODE_INFO_u { [u64; 34], LockObject LockObject_mut: WAITCHAIN_NODE_INFO_LOCK_OBJECT, ThreadObject ThreadObject_mut: WAITCHAIN_NODE_INFO_THREAD_OBJECT, }} STRUCT!{struct WAITCHAIN_NODE_INFO { ObjectType: WCT_OBJECT_TYPE, ObjectStatus: WCT_OBJECT_STATUS, u: WAITCHAIN_NODE_INFO_u, }} pub type PWAITCHAIN_NODE_INFO = *mut WAITCHAIN_NODE_INFO; DECLARE_HANDLE!{HWCT, HWCT__} FN!{cdecl PWAITCHAINCALLBACK( WctHandle: HWCT, Context: DWORD_PTR, CallbackStatus: DWORD, NodeCount: LPDWORD, NodeInfoArray: PWAITCHAIN_NODE_INFO, IsCycle: LPBOOL, ) -> ()} pub const WCT_ASYNC_OPEN_FLAG: DWORD = 1; pub const WCTP_OPEN_ALL_FLAGS: DWORD = WCT_ASYNC_OPEN_FLAG; extern "system" { pub fn OpenThreadWaitChainSession( Flags: DWORD, callback: PWAITCHAINCALLBACK, ) -> HWCT; pub fn CloseThreadWaitChainSession( WctHandle: HWCT, ); } pub const WCT_OUT_OF_PROC_FLAG: DWORD = 0x1; pub const WCT_OUT_OF_PROC_COM_FLAG: DWORD = 0x2; pub const WCT_OUT_OF_PROC_CS_FLAG: DWORD = 0x4; pub const WCT_NETWORK_IO_FLAG: DWORD = 0x8; pub const WCTP_GETINFO_ALL_FLAGS: DWORD = WCT_OUT_OF_PROC_FLAG | WCT_OUT_OF_PROC_COM_FLAG | WCT_OUT_OF_PROC_CS_FLAG; extern "system" { pub fn GetThreadWaitChain( WctHandle: HWCT, Context: DWORD_PTR, Flags: DWORD, ThreadId: DWORD, NodeCount: LPDWORD, NodeInfoArray: PWAITCHAIN_NODE_INFO, IsCycle: LPBOOL, ) -> BOOL; } FN!{cdecl PCOGETCALLSTATE( c_int, PULONG, ) -> HRESULT} FN!{cdecl PCOGETACTIVATIONSTATE( GUID, DWORD, *mut DWORD, ) -> HRESULT} extern "system" { pub fn RegisterWaitChainCOMCallback( CallStateCallback: PCOGETCALLSTATE, ActivationStateCallback: PCOGETACTIVATIONSTATE, ); }