Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
745 lines
28 KiB
C++
745 lines
28 KiB
C++
/*++
|
|
|
|
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__
|
|
|
|
|