[CMAKE]
[reactos.git] / subsystems / win32 / win32k / include / gdidebug.h
1 #pragma once
2
3 typedef enum _LOG_EVENT_TYPE
4 {
5 EVENT_ALLOCATE,
6 EVENT_CREATE_HANDLE,
7 EVENT_REFERENCE,
8 EVENT_DEREFERENCE,
9 EVENT_LOCK,
10 EVENT_UNLOCK,
11 EVENT_DELETE,
12 EVENT_FREE,
13 EVENT_SET_OWNER,
14 } LOG_EVENT_TYPE;
15
16 typedef struct _LOGENTRY
17 {
18 SLIST_ENTRY sleLink;
19 LOG_EVENT_TYPE nEventType;
20 DWORD dwProcessId;
21 DWORD dwThreadId;
22 ULONG ulUnique;
23 LPARAM lParam;
24 PVOID apvBackTrace[20];
25 union
26 {
27 ULONG_PTR data1;
28 } data;
29 } LOGENTRY, *PLOGENTRY;
30
31 #if DBG_ENABLE_EVENT_LOGGING
32 VOID NTAPI DbgDumpEventList(PSLIST_HEADER pslh);
33 VOID NTAPI DbgLogEvent(PSLIST_HEADER pslh, EVENT_TYPE nEventType, LPARAM lParam);
34 VOID NTAPI DbgCleanupEventList(PSLIST_HEADER pslh);
35 #define DBG_LOGEVENT(pslh, type, val) DbgLogEvent(pslh, type, (ULONG_PTR)val)
36 #define DBG_INITLOG(pslh) InitializeSListHead(pslh)
37 #define DBG_DUMP_EVENT_LIST(pslh) DbgDumpEventList(pslh)
38 #define DBG_CLEANUP_EVENT_LIST(pslh) DbgCleanupEventList(pslh)
39 #else
40 #define DBG_LOGEVENT(pslh, type, val)
41 #define DBG_INITLOG(pslh)
42 #define DBG_DUMP_EVENT_LIST(pslh)
43 #define DBG_CLEANUP_EVENT_LIST(pslh)
44 #endif
45
46 extern ULONG gulLogUnique;
47
48 extern ULONG gulDebugChannels;
49
50 enum _DEBUGCHANNELS
51 {
52 DbgCustom = 1,
53 DbgObjects = 2,
54 DbgBitBlt = 4,
55 DbgXlate = 8,
56 DbgModeSwitch = 16,
57 };
58
59 VOID NTAPI DbgDumpGdiHandleTable(VOID);
60 ULONG NTAPI DbgCaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture);
61 BOOL NTAPI DbgGdiHTIntegrityCheck(VOID);
62 VOID NTAPI DbgDumpLockedGdiHandles(VOID);
63
64 #define DBGENABLE(ch) gulDebugChannels |= (ch);
65 #define DBGDISABLE(ch) gulDebugChannels &= ~(ch);
66 #define DPRINTCH(ch) if (gulDebugChannels & (ch)) DbgPrint
67
68 #define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl('DsoR', (PVOID)Frames, Count, NULL, 0, NULL, KernelMode)
69 NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags);
70
71 #if DBG
72 void
73 NTAPI
74 DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments);
75
76 ULONG_PTR
77 NTAPI
78 DbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult);
79
80 #define ID_Win32PreServiceHook 'WSH0'
81 #define ID_Win32PostServiceHook 'WSH1'
82
83 FORCEINLINE void
84 GdiDbgAssertNoLocks(char * pszFile, ULONG nLine)
85 {
86 PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread();
87 if (pti && pti->cExclusiveLocks != 0)
88 {
89 DbgPrint("(%s:%ld) There are %ld exclusive locks!\n",
90 pszFile, nLine, pti->cExclusiveLocks);
91 ASSERT(FALSE);
92 }
93 }
94
95 #define ASSERT_NOGDILOCKS() GdiDbgAssertNoLocks(__FILE__,__LINE__)
96 #else
97 #define ASSERT_NOGDILOCKS()
98 #endif
99