/*++

Copyright (c) 1994 Microsoft Corporation

Module Name:

    Cons.h

Abstract:

    Global constant and macro definitions for the RNR Sample Service.

Author:

    Charles K. Moore (keithmo)   24-July-1994

Revision History:

--*/


#ifndef _CONS_H_
#define _CONS_H_


//
//  This #define controls how this image is built.  If this symbol
//  is NOT #defined, then this image will be built as an NT service.
//  If this symbol IS #defined, then this image will be built as a
//  stand-alone executable.  This makes debugging a bit easier.
//

// #define BUILD_STANDALONE_EXE


//
//  The name of this service.
//

#define RNR_SERVICE_NAME    TEXT("rnrsvc")


//
//  The (arbitrary) maximum number of sockets we'll listen on.
//

#define MAX_SOCKETS 20


//
//  The (arbitrary) maximum number of protocols we'll support.
//

#define MAX_PROTOCOLS 10


//
//  Macros to make event log access a bit easier.
//

#define RNR_LOG0(id,err)                                                \
            if( 1 ) {                                                   \
                RnrLogEvent( (id), 0, NULL, (err) );                    \
            } else

#define RNR_LOG1(id,err,s0)                                             \
            if( 1 ) {                                                   \
                LPTSTR apsz[1];                                         \
                                                                        \
                szSub[0] = (s1);                                        \
                RnrLogEvent( (id), 1, apszSub, (err) );                 \
            } else

#define RNR_LOG2(id,err,s0,s1)                                          \
            if( 1 ) {                                                   \
                LPTSTR apsz[2];                                         \
                                                                        \
                szSub[0] = (s0);                                        \
                szSub[1] = (s1);                                        \
                RnrLogEvent( (id), 2, apszSub, (err) );                 \
            } else

#define RNR_LOG3(id,err,s0,s1,s2)                                       \
            if( 1 ) {                                                   \
                LPTSTR apsz[3];                                         \
                                                                        \
                szSub[0] = (s0);                                        \
                szSub[1] = (s1);                                        \
                szSub[2] = (s2);                                        \
                RnrLogEvent( (id), 3, apszSub, (err) );                 \
            } else

#define RNR_LOG4(id,err,s0,s1,s2,s3)                                    \
            if( 1 ) {                                                   \
                LPTSTR apsz[4];                                         \
                                                                        \
                szSub[0] = (s0);                                        \
                szSub[1] = (s1);                                        \
                szSub[2] = (s2);                                        \
                szSub[3] = (s3);                                        \
                RnrLogEvent( (id), 4, apszSub, (err) );                 \
            } else


//
//  Linked list manipulators stolen from NTRTL.H.
//

//
//  VOID
//  InitializeListHead(
//      PLIST_ENTRY ListHead
//      );
//

#define InitializeListHead(ListHead) (\
    (ListHead)->Flink = (ListHead)->Blink = (ListHead))

//
//  BOOLEAN
//  IsListEmpty(
//      PLIST_ENTRY ListHead
//      );
//

#define IsListEmpty(ListHead) \
    ((ListHead)->Flink == (ListHead))

//
//  PLIST_ENTRY
//  RemoveHeadList(
//      PLIST_ENTRY ListHead
//      );
//

#define RemoveHeadList(ListHead) \
    (ListHead)->Flink;\
    {RemoveEntryList((ListHead)->Flink)}

//
//  PLIST_ENTRY
//  RemoveTailList(
//      PLIST_ENTRY ListHead
//      );
//

#define RemoveTailList(ListHead) \
    (ListHead)->Blink;\
    {RemoveEntryList((ListHead)->Blink)}

//
//  VOID
//  RemoveEntryList(
//      PLIST_ENTRY Entry
//      );
//

#define RemoveEntryList(Entry) {\
    PLIST_ENTRY _EX_Blink;\
    PLIST_ENTRY _EX_Flink;\
    _EX_Flink = (Entry)->Flink;\
    _EX_Blink = (Entry)->Blink;\
    _EX_Blink->Flink = _EX_Flink;\
    _EX_Flink->Blink = _EX_Blink;\
    }

//
//  VOID
//  InsertTailList(
//      PLIST_ENTRY ListHead,
//      PLIST_ENTRY Entry
//      );
//

#define InsertTailList(ListHead,Entry) {\
    PLIST_ENTRY _EX_Blink;\
    PLIST_ENTRY _EX_ListHead;\
    _EX_ListHead = (ListHead);\
    _EX_Blink = _EX_ListHead->Blink;\
    (Entry)->Flink = _EX_ListHead;\
    (Entry)->Blink = _EX_Blink;\
    _EX_Blink->Flink = (Entry);\
    _EX_ListHead->Blink = (Entry);\
    }

//
//  VOID
//  InsertHeadList(
//      PLIST_ENTRY ListHead,
//      PLIST_ENTRY Entry
//      );
//

#define InsertHeadList(ListHead,Entry) {\
    PLIST_ENTRY _EX_Flink;\
    PLIST_ENTRY _EX_ListHead;\
    _EX_ListHead = (ListHead);\
    _EX_Flink = _EX_ListHead->Flink;\
    (Entry)->Flink = _EX_Flink;\
    (Entry)->Blink = _EX_ListHead;\
    _EX_Flink->Blink = (Entry);\
    _EX_ListHead->Flink = (Entry);\
    }


//
//  Stolen from NTDEF.H.
//

//
// Calculate the address of the base of the structure given its type, and an
// address of a field within the structure.
//

#define CONTAINING_RECORD(address, type, field) ((type *)( \
                                                  (PCHAR)(address) - \
                                                  (PCHAR)(&((type *)0)->field)))


//
//  Make it easier to replace the memory allocation functions later.
//

#define RNR_ALLOC(cb)   (LPVOID)LocalAlloc( LPTR, (cb) )
#define RNR_FREE(p)     LocalFree( (HLOCAL)(p) )


#endif  // _CONS_H_