/********************************************************************/
/**               Copyright(c) 1989 Microsoft Corporation.         **/
/********************************************************************/

//***
//
// Filename:    util.h
//
// Description: Contains prototype of utility funtions and procedures
//
// History:
//      Oct 31,1993.    NarenG          Created original version.
//

#ifndef _UTIL_
#define _UTIL_

#include "lcp.h"

DWORD
AllocateAndInitBcb(
    PCB * pPcb
);

VOID
NotifyCaller( 
    IN PCB * pPcb,
    IN DWORD PppEvent,
    IN PVOID pData                      
);

VOID
NotifyCallerOfFailureOnPort(
    IN HPORT hPort,
    IN BOOL  fServer,
    IN DWORD dwRetCode
);

VOID
NotifyCallerOfFailure( 
    IN PCB * pPcb,
    IN DWORD dwRetCode
);

VOID
InitRestartCounters( 
    IN PCB *  pPcb, 
    IN CPCB * pCpCb 
);

VOID
HostToWireFormat16(
    IN     WORD  wHostFormat,
    IN OUT PBYTE pWireFormat
);

WORD
WireToHostFormat16(
    IN PBYTE pWireFormat
);

VOID
HostToWireFormat32( 
    IN     DWORD dwHostFormat,
    IN OUT PBYTE pWireFormat
);

DWORD
WireToHostFormat32(
    IN PBYTE pWireFormat
);

DWORD
HashPortToBucket(
    IN HPORT hPort
);

VOID
InsertWorkItemInQ(
    IN PCB_WORK_ITEM * pWorkItem
);

VOID
LogPPPEvent( 
    IN DWORD dwEventId,
    IN DWORD dwData
);

DWORD
GetCpIndexFromProtocol( 
    IN DWORD dwProtocol 
);

BOOL
IsLcpOpened(
    PCB * pPcb
);

PCB * 
GetPCBPointerFromhPort( 
    IN HPORT hPort 
);

BCB * 
GetBCBPointerFromhConnection( 
    IN HCONN hConnection
);

DWORD
NumLinksInBundle(
    IN BCB * pBcb
);

PCB * 
GetPCBPointerFromBCB( 
    IN BCB * pBcb
);

DWORD
AreNCPsDone( 
    IN PCB *                       pPcb,
    IN DWORD                       CpIndex,
    IN OUT PPP_PROJECTION_RESULT * pProjectionResult,
    IN OUT BOOL *                  pfNCPsAreDone
);

BYTE
GetUId(
    IN PCB * pPcb,
    IN DWORD CpIndex
);

VOID
AlertableWaitForSingleObject(
    IN HANDLE hObject
);

BOOL
NotifyIPCPOfNBFCPProjection( 
    IN PCB *                    pPcb, 
    IN DWORD                    CpIndex
);

DWORD
CalculateRestartTimer(
    IN HPORT hPort
);

VOID
CheckCpsForInactivity( 
    IN PCB * pPcb,
	IN DWORD dwEvent
);

CHAR*
DecodePw(
	IN CHAR chSeed,
    IN OUT CHAR* pszPassword 
);

CHAR*
EncodePw(
	IN CHAR chSeed,
    IN OUT CHAR* pszPassword 
);

VOID
GetLocalComputerName( 
    IN OUT LPSTR szComputerName 
);

DWORD
InitEndpointDiscriminator( 
    IN OUT BYTE EndPointDiscriminator[]
);

VOID
DeallocateAndRemoveBcbFromTable(
    IN BCB * pBcb
);

VOID
RemovePcbFromTable(
    IN PCB * pPcb
);

BOOL
WillPortBeBundled(
    IN  PCB *   pPcb
);

DWORD
TryToBundleWithAnotherLink( 
    IN  PCB *   pPcb
); 

VOID
AdjustHTokenImpersonateUser(
    IN  PCB *   pPcb
);

