1/**
 2 * This file has no copyright assigned and is placed in the Public Domain.
 3 * This file is part of the mingw-w64 runtime package.
 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 5 */
 6#ifndef _INC_WCT
 7#define _INC_WCT
 8#if (_WIN32_WINNT >= 0x0600)
 9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14  typedef LPVOID HWCT;
15
16  typedef enum _WCT_OBJECT_TYPE {
17    WctCriticalSectionType = 1,
18    WctSendMessageType,
19    WctMutexType,
20    WctAlpcType,
21    WctComType,
22    WctThreadWaitType,
23    WctProcessWaitType,
24    WctThreadType,
25    WctComActivationType,
26    WctUnknownType
27  } WCT_OBJECT_TYPE;
28
29  typedef enum _WCT_OBJECT_STATUS {
30    WctStatusNoAccess = 1,
31    WctStatusRunning,
32    WctStatusBlocked,
33    WctStatusPidOnly,
34    WctStatusPidOnlyRpcss,
35    WctStatusOwned,
36    WctStatusNotOwned,
37    WctStatusAbandoned,
38    WctStatusUnknown,
39    WctStatusError
40  } WCT_OBJECT_STATUS;
41
42  /* According to http://msdn.microsoft.com/en-us/magazine/cc163395.aspx
43    RealObjectName has 0x8 offset and TimeOutLowPart has 0x108
44    WCT_OBJNAME_LENGTH assumed to be 128 ((0x108-0x8)/sizeof (ushort) = 128)
45  */
46#define WCT_OBJNAME_LENGTH 128
47
48  typedef struct _WAITCHAIN_NODE_INFO {
49    WCT_OBJECT_TYPE   ObjectType;
50    WCT_OBJECT_STATUS ObjectStatus;
51    __C89_NAMELESS union {
52      struct {
53	WCHAR ObjectName[WCT_OBJNAME_LENGTH];
54	LARGE_INTEGER Timeout;
55	WINBOOL Alertable;
56      } LockObject;
57      struct {
58	DWORD ProcessId;
59	DWORD ThreadId;
60	DWORD WaitTime;
61	DWORD ContextSwitches;
62      } ThreadObject;
63    };
64  } WAITCHAIN_NODE_INFO, *PWAITCHAIN_NODE_INFO;
65
66  typedef VOID (CALLBACK *PWAITCHAINCALLBACK)(HWCT WctHandle,DWORD_PTR Context,DWORD CallbackStatus,LPDWORD NodeCount,PWAITCHAIN_NODE_INFO NodeInfoArray,LPBOOL IsCycle);
67
68  HWCT WINAPI OpenThreadWaitChainSession(DWORD Flags,PWAITCHAINCALLBACK callback);
69  VOID WINAPI CloseThreadWaitChainSession(HWCT WctHandle);
70WINBOOL WINAPI GetThreadWaitChain(HWCT WctHandle,DWORD_PTR Context,DWORD Flags,DWORD ThreadId,LPDWORD NodeCount,PWAITCHAIN_NODE_INFO NodeInfoArray,LPBOOL IsCycle);
71
72/* Unknown Callbacks */
73typedef LPVOID (WINAPI *PCOGETCALLSTATE)();
74typedef LPVOID (WINAPI *PCOGETACTIVATIONSTATE)();
75
76VOID WINAPI RegisterWaitChainCOMCallback(PCOGETCALLSTATE CallStateCallback,PCOGETACTIVATIONSTATE ActivationStateCallback);
77
78#ifdef __cplusplus
79}
80#endif
81
82#endif /* (_WIN32_WINNT >= 0x0600) */
83#endif /*_INC_WCT*/