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