BOOL
FLinkDiscriminatorIsUnique(
    IN  PCB *   pPcb,
    OUT DWORD * pdwLinkDisc
);

DWORD
InitializeNCPs(
    IN PCB * pPcb,
    IN DWORD dwConfigMask
);

CPCB *
GetPointerToCPCB(
    IN PCB * pPcb,
    IN DWORD CpIndex
);

DWORD
GetNewPortOrBundleId(
    VOID
);

NCP_PHASE
QueryBundleNCPState(
    IN PCB * pPcb
);

VOID
NotifyCallerOfBundledProjection( 
    IN  PCB * pPcb
);

VOID
StartNegotiatingNCPs(
    IN PCB * pPcb
);

VOID
StartAutoDisconnectForPort( 
    IN PCB * pPcb 
);

VOID
StartLCPEchoForPort( 
    IN PCB * pPcb 
);

VOID
NotifyCompletionOnBundledPorts(
    IN PCB * pPcb
);

VOID
RemoveNonNumerals( 
    IN  CHAR*   szString
);

CHAR*
TextualSidFromPid(
    DWORD   dwPid
);

DWORD
GetRouterPhoneBook(
    CHAR**  pszPhonebookPath
);

DWORD
GetCredentialsFromInterface(
    PCB *   pPcb
);

BOOL
IsCpIndexOfAp( 
    IN DWORD CpIndex 
);

VOID
StopAccounting(
    PVOID pContext
);

VOID
InterimAccounting(
    PVOID pContext
);

VOID
StartAccounting(
    PVOID pContext
);

PBYTE
GetClientInterfaceInfo(
    IN PCB * pPcb
);

VOID
LoadParserDll(
    IN  HKEY    hKeyPpp
);

DWORD
PortSendOrDisconnect(
    IN PCB *        pPcb,
    IN DWORD        cbPacket
);

VOID 
ReceiveViaParser(
    IN PCB *        pPcb,
    IN PPP_PACKET * pPacket,
    IN DWORD        dwPacketLength
);

DWORD
GetSecondsSince1970(
    VOID
);

BOOL
IsPschedRunning(
    VOID
);

VOID
PppLog(
    IN DWORD DbgLevel,
    ...
    );

VOID
LogPPPPacket(
    IN BOOL         fReceived,
    IN PCB *        pPcb,
    IN PPP_PACKET * pPacket,
    IN DWORD        cbPacket
);

VOID
CreateAccountingAttributes(
    IN PCB * pPcb
);

VOID
MakeStartAccountingCall(
    IN PCB * pPcb
);

VOID
MakeStopOrInterimAccountingCall(
    IN PCB *    pPcb,
    IN BOOL     fInterimAccounting
);

RAS_AUTH_ATTRIBUTE * 
GetUserAttributes( 
    PCB * pPcb 
);

#define BYTESPERLINE 16

#ifdef MEM_LEAK_CHECK

#define PPP_MEM_TABLE_SIZE 100

PVOID PppMemTable[PPP_MEM_TABLE_SIZE];

#define LOCAL_ALLOC     DebugAlloc
#define LOCAL_FREE      DebugFree
#define LOCAL_REALLOC   DebugReAlloc

LPVOID
DebugAlloc( DWORD Flags, DWORD dwSize );

BOOL
DebugFree( PVOID pMem );

LPVOID
DebugReAlloc( PVOID pMem, DWORD dwSize );

#else

#define LOCAL_ALLOC(Flags,dwSize)   HeapAlloc( PppConfigInfo.hHeap,  \
                                               HEAP_ZERO_MEMORY, dwSize )

#define LOCAL_FREE(hMem)            HeapFree( PppConfigInfo.hHeap, 0, hMem )

#define LOCAL_REALLOC(hMem,dwSize)  HeapReAlloc( PppConfigInfo.hHeap,  \
                                                 HEAP_ZERO_MEMORY,hMem,dwSize)

#endif

#define PPP_ASSERT      RTASSERT

#endif