1515 lines
31 KiB
C
1515 lines
31 KiB
C
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
routing\netsh\ipx\ipxhandle.c
|
|
|
|
Abstract:
|
|
|
|
IPX Command handler.
|
|
|
|
Revision History:
|
|
|
|
V Raman 12/2/98 Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
DWORD
|
|
HandleIpxInterface(
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
);
|
|
|
|
DWORD
|
|
HandleIpxStaticRoute(
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
);
|
|
|
|
DWORD
|
|
HandleIpxStaticService(
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
);
|
|
|
|
DWORD
|
|
HandleIpxTrafficFilters(
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
);
|
|
|
|
//
|
|
// Handle static route operations
|
|
//
|
|
|
|
DWORD
|
|
HandleIpxAddRoute(
|
|
IN LPCWSTR pwszMachineName,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT PBOOL pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles addition of static IPX routes by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticRoute(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_ADD
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxDelRoute(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles deletion of static IPX routes by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticRoute(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_DELETE
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxSetRoute(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles update of static IPX routes by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticRoute(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SET
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxShowRoute(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles display of static IPX routes by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticRoute(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SHOW
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxStaticRoute(
|
|
IN OUT LPWSTR *ppwcOldArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwOldArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle static route operations
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
bAdd - flag indicating whether IPX is being added or deleted
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
BOOL bFreeNewArg = FALSE;
|
|
PWCHAR pwszIfName;
|
|
DWORD dwArgCount = dwOldArgCount;
|
|
PWCHAR *ppwcArguments = NULL;
|
|
|
|
//
|
|
// Check if name= option is specified
|
|
//
|
|
|
|
pwszIfName = TOKEN_INTERFACE_NAME;
|
|
|
|
if ( pwszIfName == NULL )
|
|
{
|
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
DisplayError( g_hModule, dwErr );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
do {
|
|
// Munge arguments into old format
|
|
dwErr = MungeArguments(
|
|
ppwcOldArguments, dwOldArgCount, (PBYTE *) &ppwcArguments,
|
|
&dwArgCount, &bFreeNewArg
|
|
);
|
|
if (dwErr)
|
|
{
|
|
break;
|
|
}
|
|
|
|
|
|
if ( ( dwCurrentIndex < dwArgCount ) &&
|
|
!_wcsnicmp(
|
|
ppwcArguments[ dwCurrentIndex ], pwszIfName, wcslen( pwszIfName )
|
|
) )
|
|
{
|
|
//
|
|
// ok name= option tag specified, remove it and the following space
|
|
//
|
|
|
|
wcscpy(
|
|
ppwcArguments[ dwCurrentIndex ],
|
|
&ppwcArguments[ dwCurrentIndex ][ wcslen( pwszIfName ) + 2 ]
|
|
);
|
|
}
|
|
|
|
|
|
//
|
|
// Now invoke the original routemon routine with what looks
|
|
// like an appriate command line
|
|
//
|
|
|
|
switch ( ioOP )
|
|
{
|
|
case IPX_OPERATION_ADD :
|
|
|
|
dwErr = CreateStRt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_DELETE :
|
|
|
|
dwErr = DeleteStRt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SET :
|
|
|
|
dwErr = SetStRt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SHOW :
|
|
|
|
dwErr = ShowStRt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex,
|
|
FALSE
|
|
);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} while (FALSE);
|
|
|
|
if ( bFreeNewArg )
|
|
{
|
|
FreeArgTable( dwOldArgCount, ppwcArguments );
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
//
|
|
// Handle static service operations
|
|
//
|
|
|
|
DWORD
|
|
HandleIpxAddService(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles addition of static IPX services by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticService(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_ADD
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxDelService(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles deletion of static IPX services by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticService(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_DELETE
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxSetService(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles update of static IPX services by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticService(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SET
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxShowService(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles display of static IPX services by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxStaticService(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SHOW
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxStaticService(
|
|
IN OUT LPWSTR *ppwcOldArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwOldArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle static service operations
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
bAdd - flag indicating whether IPX is being added or deleted
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
BOOL bFreeNewArg = FALSE;
|
|
PWCHAR pwszIfName;
|
|
DWORD dwArgCount = dwOldArgCount;
|
|
PWCHAR *ppwcArguments = NULL;
|
|
|
|
//
|
|
// Check if name= option is specified
|
|
//
|
|
|
|
pwszIfName = TOKEN_INTERFACE_NAME;
|
|
|
|
if ( pwszIfName == NULL )
|
|
{
|
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
DisplayError( g_hModule, dwErr );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
do {
|
|
// Munge arguments into old format
|
|
dwErr = MungeArguments(
|
|
ppwcOldArguments, dwOldArgCount, (PBYTE *) &ppwcArguments,
|
|
&dwArgCount, &bFreeNewArg
|
|
);
|
|
if (dwErr)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if ( ( dwCurrentIndex < dwArgCount ) &&
|
|
!_wcsnicmp(
|
|
ppwcArguments[ dwCurrentIndex ], pwszIfName, wcslen( pwszIfName )
|
|
) )
|
|
{
|
|
//
|
|
// ok name= option tag specified, remove it and the following space
|
|
//
|
|
|
|
wcscpy(
|
|
ppwcArguments[ dwCurrentIndex ],
|
|
&ppwcArguments[ dwCurrentIndex ][ wcslen( pwszIfName ) + 2 ]
|
|
);
|
|
}
|
|
|
|
|
|
//
|
|
// Now invoke the original routemon routine with what looks
|
|
// like an appriate command line
|
|
//
|
|
|
|
switch ( ioOP )
|
|
{
|
|
case IPX_OPERATION_ADD :
|
|
|
|
dwErr = CreateStSvc(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_DELETE :
|
|
|
|
dwErr = DeleteStSvc(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SET :
|
|
|
|
dwErr = SetStSvc(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SHOW :
|
|
|
|
dwErr = ShowStSvc(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex,
|
|
FALSE
|
|
);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} while (FALSE);
|
|
|
|
if ( bFreeNewArg )
|
|
{
|
|
FreeArgTable( dwOldArgCount, ppwcArguments );
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Handle packet filter operations
|
|
//
|
|
|
|
DWORD
|
|
HandleIpxAddFilter(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles addition of IPX traffic filters by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxTrafficFilters(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_ADD
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxDelFilter(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles deletion of IPX traffic filters by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxTrafficFilters(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_DELETE
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxSetFilter(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles update of IPX traffic filters by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxTrafficFilters(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SET
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxShowFilter(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This function handles display of IPX traffic filters by
|
|
mapping the parameters to those required by the corresp.
|
|
routemon routine.
|
|
|
|
|
|
Arguments :
|
|
|
|
ppwcArguments - list of arguments to the add route command
|
|
|
|
dwCurrentIndex - index of current argument in the argument table
|
|
|
|
dwArgCount - Number of arguments in the argument table
|
|
|
|
pbDone - As yet undetermined
|
|
|
|
|
|
Return Value
|
|
|
|
NO_ERROR - Success
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxTrafficFilters(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SHOW
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxTrafficFilters(
|
|
IN OUT LPWSTR *ppwcOldArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwOldArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle traffic filter operations
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
bAdd - flag indicating whether IPX is being added or deleted
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
BOOL bFreeNewArg = FALSE;
|
|
PWCHAR pwszIfName;
|
|
DWORD dwArgCount = dwOldArgCount;
|
|
PWCHAR *ppwcArguments = NULL;
|
|
|
|
//
|
|
// Check if name= option is specified
|
|
//
|
|
|
|
pwszIfName = TOKEN_INTERFACE_NAME;
|
|
|
|
if ( pwszIfName == NULL )
|
|
{
|
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
DisplayError( g_hModule, dwErr );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
do {
|
|
// Munge arguments into old format
|
|
dwErr = MungeArguments(
|
|
ppwcOldArguments, dwOldArgCount, (PBYTE *) &ppwcArguments,
|
|
&dwArgCount, &bFreeNewArg
|
|
);
|
|
if (dwErr)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if ( ( dwCurrentIndex < dwArgCount ) &&
|
|
!_wcsnicmp(
|
|
ppwcArguments[ dwCurrentIndex ], pwszIfName, wcslen( pwszIfName )
|
|
) )
|
|
{
|
|
//
|
|
// ok name= option tag specified, remove it and the following space
|
|
//
|
|
|
|
wcscpy(
|
|
ppwcArguments[ dwCurrentIndex ],
|
|
&ppwcArguments[ dwCurrentIndex ][ wcslen( pwszIfName ) + 2 ]
|
|
);
|
|
}
|
|
|
|
|
|
//
|
|
// Now invoke the original routemon routine with what looks
|
|
// like an appriate command line
|
|
//
|
|
|
|
switch ( ioOP )
|
|
{
|
|
case IPX_OPERATION_ADD :
|
|
|
|
dwErr = CreateTfFlt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_DELETE :
|
|
|
|
dwErr = DeleteTfFlt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SET :
|
|
|
|
dwErr = SetTfFlt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SHOW :
|
|
|
|
dwErr = ShowTfFlt(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex,
|
|
FALSE
|
|
);
|
|
|
|
break;
|
|
|
|
}
|
|
} while (FALSE);
|
|
|
|
if ( bFreeNewArg )
|
|
{
|
|
FreeArgTable( dwOldArgCount, ppwcArguments );
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
//
|
|
// Handle interface operations
|
|
//
|
|
|
|
DWORD
|
|
HandleIpxAddInterface(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle interface addition
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
pbDone - Don't know
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxInterface(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_ADD
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxDelInterface(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle interface addition
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
pbDone - Don't know
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxInterface(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_DELETE
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxSetInterface(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle interface addition
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
pbDone - Don't know
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxInterface(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SET
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxShowInterface(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle interface addition
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
pbDone - Don't know
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
return HandleIpxInterface(
|
|
ppwcArguments, dwCurrentIndex, dwArgCount, IPX_OPERATION_SHOW
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD
|
|
HandleIpxInterface(
|
|
IN OUT LPWSTR *ppwcOldArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwOldArgCount,
|
|
IN IPX_OPERATION ioOP
|
|
)
|
|
/*++
|
|
|
|
Routine Description :
|
|
|
|
This routine munges the command line and invokes the appropriate
|
|
routemon routine to handle interface addition
|
|
|
|
Arguments :
|
|
ppwcArguments - command line argument array
|
|
dwCurrentIndex - current argument under consideration
|
|
dwArgCount - Number of arguments in ppwcArguments
|
|
bAdd - flag indicating whether IPX is being added or deleted
|
|
|
|
Return Value :
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
BOOL bFreeNewArg = FALSE;
|
|
PWCHAR pwszIfName;
|
|
DWORD dwArgCount = dwOldArgCount;
|
|
PWCHAR *ppwcArguments = NULL;
|
|
|
|
//
|
|
// Check if name= option is specified
|
|
//
|
|
|
|
pwszIfName = TOKEN_INTERFACE_NAME;
|
|
|
|
if ( pwszIfName == NULL )
|
|
{
|
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
DisplayError( g_hModule, dwErr );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
do {
|
|
// Munge arguments into old format
|
|
dwErr = MungeArguments(
|
|
ppwcOldArguments, dwOldArgCount, (PBYTE *) &ppwcArguments,
|
|
&dwArgCount, &bFreeNewArg
|
|
);
|
|
if (dwErr)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if ( ( dwCurrentIndex < dwArgCount ) &&
|
|
!_wcsnicmp(
|
|
ppwcArguments[ dwCurrentIndex ], pwszIfName, wcslen( pwszIfName )
|
|
) )
|
|
{
|
|
//
|
|
// ok name= option tag specified, remove it and the following space
|
|
//
|
|
|
|
wcscpy(
|
|
ppwcArguments[ dwCurrentIndex ],
|
|
&ppwcArguments[ dwCurrentIndex ][ wcslen( pwszIfName ) + 2 ]
|
|
);
|
|
}
|
|
|
|
|
|
//
|
|
// Now invoke the original routemon routine with what looks
|
|
// like an appriate command line
|
|
//
|
|
|
|
switch ( ioOP )
|
|
{
|
|
case IPX_OPERATION_ADD :
|
|
|
|
dwErr = InstallIpx(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_DELETE :
|
|
|
|
dwErr = RemoveIpx(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SET :
|
|
|
|
dwErr = SetIpxIf(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
case IPX_OPERATION_SHOW :
|
|
|
|
dwErr = ShowIpxIf(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex,
|
|
FALSE
|
|
);
|
|
|
|
break;
|
|
|
|
}
|
|
} while (FALSE);
|
|
|
|
if ( bFreeNewArg )
|
|
{
|
|
FreeArgTable( dwOldArgCount, ppwcArguments );
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
//
|
|
// Handle loglevel operations
|
|
//
|
|
|
|
DWORD
|
|
HandleIpxSetLoglevel(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
DWORD dwErr;
|
|
BOOL bFreeNewArg = FALSE;
|
|
DWORD dwNewArgCount = dwArgCount;
|
|
PWCHAR *ppwcNewArguments = NULL;
|
|
|
|
do {
|
|
// Munge arguments into old format
|
|
dwErr = MungeArguments(
|
|
ppwcArguments, dwArgCount, (PBYTE *) &ppwcNewArguments,
|
|
&dwNewArgCount, &bFreeNewArg
|
|
);
|
|
if (dwErr)
|
|
{
|
|
break;
|
|
}
|
|
|
|
dwErr= SetIpxGl( dwNewArgCount - dwCurrentIndex,
|
|
ppwcNewArguments + dwCurrentIndex );
|
|
|
|
} while (FALSE);
|
|
|
|
if ( bFreeNewArg )
|
|
{
|
|
FreeArgTable( dwArgCount, ppwcNewArguments );
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxShowLoglevel(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
return ShowIpxGl(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex,
|
|
FALSE
|
|
);
|
|
}
|
|
|
|
DWORD
|
|
HandleIpxUpdate(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxShowRouteTable(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
return ShowRoute(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
HandleIpxShowServiceTable(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
return ShowService(
|
|
dwArgCount - dwCurrentIndex,
|
|
ppwcArguments + dwCurrentIndex
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IpxDump(
|
|
IN LPCWSTR pwszRouter,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwArgCount,
|
|
IN LPCVOID pvData
|
|
)
|
|
{
|
|
BOOL bDone;
|
|
DWORD dwErr;
|
|
|
|
dwErr = ConnectToRouter(pwszRouter);
|
|
if (dwErr)
|
|
{
|
|
return dwErr;
|
|
}
|
|
|
|
DisplayIPXMessage (g_hModule, MSG_IPX_DUMP_HEADER );
|
|
|
|
DisplayMessageT( DMP_IPX_HEADER );
|
|
|
|
DumpIpxInformation(pwszRouter, ppwcArguments,dwArgCount,g_hMIBServer);
|
|
|
|
DisplayMessageT( DMP_IPX_FOOTER );
|
|
|
|
DisplayIPXMessage (g_hModule, MSG_IPX_DUMP_FOOTER );
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
|
|
VOID
|
|
DumpIpxInformation(
|
|
IN LPCWSTR pwszMachineName,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwArgCount,
|
|
IN MIB_SERVER_HANDLE hMibServer
|
|
)
|
|
{
|
|
DWORD dwErr, dwRead = 0, dwTot = 0, i;
|
|
PMPR_INTERFACE_0 IfList;
|
|
WCHAR IfDisplayName[ MAX_INTERFACE_NAME_LEN + 1 ];
|
|
DWORD dwSize = sizeof(IfDisplayName);
|
|
PWCHAR argv[1];
|
|
//
|
|
// dump globals
|
|
//
|
|
|
|
ShowIpxGl( 0, NULL, TRUE );
|
|
|
|
|
|
//
|
|
// dump interfaces
|
|
//
|
|
|
|
ShowIpxIf( 0, NULL, TRUE );
|
|
|
|
|
|
//
|
|
// enumerate interfaces
|
|
//
|
|
|
|
if ( g_hMprAdmin )
|
|
{
|
|
dwErr = MprAdminInterfaceEnum(
|
|
g_hMprAdmin, 0, (unsigned char **)&IfList, MAXULONG, &dwRead,
|
|
&dwTot,NULL
|
|
);
|
|
}
|
|
|
|
else
|
|
{
|
|
dwErr = MprConfigInterfaceEnum(
|
|
g_hMprConfig, 0, (unsigned char **)&IfList, MAXULONG, &dwRead,
|
|
&dwTot,NULL
|
|
);
|
|
}
|
|
|
|
if ( dwErr != NO_ERROR )
|
|
{
|
|
DisplayError( g_hModule, dwErr);
|
|
return;
|
|
}
|
|
|
|
|
|
//
|
|
// enumerate filters on each interface
|
|
//
|
|
|
|
DisplayIPXMessage (g_hModule, MSG_IPX_DUMP_TRAFFIC_FILTER_HEADER );
|
|
|
|
for ( i = 0; i < dwRead; i++ )
|
|
{
|
|
dwErr = IpmontrGetFriendlyNameFromIfName(
|
|
IfList[i].wszInterfaceName, IfDisplayName, &dwSize
|
|
);
|
|
|
|
if ( dwErr == NO_ERROR )
|
|
{
|
|
argv[0] = IfDisplayName;
|
|
|
|
ShowTfFlt( 1, argv, TRUE );
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Enumerate static routes on each interface
|
|
//
|
|
|
|
DisplayIPXMessage (g_hModule, MSG_IPX_DUMP_STATIC_ROUTE_HEADER );
|
|
|
|
for ( i = 0; i < dwRead; i++ )
|
|
{
|
|
dwErr = IpmontrGetFriendlyNameFromIfName(
|
|
IfList[i].wszInterfaceName, IfDisplayName, &dwSize
|
|
);
|
|
|
|
if ( dwErr == NO_ERROR )
|
|
{
|
|
argv[0] = IfDisplayName;
|
|
|
|
ShowStRt( 1, argv, TRUE );
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Enumerate static services on each interface
|
|
//
|
|
|
|
DisplayIPXMessage (g_hModule, MSG_IPX_DUMP_STATIC_SERVICE_HEADER );
|
|
|
|
for ( i = 0; i < dwRead; i++ )
|
|
{
|
|
dwErr = IpmontrGetFriendlyNameFromIfName(
|
|
IfList[i].wszInterfaceName, IfDisplayName, &dwSize
|
|
);
|
|
|
|
if ( dwErr == NO_ERROR )
|
|
{
|
|
argv[0] = IfDisplayName;
|
|
|
|
ShowStSvc( 1, argv, TRUE );
|
|
}
|
|
}
|
|
|
|
|
|
if ( g_hMprAdmin )
|
|
{
|
|
MprAdminBufferFree( IfList );
|
|
}
|
|
else
|
|
{
|
|
MprConfigBufferFree( IfList );
|
|
}
|
|
}
|