windows-nt/Source/XPSP1/NT/net/rras/netsh/ipx/ipxmon/stroutes.c
2020-09-26 16:20:57 +08:00

1174 lines
34 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
stroutes.c
Abstract:
IPX Router Console Monitoring and Configuration tool.
Static Route configuration and monitoring.
Author:
Vadim Eydelman 06/07/1996
--*/
#include "precomp.h"
#pragma hdrstop
#define OPERATION_DEL_STATICROUTE (-1)
#define OPERATION_SET_STATICROUTE 0
#define OPERATION_ADD_STATICROUTE 1
DWORD
UpdateStRtInfo (
LPBYTE pIfBlock,
PUCHAR Network,
PUCHAR pNextHop OPTIONAL,
PUSHORT pTicks OPTIONAL,
PUSHORT pHops OPTIONAL
);
DWORD
AdmSetStRt (
int operation,
LPWSTR InterfaceNameW,
PUCHAR Network,
PUCHAR pNexHop OPTIONAL,
PUSHORT pTicks OPTIONAL,
PUSHORT pHops OPTIONAL
);
DWORD
CfgSetStRt (
int operation,
LPWSTR InterfaceNameW,
PUCHAR Network,
PUCHAR pNexHop OPTIONAL,
PUSHORT pTicks OPTIONAL,
PUSHORT pHops OPTIONAL
);
int
APIENTRY
HelpStRt(
IN int argc,
IN WCHAR *argv[]
)
{
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
return 0;
}
int
APIENTRY
ShowStRt(
IN int argc,
IN WCHAR *argv[],
IN BOOL bDump
)
{
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD rc, dwSize = sizeof(IfName);
if (argc > 0)
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen (InterfaceNameW);
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
LPBYTE pIfBlock;
BOOLEAN fRouter = FALSE;
UCHAR Network[4];
if (argc > 1)
{
ULONG val4;
UINT n;
if ((argc == 2)
&& ( swscanf (argv[1], L"%8lx%n", &val4, &n) == 1)
&& (n == wcslen (argv[1])))
{
Network[0] = (BYTE)(val4 >> 24);
Network[1] = (BYTE)(val4 >> 16);
Network[2] = (BYTE)(val4 >> 8);
Network[3] = (BYTE)val4;
}
else
{
if ( !bDump )
{
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
rc = ERROR_INVALID_PARAMETER;
goto Exit;
}
}
else
{
if ( !bDump )
{
DisplayIPXMessage (g_hModule, MSG_STATICROUTE_TABLE_HDR);
}
}
if (g_hMprAdmin)
{
HANDLE hIfAdm;
rc = MprAdminInterfaceGetHandle(
g_hMprAdmin, IfName, &hIfAdm, FALSE
);
if (rc == NO_ERROR)
{
DWORD sz;
rc = MprAdminInterfaceTransportGetInfo(
g_hMprAdmin, hIfAdm, PID_IPX, &pIfBlock, &sz
);
}
if (rc == NO_ERROR)
{
fRouter = TRUE;
}
else
{
if ( !bDump )
{
DisplayError( g_hModule, rc);
}
goto GetFromCfg;
}
}
else
{
HANDLE hIfCfg;
GetFromCfg:
rc = MprConfigInterfaceGetHandle(
g_hMprConfig, IfName, &hIfCfg
);
if (rc == NO_ERROR)
{
HANDLE hIfTrCfg;
rc = MprConfigInterfaceTransportGetHandle(
g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg
);
if (rc == NO_ERROR)
{
DWORD sz;
rc = MprConfigInterfaceTransportGetInfo(
g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
);
}
}
}
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pSrToc;
pSrToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_ROUTE_INFO_TYPE
);
if (pSrToc != NULL)
{
PIPX_STATIC_ROUTE_INFO pSrInfo;
UINT i;
pSrInfo = (PIPX_STATIC_ROUTE_INFO)
(pIfBlock + pSrToc->Offset);
for (i = 0; i < pSrToc->Count; i++, pSrInfo++)
{
if (argc > 1)
{
if (memcmp (Network, pSrInfo->Network, sizeof (Network))
== 0)
{
DisplayIPXMessage(
g_hModule,
MSG_STATICROUTE_SCREEN_FMT,
pSrInfo->Network[0], pSrInfo->Network[1],
pSrInfo->Network[2], pSrInfo->Network[3],
pSrInfo->NextHopMacAddress[0],
pSrInfo->NextHopMacAddress[1],
pSrInfo->NextHopMacAddress[2],
pSrInfo->NextHopMacAddress[3],
pSrInfo->NextHopMacAddress[4],
pSrInfo->NextHopMacAddress[5],
pSrInfo->TickCount, pSrInfo->HopCount
);
break;
}
}
else
{
if ( bDump )
{
DisplayMessageT(
DMP_IPX_ADD_STATIC_ROUTE, InterfaceNameW,
pSrInfo->Network[0], pSrInfo->Network[1],
pSrInfo->Network[2], pSrInfo->Network[3],
pSrInfo->NextHopMacAddress[0],
pSrInfo->NextHopMacAddress[1],
pSrInfo->NextHopMacAddress[2],
pSrInfo->NextHopMacAddress[3],
pSrInfo->NextHopMacAddress[4],
pSrInfo->NextHopMacAddress[5],
pSrInfo->TickCount, pSrInfo->HopCount
);
}
else
{
DisplayIPXMessage(
g_hModule, MSG_STATICROUTE_TABLE_FMT,
pSrInfo->Network[0], pSrInfo->Network[1],
pSrInfo->Network[2], pSrInfo->Network[3],
pSrInfo->NextHopMacAddress[0],
pSrInfo->NextHopMacAddress[1],
pSrInfo->NextHopMacAddress[2],
pSrInfo->NextHopMacAddress[3],
pSrInfo->NextHopMacAddress[4],
pSrInfo->NextHopMacAddress[5],
pSrInfo->TickCount, pSrInfo->HopCount
);
}
}
}
if ((argc > 1) && (i >= pSrToc->Count))
{
rc = ERROR_NOT_FOUND;
if ( !bDump )
{
DisplayError( g_hModule, rc );
}
}
}
else
{
rc = ERROR_NOT_FOUND;
if ( !bDump )
{
DisplayIPXMessage (g_hModule, MSG_STATICROUTE_NONE_FOUND );
}
}
if (fRouter)
{
MprAdminBufferFree (pIfBlock);
}
else
{
MprConfigBufferFree (pIfBlock);
}
}
else
{
if ( !bDump )
{
DisplayError( g_hModule, rc);
}
}
}
else
{
if ( !bDump )
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
}
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
if ( !bDump )
{
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
rc = ERROR_INVALID_PARAMETER;
}
Exit:
return rc ;
#undef InterfaceNameW
}
int
APIENTRY
SetStRt (
IN int argc,
IN WCHAR *argv[]
)
{
DWORD rc = NO_ERROR, rc2;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
if (argc > 1)
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen (InterfaceNameW);
//======================================
// Translate the Interface Name
//======================================
rc2 = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
ULONG val4;
ULONGLONG val8;
UINT n;
UCHAR Network[4];
if (( swscanf (argv[1], L"%8lx%n", &val4, &n) == 1)
&& (n == wcslen (argv[1])))
{
int i;
UCHAR nextHop[6];
USHORT ticks, hops;
PUCHAR pNextHop = NULL;
PUSHORT pTicks = NULL, pHops = NULL;
Network[0] = (BYTE)(val4 >> 24);
Network[1] = (BYTE)(val4 >> 16);
Network[2] = (BYTE)(val4 >> 8);
Network[3] = (BYTE)val4;
for (i = 2; i < argc; i++)
{
if ( !_wcsicmp( argv[i], TOKEN_NEXTHOPMACADDRESS ) )
{
if ((pNextHop == NULL)
&& (i < argc - 1)
&& ( swscanf (argv[i+1], L"%12I64x%n", &val8, &n) == 1)
&& ( n == wcslen( argv[i+1] )))
{
i += 1;
nextHop[0] = (BYTE)(val8 >> 40);
nextHop[1] = (BYTE)(val8 >> 32);
nextHop[2] = (BYTE)(val8 >> 24);
nextHop[3] = (BYTE)(val8 >> 16);
nextHop[4] = (BYTE)(val8 >> 8);
nextHop[5] = (BYTE)val8;
pNextHop = nextHop;
}
else
{
break;
}
}
else if ( !_wcsicmp( argv[i], TOKEN_TICKS ) )
{
if ( (pTicks == NULL) && (i < argc - 1)
&& ( swscanf ( argv[i+1], L"%hd%n", &ticks, &n) == 1)
&& (n == wcslen (argv[i+1])))
{
i += 1;
pTicks = &ticks;
}
else
{
break;
}
}
else if ( !_wcsicmp ( argv[i], TOKEN_HOPS ) )
{
if ((pHops == NULL)
&& (i < argc - 1)
&& ( swscanf (argv[i+1], L"%hd%n", &hops, &n) == 1)
&& (n == wcslen (argv[i+1])))
{
i += 1;
pHops = &hops;
}
else
{
break;
}
}
else if (pNextHop == NULL)
{
if (( swscanf (argv[i], L"%12I64x%n", &val8, &n) == 1)
&& (n == wcslen (argv[i])))
{
nextHop[0] = (BYTE)(val8 >> 40);
nextHop[1] = (BYTE)(val8 >> 32);
nextHop[2] = (BYTE)(val8 >> 24);
nextHop[3] = (BYTE)(val8 >> 16);
nextHop[4] = (BYTE)(val8 >> 8);
nextHop[5] = (BYTE)val8;
pNextHop = nextHop;
}
else
{
break;
}
}
else if (pTicks == NULL)
{
if (( swscanf (argv[i], L"%hd%n", &ticks, &n) == 1)
&& (n == wcslen (argv[i])))
{
pTicks = &ticks;
}
else
{
break;
}
}
else if (pHops == NULL)
{
if (( swscanf (argv[i], L"%hd%n", &hops, &n) == 1)
&& (n == wcslen (argv[i])))
{
pHops = &hops;
}
else
{
break;
}
}
else
{
break;
}
}
if (i == argc)
{
if (g_hMprAdmin)
{
rc = AdmSetStRt(
OPERATION_SET_STATICROUTE, IfName, Network,
pNextHop, pTicks, pHops
);
}
else
{
rc = NO_ERROR;
}
if (rc == NO_ERROR)
{
rc = CfgSetStRt(
OPERATION_SET_STATICROUTE, IfName, Network,
pNextHop, pTicks, pHops
);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
rc = ERROR_INVALID_PARAMETER;
}
return rc ;
#undef InterfaceNameW
}
int
APIENTRY
CreateStRt (
IN int argc,
IN WCHAR *argv[]
)
{
DWORD rc = NO_ERROR, rc2;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
BOOL bArgsCount, //does the argument count match
AdjNH, AdjTicks, AdjHops; //adjust for option names
bArgsCount = FALSE;
AdjNH = AdjTicks = AdjHops = 0;
if (argc > 5)
{
if ( !_wcsicmp( argv[2], TOKEN_NEXTHOPMACADDRESS ) )
{
AdjNH = 1;
}
if (argc > 5 + AdjNH)
{
if ( !_wcsicmp( argv[3+AdjNH], TOKEN_TICKS ) )
{
AdjTicks = 1;
}
}
if (argc > 5 + AdjNH + AdjTicks)
{
if ( !_wcsicmp( argv[4+AdjNH+AdjTicks], TOKEN_HOPS ) )
{
AdjHops = 1;
}
}
bArgsCount = (argc == (5 + AdjNH + AdjTicks + AdjHops)) ? TRUE : FALSE;
// make the adjustment cumulative
AdjTicks += AdjNH;
AdjHops += AdjTicks;
}
if ( (argc == 5) || (bArgsCount) )
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen (InterfaceNameW);
//======================================
// Translate the Interface Name
//======================================
rc2 = IpmontrGetIfNameFromFriendlyName( InterfaceNameW, IfName, &dwSize );
if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
UINT n;
ULONG val4;
ULONGLONG val8;
UCHAR Network[4], NextHop[6];
USHORT Ticks, Hops;
if (( swscanf (argv[1], L"%8lx%n", &val4, &n) == 1)
&& (n == wcslen (argv[1])))
{
Network[0] = (BYTE)(val4 >> 24);
Network[1] = (BYTE)(val4 >> 16);
Network[2] = (BYTE)(val4 >> 8);
Network[3] = (BYTE)val4;
if (( swscanf (argv[2+AdjNH], L"%12I64x%n", &val8, &n) == 1)
&& (n == wcslen (argv[2+AdjNH])))
{
NextHop[0] = (BYTE)(val8 >> 40);
NextHop[1] = (BYTE)(val8 >> 32);
NextHop[2] = (BYTE)(val8 >> 24);
NextHop[3] = (BYTE)(val8 >> 16);
NextHop[4] = (BYTE)(val8 >> 8);
NextHop[5] = (BYTE)val8;
if (( swscanf (argv[3+AdjTicks], L"%hd%n", &Ticks, &n) == 1)
&& (n == wcslen (argv[3+AdjTicks])))
{
if (( swscanf (argv[4+AdjHops], L"%hd%n", &Hops,&n) == 1)
&& (n == wcslen (argv[4+AdjHops])))
{
if (g_hMprAdmin)
{
rc = AdmSetStRt(
OPERATION_ADD_STATICROUTE, IfName,
Network, NextHop, &Ticks, &Hops
);
}
else
{
rc = NO_ERROR;
}
if (rc == NO_ERROR)
{
rc = CfgSetStRt(
OPERATION_ADD_STATICROUTE, IfName,
Network, NextHop, &Ticks, &Hops
);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
rc = ERROR_INVALID_PARAMETER;
}
return rc ;
#undef InterfaceNameW
}
int
APIENTRY
DeleteStRt(
IN int argc,
IN WCHAR *argv[]
)
{
DWORD rc, rc2;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
if (argc == 2)
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen (InterfaceNameW);
//======================================
// Translate the Interface Name
//======================================
rc2 = IpmontrGetIfNameFromFriendlyName( InterfaceNameW, IfName, &dwSize );
if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
UINT n;
ULONG val4;
UCHAR Network[4];
if (( swscanf (argv[1], L"%8x%n", &val4, &n) == 1)
&& (n == wcslen (argv[1])))
{
Network[0] = (BYTE)(val4 >> 24);
Network[1] = (BYTE)(val4 >> 16);
Network[2] = (BYTE)(val4 >> 8);
Network[3] = (BYTE)val4;
if (g_hMprAdmin)
{
rc = AdmSetStRt(
OPERATION_DEL_STATICROUTE, IfName, Network,
NULL, NULL, NULL
);
}
else
{
rc = NO_ERROR;
}
if (rc == NO_ERROR)
{
rc = CfgSetStRt(
OPERATION_DEL_STATICROUTE, IfName, Network,
NULL, NULL, NULL
);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayIPXMessage (g_hModule, MSG_IPX_HELP_STATICROUTE);
}
return rc ;
#undef InterfaceNameW
}
BOOL
StRtEqual (
PVOID info1,
PVOID info2
)
{
#define StRt1 ((PIPX_STATIC_ROUTE_INFO)info1)
#define StRt2 ((PIPX_STATIC_ROUTE_INFO)info2)
return memcmp (StRt1->Network, StRt2->Network, 4) == 0;
#undef StRt1
#undef StRt2
}
DWORD
AdmSetStRt (
int operation,
LPWSTR InterfaceNameW,
PUCHAR Network,
PUCHAR pNextHop OPTIONAL,
PUSHORT pTicks OPTIONAL,
PUSHORT pHops OPTIONAL
)
{
DWORD rc;
WCHAR IfDispName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfDispName);
HANDLE hIfAdm;
rc = MprAdminInterfaceGetHandle(
g_hMprAdmin, InterfaceNameW, &hIfAdm, FALSE
);
if (rc == NO_ERROR)
{
LPBYTE pIfBlock;
DWORD sz;
rc = MprAdminInterfaceTransportGetInfo(
g_hMprAdmin, hIfAdm, PID_IPX, &pIfBlock, &sz
);
if ( rc == NO_ERROR )
{
UINT msg;
LPBYTE pNewBlock;
switch (operation)
{
case OPERATION_SET_STATICROUTE:
rc = UpdateStRtInfo(
pIfBlock, Network, pNextHop, pTicks, pHops
);
pNewBlock = pIfBlock;
msg = MSG_STATICROUTE_SET_ADM;
break;
case OPERATION_ADD_STATICROUTE:
{
IPX_STATIC_ROUTE_INFO SrInfo;
memcpy (SrInfo.Network, Network, sizeof (SrInfo.Network));
memcpy (SrInfo.NextHopMacAddress, pNextHop, sizeof (SrInfo.NextHopMacAddress));
SrInfo.TickCount = *pTicks;
SrInfo.HopCount = *pHops;
rc = AddIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_ROUTE_INFO_TYPE,
sizeof (SrInfo), &SrInfo, StRtEqual,
(PIPX_INFO_BLOCK_HEADER * ) & pNewBlock
);
msg = MSG_STATICROUTE_CREATED_ADM;
break;
}
case OPERATION_DEL_STATICROUTE:
{
IPX_STATIC_ROUTE_INFO SrInfo;
memcpy (SrInfo.Network, Network, sizeof (SrInfo.Network));
rc = DeleteIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_ROUTE_INFO_TYPE,
sizeof (SrInfo), &SrInfo, StRtEqual,
(PIPX_INFO_BLOCK_HEADER * ) &pNewBlock
);
msg = MSG_STATICROUTE_DELETED_ADM;
break;
}
}
if (rc == NO_ERROR)
{
rc = MprAdminInterfaceTransportSetInfo(
g_hMprAdmin, hIfAdm, PID_IPX, pNewBlock,
((PIPX_INFO_BLOCK_HEADER)pNewBlock)->Size
);
if (pNewBlock != pIfBlock)
{
GlobalFree (pNewBlock);
}
if (rc == NO_ERROR)
{
DWORD rc2;
//======================================
// Translate the Interface Name
//======================================
rc2 = IpmontrGetFriendlyNameFromIfName(
InterfaceNameW, IfDispName, &dwSize
);
if ( rc2 == NO_ERROR )
{
DisplayIPXMessage (g_hModule, msg, IfDispName );
}
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayError( g_hModule, rc);
}
MprAdminBufferFree (pIfBlock);
}
}
else
{
DisplayError( g_hModule, rc);
}
return rc;
}
DWORD
CfgSetStRt (
int operation,
LPWSTR InterfaceNameW,
PUCHAR Network,
PUCHAR pNextHop OPTIONAL,
PUSHORT pTicks OPTIONAL,
PUSHORT pHops OPTIONAL
)
{
DWORD rc;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
HANDLE hIfCfg;
rc = MprConfigInterfaceGetHandle(
g_hMprConfig, InterfaceNameW, &hIfCfg
);
if (rc == NO_ERROR)
{
HANDLE hIfTrCfg;
rc = MprConfigInterfaceTransportGetHandle(
g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg
);
if (rc == NO_ERROR)
{
LPBYTE pIfBlock;
DWORD sz;
LPBYTE pNewBlock;
rc = MprConfigInterfaceTransportGetInfo(
g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
);
if (rc == NO_ERROR)
{
UINT msg;
switch (operation)
{
case OPERATION_SET_STATICROUTE:
rc = UpdateStRtInfo(
pIfBlock, Network, pNextHop, pTicks,
pHops
);
pNewBlock = pIfBlock;
msg = MSG_STATICROUTE_SET_CFG;
break;
case OPERATION_ADD_STATICROUTE:
{
IPX_STATIC_ROUTE_INFO SrInfo;
memcpy (SrInfo.Network, Network, sizeof (SrInfo.Network));
memcpy (SrInfo.NextHopMacAddress, pNextHop,
sizeof (SrInfo.NextHopMacAddress));
SrInfo.TickCount = *pTicks;
SrInfo.HopCount = *pHops;
rc = AddIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_ROUTE_INFO_TYPE,
sizeof (SrInfo), &SrInfo,
StRtEqual,
(PIPX_INFO_BLOCK_HEADER * ) & pNewBlock
);
msg = MSG_STATICROUTE_CREATED_CFG;
break;
}
case OPERATION_DEL_STATICROUTE:
{
IPX_STATIC_ROUTE_INFO SrInfo;
memcpy (SrInfo.Network, Network, sizeof (SrInfo.Network));
rc = DeleteIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_ROUTE_INFO_TYPE,
sizeof (SrInfo), &SrInfo,
StRtEqual, (PIPX_INFO_BLOCK_HEADER * ) & pNewBlock
);
msg = MSG_STATICROUTE_DELETED_CFG;
break;
}
}
if (rc == NO_ERROR)
{
rc = MprConfigInterfaceTransportSetInfo(
g_hMprConfig, hIfCfg, hIfTrCfg, pNewBlock,
((PIPX_INFO_BLOCK_HEADER)pNewBlock)->Size
);
if (pNewBlock != pIfBlock)
{
GlobalFree (pNewBlock);
}
if (rc == NO_ERROR)
{
DWORD rc2;
rc2 = IpmontrGetFriendlyNameFromIfName(
InterfaceNameW, IfName, &dwSize
);
if ( rc2 == NO_ERROR )
{
DisplayIPXMessage (g_hModule, msg, IfName );
}
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayError( g_hModule, rc);
}
MprConfigBufferFree (pIfBlock);
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayError( g_hModule, rc);
}
return rc;
}
DWORD
UpdateStRtInfo (
LPBYTE pIfBlock,
PUCHAR Network,
PUCHAR pNextHop OPTIONAL,
PUSHORT pTicks OPTIONAL,
PUSHORT pHops OPTIONAL
)
{
DWORD rc;
PIPX_TOC_ENTRY pSrToc;
pSrToc = GetIPXTocEntry(
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_ROUTE_INFO_TYPE
);
if (pSrToc != NULL)
{
PIPX_STATIC_ROUTE_INFO pSrInfo;
UINT i;
pSrInfo = (PIPX_STATIC_ROUTE_INFO) (pIfBlock + pSrToc->Offset);
for (i = 0; i < pSrToc->Count; i++, pSrInfo++)
{
if (memcmp (Network, pSrInfo->Network, sizeof (Network)) == 0)
break;
}
if (i < pSrToc->Count)
{
if (ARGUMENT_PRESENT (pNextHop))
{
memcpy (pSrInfo->NextHopMacAddress, pNextHop,
sizeof (pSrInfo->NextHopMacAddress));
}
if (ARGUMENT_PRESENT (pTicks))
{
pSrInfo->TickCount = *pTicks;
}
if (ARGUMENT_PRESENT (pHops))
{
pSrInfo->HopCount = *pHops;
}
rc = NO_ERROR;
}
else
{
rc = ERROR_FILE_NOT_FOUND;
}
}
else
{
rc = ERROR_FILE_NOT_FOUND;
}
return rc;
}