master
  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 __ROUTING_RTUTILS_H__
  7#define __ROUTING_RTUTILS_H__
  8
  9#include <_mingw_unicode.h>
 10
 11#ifdef __cplusplus
 12extern "C" {
 13#endif
 14
 15#define TRACE_USE_FILE 0x00000001
 16#define TRACE_USE_CONSOLE 0x00000002
 17#define TRACE_NO_SYNCH 0x00000004
 18
 19#define TRACE_NO_STDINFO 0x00000001
 20#define TRACE_USE_MASK 0x00000002
 21#define TRACE_USE_MSEC 0x00000004
 22#define TRACE_USE_DATE 0x00000008
 23
 24#define INVALID_TRACEID 0xFFFFFFFF
 25
 26  DWORD WINAPI TraceRegisterExA(LPCSTR lpszCallerName,DWORD dwFlags);
 27  DWORD WINAPI TraceDeregisterA(DWORD dwTraceID);
 28  DWORD WINAPI TraceDeregisterExA(DWORD dwTraceID,DWORD dwFlags);
 29  DWORD WINAPI TraceGetConsoleA(DWORD dwTraceID,LPHANDLE lphConsole);
 30  DWORD __cdecl TracePrintfA(DWORD dwTraceID,LPCSTR lpszFormat,...);
 31  DWORD __cdecl TracePrintfExA(DWORD dwTraceID,DWORD dwFlags,LPCSTR lpszFormat,...);
 32  DWORD WINAPI TraceVprintfExA(DWORD dwTraceID,DWORD dwFlags,LPCSTR lpszFormat,va_list arglist);
 33  DWORD WINAPI TracePutsExA(DWORD dwTraceID,DWORD dwFlags,LPCSTR lpszString);
 34  DWORD WINAPI TraceDumpExA(DWORD dwTraceID,DWORD dwFlags,LPBYTE lpbBytes,DWORD dwByteCount,DWORD dwGroupSize,WINBOOL bAddressPrefix,LPCSTR lpszPrefix);
 35
 36#define TraceRegisterA(a) TraceRegisterExA(a,0)
 37#define TraceVprintfA(a,b,c) TraceVprintfExA(a,0,b,c)
 38#define TracePutsA(a,b) TracePutsExA(a,0,b)
 39#define TraceDumpA(a,b,c,d,e,f) TraceDumpExA(a,0,b,c,d,e,f)
 40
 41  DWORD WINAPI TraceRegisterExW(LPCWSTR lpszCallerName,DWORD dwFlags);
 42  DWORD WINAPI TraceDeregisterW(DWORD dwTraceID);
 43  DWORD WINAPI TraceDeregisterExW(DWORD dwTraceID,DWORD dwFlags);
 44  DWORD WINAPI TraceGetConsoleW(DWORD dwTraceID,LPHANDLE lphConsole);
 45  DWORD __cdecl TracePrintfW(DWORD dwTraceID,LPCWSTR lpszFormat,...);
 46  DWORD __cdecl TracePrintfExW(DWORD dwTraceID,DWORD dwFlags,LPCWSTR lpszFormat,...);
 47  DWORD WINAPI TraceVprintfExW(DWORD dwTraceID,DWORD dwFlags,LPCWSTR lpszFormat,va_list arglist);
 48  DWORD WINAPI TracePutsExW(DWORD dwTraceID,DWORD dwFlags,LPCWSTR lpszString);
 49  DWORD WINAPI TraceDumpExW(DWORD dwTraceID,DWORD dwFlags,LPBYTE lpbBytes,DWORD dwByteCount,DWORD dwGroupSize,WINBOOL bAddressPrefix,LPCWSTR lpszPrefix);
 50
 51#define TraceRegisterW(a) TraceRegisterExW(a,0)
 52#define TraceVprintfW(a,b,c) TraceVprintfExW(a,0,b,c)
 53#define TracePutsW(a,b) TracePutsExW(a,0,b)
 54#define TraceDumpW(a,b,c,d,e,f) TraceDumpExW(a,0,b,c,d,e,f)
 55
 56#define TraceRegister __MINGW_NAME_AW(TraceRegister)
 57#define TraceDeregister __MINGW_NAME_AW(TraceDeregister)
 58#define TraceDeregisterEx __MINGW_NAME_AW(TraceDeregisterEx)
 59#define TraceGetConsole __MINGW_NAME_AW(TraceGetConsole)
 60#define TracePrintf __MINGW_NAME_AW(TracePrintf)
 61#define TraceVprintf __MINGW_NAME_AW(TraceVprintf)
 62#define TracePuts __MINGW_NAME_AW(TracePuts)
 63#define TraceDump __MINGW_NAME_AW(TraceDump)
 64#define TraceRegisterEx __MINGW_NAME_AW(TraceRegisterEx)
 65#define TracePrintfEx __MINGW_NAME_AW(TracePrintfEx)
 66#define TraceVprintfEx __MINGW_NAME_AW(TraceVprintfEx)
 67#define TracePutsEx __MINGW_NAME_AW(TracePutsEx)
 68#define TraceDumpEx __MINGW_NAME_AW(TraceDumpEx)
 69
 70  VOID WINAPI LogErrorA(DWORD dwMessageId,DWORD cNumberOfSubStrings,LPSTR *plpwsSubStrings,DWORD dwErrorCode);
 71  VOID WINAPI LogEventA(DWORD wEventType,DWORD dwMessageId,DWORD cNumberOfSubStrings,LPSTR *plpwsSubStrings);
 72  VOID LogErrorW(DWORD dwMessageId,DWORD cNumberOfSubStrings,LPWSTR *plpwsSubStrings,DWORD dwErrorCode);
 73  VOID LogEventW(DWORD wEventType,DWORD dwMessageId,DWORD cNumberOfSubStrings,LPWSTR *plpwsSubStrings);
 74
 75#define LogError __MINGW_NAME_AW(LogError)
 76#define LogEvent __MINGW_NAME_AW(LogEvent)
 77
 78  HANDLE RouterLogRegisterA(LPCSTR lpszSource);
 79  VOID RouterLogDeregisterA(HANDLE hLogHandle);
 80  VOID RouterLogEventA(HANDLE hLogHandle,DWORD dwEventType,DWORD dwMessageId,DWORD dwSubStringCount,LPSTR *plpszSubStringArray,DWORD dwErrorCode);
 81  VOID RouterLogEventDataA(HANDLE hLogHandle,DWORD dwEventType,DWORD dwMessageId,DWORD dwSubStringCount,LPSTR *plpszSubStringArray,DWORD dwDataBytes,LPBYTE lpDataBytes);
 82  VOID RouterLogEventStringA(HANDLE hLogHandle,DWORD dwEventType,DWORD dwMessageId,DWORD dwSubStringCount,LPSTR *plpszSubStringArray,DWORD dwErrorCode,DWORD dwErrorIndex);
 83  VOID __cdecl RouterLogEventExA(HANDLE hLogHandle,DWORD dwEventType,DWORD dwErrorCode,DWORD dwMessageId,LPCSTR ptszFormat,...);
 84  VOID RouterLogEventValistExA(HANDLE hLogHandle,DWORD dwEventType,DWORD dwErrorCode,DWORD dwMessageId,LPCSTR ptszFormat,va_list arglist);
 85  DWORD RouterGetErrorStringA(DWORD dwErrorCode,LPSTR *lplpszErrorString);
 86
 87#define RouterLogErrorA(h,msg,count,array,err) RouterLogEventA(h,EVENTLOG_ERROR_TYPE,msg,count,array,err)
 88#define RouterLogWarningA(h,msg,count,array,err) RouterLogEventA(h,EVENTLOG_WARNING_TYPE,msg,count,array,err)
 89#define RouterLogInformationA(h,msg,count,array,err) RouterLogEventA(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err)
 90
 91#define RouterLogErrorDataA(h,msg,count,array,c,buf) RouterLogEventDataA(h,EVENTLOG_ERROR_TYPE,msg,count,array,c,buf)
 92#define RouterLogWarningDataA(h,msg,count,array,c,buf) RouterLogEventDataA(h,EVENTLOG_WARNING_TYPE,msg,count,array,c,buf)
 93#define RouterLogInformationDataA(h,msg,count,array,c,buf) RouterLogEventDataA(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,c,buf)
 94
 95#define RouterLogErrorStringA(h,msg,count,array,err,index) RouterLogEventStringA(h,EVENTLOG_ERROR_TYPE,msg,count,array,err,index)
 96#define RouterLogWarningStringA(h,msg,count,array,err,index) RouterLogEventStringA(h,EVENTLOG_WARNING_TYPE,msg,count,array,err,index)
 97#define RouterLogInformationStringA(h,msg,count,array,err,index) RouterLogEventStringA(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err,index)
 98
 99  HANDLE RouterLogRegisterW(LPCWSTR lpszSource);
100  VOID RouterLogDeregisterW(HANDLE hLogHandle);
101  VOID RouterLogEventW(HANDLE hLogHandle,DWORD dwEventType,DWORD dwMessageId,DWORD dwSubStringCount,LPWSTR *plpszSubStringArray,DWORD dwErrorCode);
102  VOID RouterLogEventDataW(HANDLE hLogHandle,DWORD dwEventType,DWORD dwMessageId,DWORD dwSubStringCount,LPWSTR *plpszSubStringArray,DWORD dwDataBytes,LPBYTE lpDataBytes);
103  VOID RouterLogEventStringW(HANDLE hLogHandle,DWORD dwEventType,DWORD dwMessageId,DWORD dwSubStringCount,LPWSTR *plpszSubStringArray,DWORD dwErrorCode,DWORD dwErrorIndex);
104  VOID __cdecl RouterLogEventExW(HANDLE hLogHandle,DWORD dwEventType,DWORD dwErrorCode,DWORD dwMessageId,LPCWSTR ptszFormat,...);
105  VOID RouterLogEventValistExW(HANDLE hLogHandle,DWORD dwEventType,DWORD dwErrorCode,DWORD dwMessageId,LPCWSTR ptszFormat,va_list arglist);
106  DWORD RouterGetErrorStringW(DWORD dwErrorCode,LPWSTR *lplpwszErrorString);
107
108#define RouterLogErrorW(h,msg,count,array,err) RouterLogEventW(h,EVENTLOG_ERROR_TYPE,msg,count,array,err)
109#define RouterLogWarningW(h,msg,count,array,err) RouterLogEventW(h,EVENTLOG_WARNING_TYPE,msg,count,array,err)
110#define RouterLogInformationW(h,msg,count,array,err) RouterLogEventW(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err)
111
112#define RouterLogErrorDataW(h,msg,count,array,c,buf) RouterLogEventDataW(h,EVENTLOG_ERROR_TYPE,msg,count,array,c,buf)
113#define RouterLogWarningDataW(h,msg,count,array,c,buf) RouterLogEventDataW(h,EVENTLOG_WARNING_TYPE,msg,count,array,c,buf)
114#define RouterLogInformationDataW(h,msg,count,array,c,buf) RouterLogEventDataW(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,c,buf)
115
116#define RouterLogErrorStringW(h,msg,count,array,err,index) RouterLogEventStringW(h,EVENTLOG_ERROR_TYPE,msg,count,array,err,index)
117#define RouterLogWarningStringW(h,msg,count,array,err,index) RouterLogEventStringW(h,EVENTLOG_WARNING_TYPE,msg,count,array,err,index)
118#define RouterLogInformationStringW(h,msg,count,array,err,index) RouterLogEventStringW(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err,index)
119
120#define RouterLogRegister __MINGW_NAME_AW(RouterLogRegister)
121#define RouterLogDeregister __MINGW_NAME_AW(RouterLogDeregister)
122#define RouterLogEvent __MINGW_NAME_AW(RouterLogEvent)
123#define RouterLogError __MINGW_NAME_AW(RouterLogError)
124#define RouterLogWarning __MINGW_NAME_AW(RouterLogWarning)
125#define RouterLogInformation __MINGW_NAME_AW(RouterLogInformation)
126
127#define RouterLogEventData __MINGW_NAME_AW(RouterLogEventData)
128#define RouterLogErrorData __MINGW_NAME_AW(RouterLogErrorData)
129#define RouterLogWarningData __MINGW_NAME_AW(RouterLogWarningData)
130#define RouterLogInformationData __MINGW_NAME_AW(RouterLogInformationData)
131#define RouterLogEventString __MINGW_NAME_AW(RouterLogEventString)
132#define RouterLogEventEx __MINGW_NAME_AW(RouterLogEventEx)
133#define RouterLogEventValistEx __MINGW_NAME_AW(RouterLogEventValistEx)
134#define RouterLogErrorString __MINGW_NAME_AW(RouterLogErrorString)
135#define RouterLogWarningString __MINGW_NAME_AW(RouterLogWarningString)
136#define RouterLogInformationString __MINGW_NAME_AW(RouterLogInformationString)
137#define RouterGetErrorString __MINGW_NAME_AW(RouterGetErrorString)
138
139  typedef VOID (WINAPI *WORKERFUNCTION)(PVOID);
140
141  DWORD WINAPI QueueWorkItem(WORKERFUNCTION functionptr,PVOID context,WINBOOL serviceinalertablethread);
142  DWORD WINAPI SetIoCompletionProc(HANDLE FileHandle,LPOVERLAPPED_COMPLETION_ROUTINE CompletionProc);
143
144#define NUM_ALERTABLE_THREADS 2
145#define MAX_WORKER_THREADS 10
146#define WORK_QUEUE_TIMEOUT 1
147#define THREAD_IDLE_TIMEOUT 10
148
149  VOID RouterAssert(PSTR pszFailedAssertion,PSTR pszFileName,DWORD dwLineNumber,PSTR pszMessage);
150
151#define RTASSERT(exp)
152#define RTASSERTMSG(msg,exp)
153
154#define RTUTILS_MAX_PROTOCOL_NAME_LEN 40
155#define RTUTILS_MAX_PROTOCOL_DLL_LEN 48
156
157#ifndef MAX_PROTOCOL_NAME_LEN
158#define MAX_PROTOCOL_NAME_LEN RTUTILS_MAX_PROTOCOL_NAME_LEN
159#else
160#undef MAX_PROTOCOL_NAME_LEN
161#endif
162#define MAX_PROTOCOL_DLL_LEN RTUTILS_MAX_PROTOCOL_DLL_LEN
163
164  typedef struct _MPR_PROTOCOL_0 {
165    DWORD dwProtocolId;
166    WCHAR wszProtocol[RTUTILS_MAX_PROTOCOL_NAME_LEN+1];
167    WCHAR wszDLLName[RTUTILS_MAX_PROTOCOL_DLL_LEN+1];
168  } MPR_PROTOCOL_0;
169
170  DWORD WINAPI MprSetupProtocolEnum(DWORD dwTransportId,LPBYTE *lplpBuffer,LPDWORD lpdwEntriesRead);
171  DWORD WINAPI MprSetupProtocolFree(LPVOID lpBuffer);
172
173#define ROUTING_RESERVED
174#define OPT1_1
175#define OPT1_2
176#define OPT2_1
177#define OPT2_2
178#define OPT3_1
179#define OPT3_2
180
181  struct _WAIT_THREAD_ENTRY;
182  struct _WT_EVENT_ENTRY;
183
184#define TIMER_INACTIVE 3
185#define TIMER_ACTIVE 4
186
187  typedef struct _WT_TIMER_ENTRY {
188    LONGLONG te_Timeout;
189    WORKERFUNCTION te_Function;
190    PVOID te_Context;
191    DWORD te_ContextSz;
192    WINBOOL te_RunInServer;
193    DWORD te_Status;
194    DWORD te_ServerId;
195    struct _WAIT_THREAD_ENTRY *teP_wte;
196    LIST_ENTRY te_ServerLinks;
197    LIST_ENTRY te_Links;
198    WINBOOL te_Flag;
199    DWORD te_TimerId;
200  } WT_TIMER_ENTRY,*PWT_TIMER_ENTRY;
201
202  typedef struct _WT_WORK_ITEM {
203    WORKERFUNCTION wi_Function;
204    PVOID wi_Context;
205    DWORD wi_ContextSz;
206    WINBOOL wi_RunInServer;
207    struct _WT_EVENT_ENTRY *wiP_ee;
208    LIST_ENTRY wi_ServerLinks;
209    LIST_ENTRY wi_Links;
210  } WT_WORK_ITEM,*PWT_WORK_ITEM;
211
212#define WT_EVENT_BINDING WT_WORK_ITEM
213#define PWT_EVENT_BINDING PWT_WORK_ITEM
214
215  typedef struct _WT_EVENT_ENTRY {
216    HANDLE ee_Event;
217    WINBOOL ee_bManualReset;
218    WINBOOL ee_bInitialState;
219    WINBOOL ee_bDeleteEvent;
220    DWORD ee_Status;
221    WINBOOL ee_bHighPriority;
222
223    LIST_ENTRY eeL_wi;
224    WINBOOL ee_bSignalSingle;
225    WINBOOL ee_bOwnerSelf;
226    INT ee_ArrayIndex;
227    DWORD ee_ServerId;
228    struct _WAIT_THREAD_ENTRY *eeP_wte;
229    LIST_ENTRY ee_ServerLinks;
230    LIST_ENTRY ee_Links;
231    DWORD ee_RefCount;
232    WINBOOL ee_bFlag;
233    DWORD ee_EventId;
234  } WT_EVENT_ENTRY,*PWT_EVENT_ENTRY;
235
236  PWT_EVENT_ENTRY WINAPI CreateWaitEvent(HANDLE pEvent OPT1_1,LPSECURITY_ATTRIBUTES lpEventAttributes OPT1_2,WINBOOL bManualReset,WINBOOL bInitialState,LPCTSTR lpName OPT1_2,WINBOOL bHighPriority,WORKERFUNCTION pFunction OPT2_1,PVOID pContext OPT2_1,DWORD dwContextSz OPT2_1,WINBOOL bRunInServerContext OPT2_1);
237  PWT_EVENT_BINDING WINAPI CreateWaitEventBinding(PWT_EVENT_ENTRY pee,WORKERFUNCTION pFunction,PVOID pContext,DWORD dwContextSz,WINBOOL bRunInServerContext);
238  PWT_TIMER_ENTRY WINAPI CreateWaitTimer(WORKERFUNCTION pFunction,PVOID pContext,DWORD dwContextSz,WINBOOL bRunInServerContext);
239  DWORD WINAPI DeRegisterWaitEventBindingSelf(PWT_EVENT_BINDING pwiWorkItem);
240  DWORD WINAPI DeRegisterWaitEventBinding(PWT_EVENT_BINDING pwiWorkItem);
241  DWORD WINAPI DeRegisterWaitEventsTimers (PLIST_ENTRY pLEvents,PLIST_ENTRY pLTimers);
242  DWORD WINAPI DeRegisterWaitEventsTimersSelf(PLIST_ENTRY pLEvents,PLIST_ENTRY pLTimers);
243  DWORD WINAPI RegisterWaitEventBinding(PWT_EVENT_BINDING pwiWorkItem);
244  DWORD WINAPI RegisterWaitEventsTimers(PLIST_ENTRY pLEventsToAdd,PLIST_ENTRY pLTimersToAdd);
245  DWORD WINAPI UpdateWaitTimer(PWT_TIMER_ENTRY pte,LONGLONG *time);
246  VOID WINAPI WTFree (PVOID ptr);
247  VOID WINAPI WTFreeEvent(PWT_EVENT_ENTRY peeEvent);
248  VOID WINAPI WTFreeTimer(PWT_TIMER_ENTRY pteTimer);
249  VOID WINAPI DebugPrintWaitWorkerThreads (DWORD dwDebugLevel);
250
251#define DEBUGPRINT_FILTER_NONCLIENT_EVENTS 0x2
252#define DEBUGPRINT_FILTER_EVENTS 0x4
253#define DEBUGPRINT_FILTER_TIMERS 0x8
254
255#define ERROR_WAIT_THREAD_UNAVAILABLE 1
256#define ERROR_WT_EVENT_ALREADY_DELETED 2
257#define TIMER_HIGH(time) (((LARGE_INTEGER*)&time)->HighPart)
258#define TIMER_LOW(time) (((LARGE_INTEGER*)&time)->LowPart)
259
260#ifdef __cplusplus
261}
262#endif
263#endif