1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 use ctypes::c_int;
7 use shared::basetsd::{DWORD_PTR, SIZE_T};
8 use shared::guiddef::GUID;
9 use shared::minwindef::{BOOL, DWORD, LPBOOL, LPDWORD, PULONG};
10 use um::winnt::{HRESULT, LARGE_INTEGER, WCHAR};
11 ENUM!{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 }}
26 ENUM!{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 }}
39 pub const WCT_MAX_NODE_COUNT: SIZE_T = 16;
40 pub const WCT_OBJNAME_LENGTH: SIZE_T = 128;
41 STRUCT!{struct WAITCHAIN_NODE_INFO_LOCK_OBJECT {
42     ObjectName: [WCHAR; WCT_OBJNAME_LENGTH],
43     Timeout: LARGE_INTEGER,
44     Alertable: BOOL,
45 }}
46 STRUCT!{struct WAITCHAIN_NODE_INFO_THREAD_OBJECT {
47     ProcessId: DWORD,
48     ThreadId: DWORD,
49     WaitTime: DWORD,
50     ContextSwitches: DWORD,
51 }}
52 UNION!{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 }}
57 STRUCT!{struct WAITCHAIN_NODE_INFO {
58     ObjectType: WCT_OBJECT_TYPE,
59     ObjectStatus: WCT_OBJECT_STATUS,
60     u: WAITCHAIN_NODE_INFO_u,
61 }}
62 pub type PWAITCHAIN_NODE_INFO = *mut WAITCHAIN_NODE_INFO;
63 DECLARE_HANDLE!{HWCT, HWCT__}
64 FN!{cdecl PWAITCHAINCALLBACK(
65     WctHandle: HWCT,
66     Context: DWORD_PTR,
67     CallbackStatus: DWORD,
68     NodeCount: LPDWORD,
69     NodeInfoArray: PWAITCHAIN_NODE_INFO,
70     IsCycle: LPBOOL,
71 ) -> ()}
72 pub const WCT_ASYNC_OPEN_FLAG: DWORD = 1;
73 pub const WCTP_OPEN_ALL_FLAGS: DWORD = WCT_ASYNC_OPEN_FLAG;
74 extern "system" {
OpenThreadWaitChainSession( Flags: DWORD, callback: PWAITCHAINCALLBACK, ) -> HWCT75     pub fn OpenThreadWaitChainSession(
76         Flags: DWORD,
77         callback: PWAITCHAINCALLBACK,
78     ) -> HWCT;
CloseThreadWaitChainSession( WctHandle: HWCT, )79     pub fn CloseThreadWaitChainSession(
80         WctHandle: HWCT,
81     );
82 }
83 pub const WCT_OUT_OF_PROC_FLAG: DWORD = 0x1;
84 pub const WCT_OUT_OF_PROC_COM_FLAG: DWORD = 0x2;
85 pub const WCT_OUT_OF_PROC_CS_FLAG: DWORD = 0x4;
86 pub const WCT_NETWORK_IO_FLAG: DWORD = 0x8;
87 pub const WCTP_GETINFO_ALL_FLAGS: DWORD = WCT_OUT_OF_PROC_FLAG | WCT_OUT_OF_PROC_COM_FLAG
88     | WCT_OUT_OF_PROC_CS_FLAG;
89 extern "system" {
GetThreadWaitChain( WctHandle: HWCT, Context: DWORD_PTR, Flags: DWORD, ThreadId: DWORD, NodeCount: LPDWORD, NodeInfoArray: PWAITCHAIN_NODE_INFO, IsCycle: LPBOOL, ) -> BOOL90     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 }
100 FN!{cdecl PCOGETCALLSTATE(
101     c_int,
102     PULONG,
103 ) -> HRESULT}
104 FN!{cdecl PCOGETACTIVATIONSTATE(
105     GUID,
106     DWORD,
107     *mut DWORD,
108 ) -> HRESULT}
109 extern "system" {
RegisterWaitChainCOMCallback( CallStateCallback: PCOGETCALLSTATE, ActivationStateCallback: PCOGETACTIVATIONSTATE, )110     pub fn RegisterWaitChainCOMCallback(
111         CallStateCallback: PCOGETCALLSTATE,
112         ActivationStateCallback: PCOGETACTIVATIONSTATE,
113     );
114 }
115