home *** CD-ROM | disk | FTP | other *** search
- /*++
-
- Copyright (c) 1995 - 1997 Microsoft Corporation
-
- Module Name:
-
- rtutils.h
-
- Abstract:
- Public declarations for the Router process utility functions.
-
- --*/
-
- #ifndef __ROUTING_RTUTILS_H__
- #define __ROUTING_RTUTILS_H__
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // TRACING FUNCTION PROTOTYPES //
- // //
- // See DOCUMENT for more information //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Definitions for flags and constants //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define TRACE_USE_FILE 0x00000001
- #define TRACE_USE_CONSOLE 0x00000002
- #define TRACE_NO_SYNCH 0x00000004
-
- #define TRACE_NO_STDINFO 0x00000001
- #define TRACE_USE_MASK 0x00000002
- #define TRACE_USE_MSEC 0x00000004
-
- #define INVALID_TRACEID 0xFFFFFFFF
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // ANSI entry-points //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- DWORD
- APIENTRY
- TraceRegisterExA(
- IN LPCSTR lpszCallerName,
- IN DWORD dwFlags
- );
-
- DWORD
- APIENTRY
- TraceDeregisterA(
- IN DWORD dwTraceID
- );
-
- DWORD
- APIENTRY
- TraceDeregisterExA(
- IN DWORD dwTraceID,
- IN DWORD dwFlags
- );
-
- DWORD
- APIENTRY
- TraceGetConsoleA(
- IN DWORD dwTraceID,
- OUT LPHANDLE lphConsole
- );
-
- DWORD
- APIENTRY
- TracePrintfA(
- IN DWORD dwTraceID,
- IN LPCSTR lpszFormat,
- IN ... OPTIONAL
- );
-
- DWORD
- APIENTRY
- TracePrintfExA(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPCSTR lpszFormat,
- IN ... OPTIONAL
- );
-
- DWORD
- APIENTRY
- TraceVprintfExA(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPCSTR lpszFormat,
- IN va_list arglist
- );
-
- DWORD
- APIENTRY
- TracePutsExA(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPCSTR lpszString
- );
-
- DWORD
- APIENTRY
- TraceDumpExA(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPBYTE lpbBytes,
- IN DWORD dwByteCount,
- IN DWORD dwGroupSize,
- IN BOOL bAddressPrefix,
- IN LPCSTR lpszPrefix
- );
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // ANSI entry-points macros //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define TraceRegisterA(a) TraceRegisterExA(a,0)
- #define TraceVprintfA(a,b,c) TraceVprintfExA(a,0,b,c)
- #define TracePutsA(a,b) TracePutsExA(a,0,b)
- #define TraceDumpA(a,b,c,d,e,f) TraceDumpExA(a,0,b,c,d,e,f)
-
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Unicode entry-points //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- DWORD
- APIENTRY
- TraceRegisterExW(
- IN LPCWSTR lpszCallerName,
- IN DWORD dwFlags
- );
-
- DWORD
- APIENTRY
- TraceDeregisterW(
- IN DWORD dwTraceID
- );
-
- DWORD
- APIENTRY
- TraceDeregisterExW(
- IN DWORD dwTraceID,
- IN DWORD dwFlags
- );
-
- DWORD
- APIENTRY
- TraceGetConsoleW(
- IN DWORD dwTraceID,
- OUT LPHANDLE lphConsole
- );
-
- DWORD
- APIENTRY
- TracePrintfW(
- IN DWORD dwTraceID,
- IN LPCWSTR lpszFormat,
- IN ... OPTIONAL
- );
-
- DWORD
- APIENTRY
- TracePrintfExW(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPCWSTR lpszFormat,
- IN ... OPTIONAL
- );
-
- DWORD
- APIENTRY
- TraceVprintfExW(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPCWSTR lpszFormat,
- IN va_list arglist
- );
-
- DWORD
- APIENTRY
- TracePutsExW(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPCWSTR lpszString
- );
-
- DWORD
- APIENTRY
- TraceDumpExW(
- IN DWORD dwTraceID,
- IN DWORD dwFlags,
- IN LPBYTE lpbBytes,
- IN DWORD dwByteCount,
- IN DWORD dwGroupSize,
- IN BOOL bAddressPrefix,
- IN LPCWSTR lpszPrefix
- );
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Unicode entry-points macros //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define TraceRegisterW(a) TraceRegisterExW(a,0)
- #define TraceVprintfW(a,b,c) TraceVprintfExW(a,0,b,c)
- #define TracePutsW(a,b) TracePutsExW(a,0,b)
- #define TraceDumpW(a,b,c,d,e,f) TraceDumpExW(a,0,b,c,d,e,f)
-
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Code-page dependent entry-point macros //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #ifdef UNICODE
- #define TraceRegister TraceRegisterW
- #define TraceDeregister TraceDeregisterW
- #define TraceDeregisterEx TraceDeregisterExW
- #define TraceGetConsole TraceGetConsoleW
- #define TracePrintf TracePrintfW
- #define TraceVprintf TraceVprintfW
- #define TracePuts TracePutsW
- #define TraceDump TraceDumpW
- #define TraceRegisterEx TraceRegisterExW
- #define TracePrintfEx TracePrintfExW
- #define TraceVprintfEx TraceVprintfExW
- #define TracePutsEx TracePutsExW
- #define TraceDumpEx TraceDumpExW
- #else
- #define TraceRegister TraceRegisterA
- #define TraceDeregister TraceDeregisterA
- #define TraceDeregisterEx TraceDeregisterExA
- #define TraceGetConsole TraceGetConsoleA
- #define TracePrintf TracePrintfA
- #define TraceVprintf TraceVprintfA
- #define TracePuts TracePutsA
- #define TraceDump TraceDumpA
- #define TraceRegisterEx TraceRegisterExA
- #define TracePrintfEx TracePrintfExA
- #define TraceVprintfEx TraceVprintfExA
- #define TracePutsEx TracePutsExA
- #define TraceDumpEx TraceDumpExA
- #endif
-
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // EVENT LOGGING FUNCTION PROTOTYPES //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // ANSI prototypes //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
-
- VOID
- APIENTRY
- LogErrorA(
- IN DWORD dwMessageId,
- IN DWORD cNumberOfSubStrings,
- IN LPSTR *plpwsSubStrings,
- IN DWORD dwErrorCode
- );
-
- VOID
- APIENTRY
- LogEventA(
- IN DWORD wEventType,
- IN DWORD dwMessageId,
- IN DWORD cNumberOfSubStrings,
- IN LPSTR *plpwsSubStrings
- );
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Unicode prototypes //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- VOID
- LogErrorW(
- IN DWORD dwMessageId,
- IN DWORD cNumberOfSubStrings,
- IN LPWSTR *plpwsSubStrings,
- IN DWORD dwErrorCode
- );
-
- VOID
- LogEventW(
- IN DWORD wEventType,
- IN DWORD dwMessageId,
- IN DWORD cNumberOfSubStrings,
- IN LPWSTR *plpwsSubStrings
- );
-
-
- #ifdef UNICODE
- #define LogError LogErrorW
- #define LogEvent LogEventW
- #else
- #define LogError LogErrorA
- #define LogEvent LogEventA
- #endif
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // The following functions allow the caller to specify the event source. //
- // //
- // Call RouterLogRegister with the strings which would be passed to //
- // RegisterEventSource; this returns a handle which can be passed //
- // to the functions RouterLogEvent and RouterLogEventData. //
- // //
- // Call RouterLogDeregister to close the handle. //
- // //
- // Macros are provided for the different kinds of event log entrys: //
- // RouterLogError logs an error (EVENTLOG_ERROR_TYPE) //
- // RouterLogWarning logs a warning (EVENTLOG_WARNING_TYPE) //
- // RouterLogInformation logs information (EVENTLOG_INFORMATION_TYPE) //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // ANSI prototypes //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- HANDLE
- RouterLogRegisterA(
- LPCSTR lpszSource
- );
-
- VOID
- RouterLogDeregisterA(
- HANDLE hLogHandle
- );
-
- VOID
- RouterLogEventA(
- IN HANDLE hLogHandle,
- IN DWORD dwEventType,
- IN DWORD dwMessageId,
- IN DWORD dwSubStringCount,
- IN LPSTR *plpszSubStringArray,
- IN DWORD dwErrorCode
- );
-
- VOID
- RouterLogEventDataA(
- IN HANDLE hLogHandle,
- IN DWORD dwEventType,
- IN DWORD dwMessageId,
- IN DWORD dwSubStringCount,
- IN LPSTR *plpszSubStringArray,
- IN DWORD dwDataBytes,
- IN LPBYTE lpDataBytes
- );
-
- VOID
- RouterLogEventStringA(
- IN HANDLE hLogHandle,
- IN DWORD dwEventType,
- IN DWORD dwMessageId,
- IN DWORD dwSubStringCount,
- IN LPSTR *plpszSubStringArray,
- IN DWORD dwErrorCode,
- IN DWORD dwErrorIndex
- );
-
- DWORD
- RouterGetErrorStringA(
- IN DWORD dwErrorCode,
- OUT LPSTR * lplpszErrorString
- );
-
- #define RouterLogErrorA(h,msg,count,array,err) \
- RouterLogEventA(h,EVENTLOG_ERROR_TYPE,msg,count,array,err)
- #define RouterLogWarningA(h,msg,count,array,err) \
- RouterLogEventA(h,EVENTLOG_WARNING_TYPE,msg,count,array,err)
- #define RouterLogInformationA(h,msg,count,array,err) \
- RouterLogEventA(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err)
-
- #define RouterLogErrorDataA(h,msg,count,array,c,buf) \
- RouterLogEventDataA(h,EVENTLOG_ERROR_TYPE,msg,count,array,c,buf)
- #define RouterLogWarningDataA(h,msg,count,array,c,buf) \
- RouterLogEventDataA(h,EVENTLOG_WARNING_TYPE,msg,count,array,c,buf)
- #define RouterLogInformationDataA(h,msg,count,array,c,buf) \
- RouterLogEventDataA(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,c,buf)
-
- #define RouterLogErrorStringA(h,msg,count,array,err,index) \
- RouterLogEventStringA(h,EVENTLOG_ERROR_TYPE,msg,count,array, err,index)
- #define RouterLogWarningStringA(h,msg,count,array,err,index) \
- RouterLogEventStringA(h,EVENTLOG_WARNING_TYPE,msg,count,array,err,index)
- #define RouterLogInformationStringA(h,msg,count,array, err,index) \
- RouterLogEventStringA(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err,\
- index)
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Unicode prototypes //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- HANDLE
- RouterLogRegisterW(
- LPCWSTR lpszSource
- );
-
- VOID
- RouterLogDeregisterW(
- HANDLE hLogHandle
- );
-
- VOID
- RouterLogEventW(
- IN HANDLE hLogHandle,
- IN DWORD dwEventType,
- IN DWORD dwMessageId,
- IN DWORD dwSubStringCount,
- IN LPWSTR *plpszSubStringArray,
- IN DWORD dwErrorCode
- );
-
- VOID
- RouterLogEventDataW(
- IN HANDLE hLogHandle,
- IN DWORD dwEventType,
- IN DWORD dwMessageId,
- IN DWORD dwSubStringCount,
- IN LPWSTR *plpszSubStringArray,
- IN DWORD dwDataBytes,
- IN LPBYTE lpDataBytes
- );
-
- VOID
- RouterLogEventStringW(
- IN HANDLE hLogHandle,
- IN DWORD dwEventType,
- IN DWORD dwMessageId,
- IN DWORD dwSubStringCount,
- IN LPWSTR *plpszSubStringArray,
- IN DWORD dwErrorCode,
- IN DWORD dwErrorIndex
- );
-
- DWORD
- RouterGetErrorStringW(
- IN DWORD dwErrorCode,
- OUT LPWSTR * lplpwszErrorString
- );
-
-
- #define RouterLogErrorW(h,msg,count,array,err) \
- RouterLogEventW(h,EVENTLOG_ERROR_TYPE,msg,count,array,err)
- #define RouterLogWarningW(h,msg,count,array,err) \
- RouterLogEventW(h,EVENTLOG_WARNING_TYPE,msg,count,array,err)
- #define RouterLogInformationW(h,msg,count,array,err) \
- RouterLogEventW(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err)
-
- #define RouterLogErrorDataW(h,msg,count,array,c,buf) \
- RouterLogEventDataW(h,EVENTLOG_ERROR_TYPE,msg,count,array,c,buf)
- #define RouterLogWarningDataW(h,msg,count,array,c,buf) \
- RouterLogEventDataW(h,EVENTLOG_WARNING_TYPE,msg,count,array,c,buf)
- #define RouterLogInformationDataW(h,msg,count,array,c,buf) \
- RouterLogEventDataW(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,c,buf)
-
- #define RouterLogErrorStringW(h,msg,count,array,err,index) \
- RouterLogEventStringW(h,EVENTLOG_ERROR_TYPE,msg,count,array,err,index)
- #define RouterLogWarningStringW(h,msg,count,array,err,index) \
- RouterLogEventStringW(h,EVENTLOG_WARNING_TYPE,msg,count,array,err,index)
- #define RouterLogInformationStringW(h,msg,count,array,err,index) \
- RouterLogEventStringW(h,EVENTLOG_INFORMATION_TYPE,msg,count,array,err,\
- index)
-
-
- #ifdef UNICODE
- #define RouterLogRegister RouterLogRegisterW
- #define RouterLogDeregister RouterLogDeregisterW
- #define RouterLogEvent RouterLogEventW
- #define RouterLogError RouterLogErrorW
- #define RouterLogWarning RouterLogWarningW
- #define RouterLogInformation RouterLogInformationW
- #define RouterLogEventData RouterLogEventDataW
- #define RouterLogErrorData RouterLogErrorDataW
- #define RouterLogWarningData RouterLogWarningDataW
- #define RouterLogInformationData RouterLogInformationDataW
- #define RouterLogEventString RouterLogEventStringW
- #define RouterLogErrorString RouterLogErrorStringW
- #define RouterLogWarningString RouterLogWarningStringW
- #define RouterLogInformationString RouterLogInformationStringW
- #define RouterGetErrorString RouterGetErrorStringW
- #
- #else
- #define RouterLogRegister RouterLogRegisterA
- #define RouterLogDeregister RouterLogDeregisterA
- #define RouterLogEvent RouterLogEventA
- #define RouterLogError RouterLogErrorA
- #define RouterLogWarning RouterLogWarningA
- #define RouterLogInformation RouterLogInformationA
- #define RouterLogEventData RouterLogEventDataA
- #define RouterLogErrorData RouterLogErrorDataA
- #define RouterLogWarningData RouterLogWarningDataA
- #define RouterLogInformationData RouterLogInformationDataA
- #define RouterLogEventString RouterLogEventStringA
- #define RouterLogErrorString RouterLogErrorStringA
- #define RouterLogWarningString RouterLogWarningStringA
- #define RouterLogInformationString RouterLogInformationStringA
- #define RouterGetErrorString RouterGetErrorStringA
- #endif
-
-
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // WORKER THREAD POOL FUNCTIONS //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // definition of worker function passed in QueueWorkItem API //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- typedef VOID (APIENTRY * WORKERFUNCTION)(PVOID);
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Function: Queues the supplied work item in the work queue. //
- // //
- // functionptr: function to be called must be of WORKERFUNCTION type //
- // context: opaque ptr //
- // serviceinalertablethread: if TRUE gets scheduled in //
- // a alertably waiting thread that never dies //
- // Returns: 0 (success) //
- // Win32 error codes for cases like out of memory //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- DWORD
- APIENTRY
- QueueWorkItem(
- IN WORKERFUNCTION functionptr,
- IN PVOID context,
- IN BOOL serviceinalertablethread
- );
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Function: Associates file handle with the completion port (all //
- // asynchronous i/o on this handle will be queued to //
- // the completion port) //
- // //
- // FileHandle: File handle to be associated with completion port //
- // //
- // CompletionProc: Procedure to be called when io associated with the file //
- // handle completes. This function will be executed in //
- // the context of non-alertable worker thread //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- DWORD
- APIENTRY
- SetIoCompletionProc (
- IN HANDLE FileHandle,
- IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionProc
- );
-
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // The following defines are included here as a hint on how the worker //
- // thread pool is managed: //
- // //
- // There are NUM_ALERTABLE_THREADS permanent threads that never quit and //
- // wait alertably on a alertable worker queue. These threads should solely //
- // be used for work items that intiate asyncronous operation (file io, //
- // waitable timer) that ABSOLUTELY require APCs to complete (preferable //
- // method for IO is the usage of completio port API) //
- // //
- // There is a pool of the threads that wait on completion port //
- // that used both for processing of IO and non-IO related work items //
- // //
- // The minimum number of threads is Number of processors //
- // The maximum number of threads is MAX_WORKER_THREADS //
- // //
- // A new thread is created if worker queue has not been served for more //
- // that WORK_QUEUE_TIMEOUT //
- // The existing thread will be shut down if it is not used for more than //
- // THREAD_IDLE_TIMEOUT //
- // //
- // Note that worker threads age guaranteed to be alive for at least //
- // THREAD_IDLE_TIMEOUT after the last work item is executed. This timeout //
- // is chosen such that bulk of IO request could be completed before it //
- // expires. If it is not enough for your case, use alertable thread with //
- // APC, or create your own thread. //
- // //
- // Note: changing these flags will not change anything. //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Number of alertable threads //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define NUM_ALERTABLE_THREADS 2
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Max number of threads at any time //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define MAX_WORKER_THREADS 10
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Time that the worker queue is not served before starting new thread //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define WORK_QUEUE_TIMEOUT 1 //sec
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // Time that thread has to be idle before exiting //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define THREAD_IDLE_TIMEOUT 10 //sec
-
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // ROUTER ASSERT DECLARATION //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- VOID
- RouterAssert(
- IN PSTR pszFailedAssertion,
- IN PSTR pszFileName,
- IN DWORD dwLineNumber,
- IN PSTR pszMessage OPTIONAL
- );
-
-
- #if DBG
- #define RTASSERT(exp) \
- if (!(exp)) \
- RouterAssert(#exp, __FILE__, __LINE__, NULL)
- #define RTASSERTMSG(msg, exp) \
- if (!(exp)) \
- RouterAssert(#exp, __FILE__, __LINE__, msg)
- #else
- #define RTASSERT(exp)
- #define RTASSERTMSG(msg, exp)
- #endif
-
- //////////////////////////////////////////////////////////////////////////////
- // //
- // REGISTRY CONFIGURATION FUNCTIONS //
- // //
- // The following definitions are used to read configuration information //
- // about installed protocols. //
- // //
- // Call 'MprSetupProtocolEnum' to enumerate the routing-protocols //
- // for transport 'dwTransportId'. This fills an array with entries //
- // of type 'MPR_PROTOCOL_0'. //
- // //
- // The array loaded can be destroyed by calling 'MprSetupProtocolFree'. //
- // //
- //////////////////////////////////////////////////////////////////////////////
-
- #define MAX_PROTOCOL_NAME_LEN 40
- #define MAX_PROTOCOL_DLL_LEN 48
-
- typedef struct _MPR_PROTOCOL_0 {
-
- DWORD dwProtocolId; // e.g. IP_RIP
- WCHAR wszProtocol[MAX_PROTOCOL_NAME_LEN+1]; // e.g. "IPRIP"
- WCHAR wszDLLName[MAX_PROTOCOL_DLL_LEN+1]; // e.g. "iprip2.dll"
-
- } MPR_PROTOCOL_0;
-
-
- DWORD APIENTRY
- MprSetupProtocolEnum(
- IN DWORD dwTransportId,
- OUT LPBYTE* lplpBuffer, // MPR_PROTOCOL_0
- OUT LPDWORD lpdwEntriesRead
- );
-
-
- DWORD APIENTRY
- MprSetupProtocolFree(
- IN LPVOID lpBuffer
- );
-
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif // ___ROUTING_RTUTILS_H__
-
-
-