281 lines
6.2 KiB
C
281 lines
6.2 KiB
C
|
/********************************************************************/
|
|||
|
/** Copyright(c) 1995 Microsoft Corporation. **/
|
|||
|
/********************************************************************/
|
|||
|
|
|||
|
//***
|
|||
|
//
|
|||
|
// Filename: util.c
|
|||
|
//
|
|||
|
// Description: Various miscillaneous routines
|
|||
|
//
|
|||
|
// History: May 11,1995 NarenG Created original version.
|
|||
|
//
|
|||
|
|
|||
|
#include "dimsvcp.h"
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: GetTransportIndex
|
|||
|
//
|
|||
|
// Returns: Index of the tansport entry in the interface object
|
|||
|
//
|
|||
|
// Description: Given the id of a protocol return an index.
|
|||
|
//
|
|||
|
DWORD
|
|||
|
GetTransportIndex(
|
|||
|
IN DWORD dwProtocolId
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD dwTransportIndex;
|
|||
|
|
|||
|
for ( dwTransportIndex = 0;
|
|||
|
dwTransportIndex < gblDIMConfigInfo.dwNumRouterManagers;
|
|||
|
dwTransportIndex++ )
|
|||
|
{
|
|||
|
if ( gblRouterManagers[dwTransportIndex].DdmRouterIf.dwProtocolId
|
|||
|
== dwProtocolId )
|
|||
|
{
|
|||
|
return( dwTransportIndex );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return( (DWORD)-1 );
|
|||
|
}
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: GetDDMEntryPoint
|
|||
|
//
|
|||
|
// Returns: Pointer to entry point into DDM - success
|
|||
|
// NULL - failure
|
|||
|
//
|
|||
|
// Description: Will return the entry point into the DDM if there is one.
|
|||
|
//
|
|||
|
FARPROC
|
|||
|
GetDDMEntryPoint(
|
|||
|
IN LPSTR lpEntryPoint
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD dwIndex;
|
|||
|
|
|||
|
for ( dwIndex = 0;
|
|||
|
gblDDMFunctionTable[dwIndex].lpEntryPointName != NULL;
|
|||
|
dwIndex ++ )
|
|||
|
{
|
|||
|
if ( _stricmp( gblDDMFunctionTable[dwIndex].lpEntryPointName,
|
|||
|
lpEntryPoint ) == 0 )
|
|||
|
{
|
|||
|
return( gblDDMFunctionTable[dwIndex].pEntryPoint );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return( NULL );
|
|||
|
}
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: GetSizeOfDialoutHoursRestriction
|
|||
|
//
|
|||
|
// Returns: size in bytes of lpwsDialoutHoursRestriction
|
|||
|
//
|
|||
|
// Description: Utility to calculate the size in bytes of the MULTI_SZ pointed
|
|||
|
// to by lpwsDialoutHoursRestriction.
|
|||
|
//
|
|||
|
DWORD
|
|||
|
GetSizeOfDialoutHoursRestriction(
|
|||
|
IN LPWSTR lpwsMultSz
|
|||
|
)
|
|||
|
{
|
|||
|
LPWSTR lpwsPtr = lpwsMultSz;
|
|||
|
DWORD dwcbBytes = 0;
|
|||
|
DWORD dwCurCount;
|
|||
|
|
|||
|
if ( lpwsMultSz == NULL )
|
|||
|
{
|
|||
|
return( 0 );
|
|||
|
}
|
|||
|
|
|||
|
while( *lpwsPtr != L'\0' )
|
|||
|
{
|
|||
|
dwCurCount = ( wcslen( lpwsPtr ) + 1 );
|
|||
|
dwcbBytes += dwCurCount;
|
|||
|
lpwsPtr += dwCurCount;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// One more for the last NULL terminator
|
|||
|
//
|
|||
|
|
|||
|
dwcbBytes++;
|
|||
|
|
|||
|
dwcbBytes *= sizeof( WCHAR );
|
|||
|
|
|||
|
return( dwcbBytes );
|
|||
|
}
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: IsInterfaceRoleAcceptable
|
|||
|
//
|
|||
|
// Returns: TRUE if the interface plays a role that is compatible with the
|
|||
|
// given transport and router configuration.
|
|||
|
//
|
|||
|
// FALSE otherwise.
|
|||
|
//
|
|||
|
// Description: Some interfaces are only acceptable to some transports when
|
|||
|
// the router is running in a certain mode. The classic example
|
|||
|
// is the internal ip interface which will be rejected by the IP
|
|||
|
// router manager when in lan-only mode.
|
|||
|
//
|
|||
|
// The acceptable roles are hardcoded in this function.
|
|||
|
// At the time this function was written, there was only one
|
|||
|
// interface (internal ip) whose role was important to any
|
|||
|
// transport. In the future, instead of harcoding more roles
|
|||
|
// into this function, we should consider adding "role" as a
|
|||
|
// per-interface property both to the runtime structures
|
|||
|
// and to the permanant store.
|
|||
|
//
|
|||
|
BOOL
|
|||
|
IsInterfaceRoleAcceptable(
|
|||
|
IN ROUTER_INTERFACE_OBJECT* pIfObject,
|
|||
|
IN DWORD dwTransportId)
|
|||
|
{
|
|||
|
if (pIfObject == NULL)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if ((gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN) &&
|
|||
|
(dwTransportId == PID_IP) &&
|
|||
|
(pIfObject->IfType == ROUTER_IF_TYPE_INTERNAL))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef MEM_LEAK_CHECK
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: DebugAlloc
|
|||
|
//
|
|||
|
// Returns: return from HeapAlloc
|
|||
|
//
|
|||
|
// Description: Will use the memory table to store the pointer returned by
|
|||
|
// LocalAlloc
|
|||
|
//
|
|||
|
LPVOID
|
|||
|
DebugAlloc( DWORD Flags, DWORD dwSize )
|
|||
|
{
|
|||
|
DWORD Index;
|
|||
|
LPVOID pMem = HeapAlloc(gblDIMConfigInfo.hHeap, HEAP_ZERO_MEMORY,dwSize+4);
|
|||
|
|
|||
|
if ( pMem == NULL )
|
|||
|
{
|
|||
|
return( pMem );
|
|||
|
}
|
|||
|
|
|||
|
for( Index=0; Index < DIM_MEM_TABLE_SIZE; Index++ )
|
|||
|
{
|
|||
|
if ( DimMemTable[Index] == NULL )
|
|||
|
{
|
|||
|
DimMemTable[Index] = pMem;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Our signature
|
|||
|
//
|
|||
|
|
|||
|
*(((LPBYTE)pMem)+dwSize) = 0x0F;
|
|||
|
*(((LPBYTE)pMem)+dwSize+1) = 0x0E;
|
|||
|
*(((LPBYTE)pMem)+dwSize+2) = 0x0A;
|
|||
|
*(((LPBYTE)pMem)+dwSize+3) = 0x0B;
|
|||
|
|
|||
|
RTASSERT( Index != DIM_MEM_TABLE_SIZE );
|
|||
|
|
|||
|
return( pMem );
|
|||
|
}
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: DebugFree
|
|||
|
//
|
|||
|
// Returns: return from HeapFree
|
|||
|
//
|
|||
|
// Description: Will remove the pointer from the memeory table before freeing
|
|||
|
// the memory block
|
|||
|
//
|
|||
|
BOOL
|
|||
|
DebugFree( PVOID pMem )
|
|||
|
{
|
|||
|
DWORD Index;
|
|||
|
|
|||
|
for( Index=0; Index < DIM_MEM_TABLE_SIZE; Index++ )
|
|||
|
{
|
|||
|
if ( DimMemTable[Index] == pMem )
|
|||
|
{
|
|||
|
DimMemTable[Index] = NULL;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
RTASSERT( Index != DIM_MEM_TABLE_SIZE );
|
|||
|
|
|||
|
return( HeapFree( gblDIMConfigInfo.hHeap, 0, pMem ) );
|
|||
|
}
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: DebugReAlloc
|
|||
|
//
|
|||
|
// Returns: return from HeapReAlloc
|
|||
|
//
|
|||
|
// Description: Will change the value of the realloced pointer.
|
|||
|
//
|
|||
|
LPVOID
|
|||
|
DebugReAlloc( PVOID pMem, DWORD dwSize )
|
|||
|
{
|
|||
|
DWORD Index;
|
|||
|
|
|||
|
if ( pMem == NULL )
|
|||
|
{
|
|||
|
RTASSERT(FALSE);
|
|||
|
}
|
|||
|
|
|||
|
for( Index=0; Index < DDM_MEM_TABLE_SIZE; Index++ )
|
|||
|
{
|
|||
|
if ( DdmMemTable[Index] == pMem )
|
|||
|
{
|
|||
|
DdmMemTable[Index] = HeapReAlloc( gblDDMConfigInfo.hHeap,
|
|||
|
HEAP_ZERO_MEMORY,
|
|||
|
pMem, dwSize+8 );
|
|||
|
|
|||
|
pMem = DdmMemTable[Index];
|
|||
|
|
|||
|
*((LPDWORD)pMem) = dwSize;
|
|||
|
|
|||
|
((LPBYTE)pMem) += 4;
|
|||
|
|
|||
|
//
|
|||
|
// Our signature
|
|||
|
//
|
|||
|
|
|||
|
*(((LPBYTE)pMem)+dwSize) = 0x0F;
|
|||
|
*(((LPBYTE)pMem)+dwSize+1) = 0x0E;
|
|||
|
*(((LPBYTE)pMem)+dwSize+2) = 0x0A;
|
|||
|
*(((LPBYTE)pMem)+dwSize+3) = 0x0B;
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
RTASSERT( Index != DDM_MEM_TABLE_SIZE );
|
|||
|
|
|||
|
return( (LPVOID)pMem );
|
|||
|
}
|
|||
|
|
|||
|
#endif
|