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

1303 lines
35 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
nbifs.c
Abstract:
IPX Router Console Monitoring and Configuration tool.
NBIPX Interface configuration and monitoring.
Author:
Vadim Eydelman 06/07/1996
--*/
#include "precomp.h"
#pragma hdrstop
DWORD
MIBGetNbIpxIf(
PWCHAR InterfaceNameW,
HANDLE hFile
);
DWORD
CfgGetNbIpxIf (
LPWSTR InterfaceNameW,
HANDLE hFile
);
DWORD
MIBEnumNbIpxIfs (
VOID
);
DWORD
CfgEnumNbIpxIfs (
VOID
);
DWORD
CfgSetNbIpxIf (
LPWSTR InterfaceNameW,
PULONG pAccept OPTIONAL,
PULONG pDeliver OPTIONAL
);
DWORD
AdmSetNbIpxIf (
LPWSTR InterfaceNameW,
PULONG pAccept OPTIONAL,
PULONG pDeliver OPTIONAL
);
DWORD
GetNbIpxClientIf (
PWCHAR InterfaceNameW,
UINT msg,
HANDLE hFile
);
DWORD
APIENTRY
HelpNbIf (
IN int argc,
IN WCHAR *argv[]
)
{
DisplayMessage (g_hModule, HLP_IPX_NBIF);
return 0;
}
DWORD
APIENTRY
ShowNbIf (
IN int argc,
IN WCHAR *argv[],
IN HANDLE hFile
)
{
WCHAR IfName[ MAX_INTERFACE_NAME_LEN ];
DWORD rc, dwSize = sizeof(IfName);
if (argc < 1)
{
if (g_hMIBServer)
{
rc = MIBEnumNbIpxIfs ();
if (rc == NO_ERROR)
{
rc = GetNbIpxClientIf (
VAL_DIALINCLIENT,
MSG_CLIENT_NBIF_MIB_TABLE_FMT,
NULL
);
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_REGISTRY_FALLBACK); }
goto EnumerateThroughCfg;
}
}
else
{
EnumerateThroughCfg:
rc = CfgEnumNbIpxIfs ();
if (rc == NO_ERROR)
{
rc = GetNbIpxClientIf (
VAL_DIALINCLIENT,
MSG_CLIENT_NBIF_CFG_TABLE_FMT,
NULL
);
}
}
}
else
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen( InterfaceNameW );
if ( !_wcsicmp( argv[0], VAL_DIALINCLIENT ) )
{
rc = GetNbIpxClientIf(
VAL_DIALINCLIENT, MSG_CLIENT_NBIF_CFG_SCREEN_FMT, hFile
);
}
else if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
if (g_hMIBServer)
{
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
rc = MIBGetNbIpxIf ( IfName, hFile );
if (rc != NO_ERROR)
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_REGISTRY_FALLBACK); }
goto GetIfFromCfg;
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
}
else
{
GetIfFromCfg:
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
rc = CfgGetNbIpxIf ( IfName, hFile );
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc ); }
}
}
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); }
rc = ERROR_INVALID_PARAMETER;
}
}
return rc;
#undef InterfaceNameW
}
DWORD
APIENTRY
SetNbIf (
IN int argc,
IN WCHAR *argv[]
)
{
LPWSTR InterfaceNameW;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD rc, dwSize = sizeof(IfName);
if (argc >= 1)
{
unsigned count;
BOOLEAN client = FALSE;
#define InterfaceNameW argv[0]
if ( !_wcsicmp( argv[0],VAL_DIALINCLIENT ) )
{
client = TRUE;
}
else
{
count = wcslen (InterfaceNameW);
}
if (client || ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN)))
{
int i;
ULONG accept, deliver;
PULONG pAccept = NULL, pDeliver = NULL;
for ( i = 1; i < argc; i++ )
{
if ( !_wcsicmp( argv[i], TOKEN_BCASTACCEPT ) )
{
if ( (pAccept == NULL) && (i < argc - 1) &&
!MatchEnumTag(
g_hModule, argv[i+1], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &accept
) )
{
i += 1;
pAccept = &accept;
continue;
}
else
{
break;
}
}
if ( !_wcsicmp( argv[i], TOKEN_BCASTDELIVER ) )
{
if ( (pDeliver == NULL) && (i < argc - 1) &&
!MatchEnumTag (g_hModule, argv[i+1],
NUM_TOKENS_IN_TABLE( NbDeliverStates ),
NbDeliverStates, &deliver) )
{
i += 1;
pDeliver = &deliver;
continue;
}
else
{
break;
}
}
if (pAccept == NULL)
{
if ( !MatchEnumTag(
g_hModule, argv[ i ], NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates, &accept
))
{
pAccept = &accept;
}
else
{
break;
}
}
else if (pDeliver == NULL)
{
if ( !MatchEnumTag(
g_hModule, argv[i], NUM_TOKENS_IN_TABLE( NbDeliverStates ),
NbDeliverStates, &deliver
) )
{
pDeliver = &deliver;
}
else
{
break;
}
}
else
{
break;
}
}
if (i == argc)
{
if (!client)
{
DWORD rc2;
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
rc2 = CfgSetNbIpxIf( IfName, pAccept, pDeliver);
if (rc2 == NO_ERROR)
{
if (g_hMprAdmin)
{
rc = AdmSetNbIpxIf( IfName, pAccept, pDeliver );
}
}
else
{
rc = rc2;
}
}
else
{
DisplayError( g_hModule, rc );
}
}
else
{
rc = CfgSetNbIpxIf (NULL, pAccept, pDeliver);
if (rc == NO_ERROR)
{
if (g_hMprAdmin)
{
rc = AdmSetNbIpxIf (NULL, pAccept, pDeliver);
}
}
}
}
else
{
DisplayMessage (g_hModule, HLP_IPX_NBIF);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayMessage (g_hModule, HLP_IPX_NBIF);
rc = ERROR_INVALID_PARAMETER;
}
return rc;
#undef InterfaceNameW
}
DWORD
MIBGetNbIpxIf (
PWCHAR InterfaceNameW,
HANDLE hFile
)
{
DWORD rc, i;
DWORD sz;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
PIPX_INTERFACE pIf;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
rc = GetIpxInterfaceIndex (
g_hMIBServer, InterfaceNameW,
&MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex
);
if (rc == NO_ERROR)
{
rc = MprAdminMIBEntryGet(
g_hMIBServer, PID_IPX, IPX_PROTOCOL_BASE, &MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA), (LPVOID * ) & pIf, &sz
);
if (rc == NO_ERROR && pIf)
{
PWCHAR buffer[2];
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetFriendlyNameFromIfName( InterfaceNameW, IfName, &dwSize );
if ( rc == NO_ERROR )
{
buffer[ 0 ] = GetEnumString(
g_hModule, pIf->NetbiosAccept,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pIf->NetbiosDeliver,
NUM_TOKENS_IN_TABLE( NbDeliverStates ),
NbDeliverStates
);
if ( buffer[ 0 ] && buffer[ 1 ] )
{
if ( hFile )
{
DisplayMessageT(
DMP_IPX_NB_SET_INTERFACE, IfName, buffer[ 0 ],
buffer[ 1 ]
);
}
else
{
DisplayIPXMessage(
g_hModule, MSG_NBIF_MIB_SCREEN_FMT,
IfName, buffer[ 0 ], buffer[ 1 ],
pIf->IfStats.NetbiosReceived,
pIf->IfStats.NetbiosSent
);
}
}
}
MprAdminMIBBufferFree (pIf);
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
return rc;
}
DWORD
CfgGetNbIpxIf (
LPWSTR InterfaceNameW,
HANDLE hFile
)
{
DWORD rc;
DWORD sz;
HANDLE hIfCfg;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
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;
rc = MprConfigInterfaceTransportGetInfo (
g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
);
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pIpxToc;
pIpxToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_INTERFACE_INFO_TYPE);
if (pIpxToc != NULL)
{
DWORD i;
PIPX_IF_INFO pIpxInfo;
PWCHAR buffer[2];
pIpxInfo = (PIPX_IF_INFO) (pIfBlock + pIpxToc->Offset);
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetFriendlyNameFromIfName( InterfaceNameW, IfName, &dwSize );
if ( rc == NO_ERROR )
{
buffer[ 0 ] = GetEnumString(
g_hModule, pIpxInfo->NetbiosAccept,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pIpxInfo->NetbiosDeliver,
NUM_TOKENS_IN_TABLE( NbDeliverStates ),
NbDeliverStates
);
if ( buffer[ 0 ] && buffer[ 1 ] )
{
if ( hFile )
{
DisplayMessageT(
DMP_IPX_NB_SET_INTERFACE, IfName, buffer[ 0 ],
buffer[ 1 ]
);
}
else
{
DisplayIPXMessage(
g_hModule, MSG_NBIF_CFG_SCREEN_FMT,
IfName, buffer[ 0 ], buffer[ 1 ]
);
}
}
}
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED); }
rc = ERROR_INVALID_DATA;
}
}
else if ((rc == ERROR_FILE_NOT_FOUND) || (rc == ERROR_NO_MORE_ITEMS))
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_NO_IPX_ON_INTERFACE_CFG); }
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else if ((rc == ERROR_FILE_NOT_FOUND) || (rc == ERROR_NO_MORE_ITEMS))
{
if ( !hFile ) { DisplayError( g_hModule, ERROR_NO_SUCH_INTERFACE); }
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
return rc;
}
DWORD
GetNbIpxClientIf (
PWCHAR InterfaceName,
UINT msg,
HANDLE hFile
)
{
DWORD rc;
LPBYTE pClBlock;
HANDLE hTrCfg;
hTrCfg = NULL;
if (g_hMprAdmin)
{
DWORD sz;
rc = MprAdminTransportGetInfo(
g_hMprAdmin, PID_IPX, NULL, NULL, &pClBlock, &sz
);
if (rc == NO_ERROR)
{
}
else
{
if ((rc == ERROR_FILE_NOT_FOUND) || (rc == ERROR_NO_MORE_ITEMS))
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_NO_IPX_IN_ROUTER_ADM); }
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_REGISTRY_FALLBACK); }
goto GetFromCfg;
}
}
else
{
GetFromCfg:
rc = MprConfigTransportGetHandle (
g_hMprConfig, PID_IPX, &hTrCfg
);
if (rc == NO_ERROR)
{
DWORD sz;
rc = MprConfigTransportGetInfo (
g_hMprConfig, hTrCfg, NULL, NULL, &pClBlock, &sz, NULL
);
if (rc == NO_ERROR)
{
NOTHING;
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ((rc == ERROR_FILE_NOT_FOUND) || (rc == ERROR_NO_MORE_ITEMS))
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_NO_IPX_IN_ROUTER_ADM); }
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
}
if (rc == NO_ERROR)
{
DWORD i;
PIPX_TOC_ENTRY pIpxToc;
pIpxToc = GetIPXTocEntry(
(PIPX_INFO_BLOCK_HEADER)pClBlock,
IPX_INTERFACE_INFO_TYPE
);
if (pIpxToc != NULL)
{
PIPX_IF_INFO pIpxInfo;
PWCHAR buffer[2];
pIpxInfo = (PIPX_IF_INFO) (pClBlock + pIpxToc->Offset);
buffer[ 0 ] = GetEnumString(
g_hModule,
pIpxInfo->NetbiosAccept,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pIpxInfo->NetbiosDeliver,
NUM_TOKENS_IN_TABLE( NbDeliverStates ),
NbDeliverStates
);
if ( buffer[ 0 ] && buffer[ 1 ] )
{
if ( hFile )
{
DisplayMessageT(
DMP_IPX_NB_SET_INTERFACE, InterfaceName, buffer[ 0 ],
buffer[ 1 ]
);
}
else
{
DisplayIPXMessage(
g_hModule, msg, InterfaceName,
buffer[ 0 ], buffer[ 1 ]
);
}
}
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED); }
rc = ERROR_INVALID_DATA;
}
if (hTrCfg != NULL)
{
MprConfigBufferFree (pClBlock);
}
else
{
MprAdminBufferFree (pClBlock);
}
}
return rc;
}
PIPX_IF_INFO
GetIpxNbInterface(
HANDLE hIf,
LPBYTE *pIfBlock
)
{
DWORD dwSize;
DWORD dwErr;
PIPX_TOC_ENTRY pIpxToc;
dwErr = MprAdminInterfaceTransportGetInfo(
g_hMprAdmin, hIf, PID_IPX, pIfBlock, &dwSize
);
if (dwErr != NO_ERROR)
{
return NULL;
}
pIpxToc = GetIPXTocEntry(
(PIPX_INFO_BLOCK_HEADER)(*pIfBlock),
IPX_INTERFACE_INFO_TYPE
);
if (!pIpxToc)
{
return NULL;
}
return (PIPX_IF_INFO)((*pIfBlock) + (pIpxToc->Offset));
// return (PIPX_IF_INFO)GetIPXTocEntry((PIPX_INFO_BLOCK_HEADER)(*pIfBlock),IPX_INTERFACE_INFO_TYPE);
}
DWORD
MIBEnumNbIpxIfs(
VOID
)
{
PMPR_INTERFACE_0 IfList = NULL;
DWORD dwErr = 0, dwRead, dwTot, i, j, rc;
PWCHAR buffer[4];
PIPX_IF_INFO pIpxInfo = NULL;
LPBYTE buf = NULL;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
DisplayIPXMessage ( g_hModule, MSG_NBIF_MIB_TABLE_HDR );
dwErr = MprAdminInterfaceEnum(
g_hMprAdmin, 0, (unsigned char **) & IfList, MAXULONG,
&dwRead, &dwTot, NULL
);
if (dwErr != NO_ERROR)
{
return dwErr;
}
for (i = 0; i < dwRead; i++)
{
if ((pIpxInfo = GetIpxNbInterface(IfList[i].hInterface, &buf)) != NULL)
{
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetFriendlyNameFromIfName( IfList[i].wszInterfaceName, IfName, &dwSize );
if ( rc == NO_ERROR )
{
buffer[ 0 ] = GetEnumString(
g_hModule, pIpxInfo->NetbiosAccept,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pIpxInfo->NetbiosDeliver,
NUM_TOKENS_IN_TABLE( NbDeliverStates ),
NbDeliverStates
);
if ( buffer[ 0 ] && buffer[ 1 ] )
{
DisplayIPXMessage(
g_hModule, MSG_NBIF_MIB_TABLE_FMT,
IfName, buffer[ 0 ], buffer[ 1 ]
);
}
}
}
if (buf)
{
MprAdminBufferFree(buf);
}
buf = NULL;
}
return NO_ERROR;
}
/*
DWORD
MIBEnumNbIpxIfs (
VOID
) {
DWORD rc;
DWORD sz;
IPX_MIB_GET_INPUT_DATA MibGetInputData;
PIPX_INTERFACE pIf;
DisplayIPXMessage (g_hModule, MSG_NBIF_MIB_TABLE_HDR);
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
rc = MprAdminMIBEntryGetFirst (
g_hMIBServer,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
(LPVOID *)&pIf,
&sz);
while (rc==NO_ERROR) {
WCHAR buffer[2][MAX_VALUE];
HANDLE hIfCfg;
WCHAR InterfaceNameW[MAX_INTERFACE_NAME_LEN+1];
pIf->InterfaceName[47]=0;
mbstowcs (InterfaceNameW, pIf->InterfaceName, sizeof (InterfaceNameW));
//======================================
// Translate the Interface Name
//======================================
if ((rc=(*(Params->IfName2DescA))(pIf->InterfaceName,
Params->IfNamBufferA,
&Params->IfNamBufferLength)) != NO_ERROR) {
return rc;
}
//======================================
if (MprConfigInterfaceGetHandle (
g_hMprConfig,
InterfaceNameW,
&hIfCfg)==NO_ERROR) {
DisplayIPXMessage (g_hModule,
MSG_NBIF_MIB_TABLE_FMT,
pIf->InterfaceName, //Params->IfNamBufferA,
GetValueString (g_hModule, Utils, AdminStates,
pIf->NetbiosAccept, buffer[0]),
GetValueString (g_hModule, Utils, NbDeliverStates,
pIf->NetbiosDeliver, buffer[1])
);
}
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex
= pIf->InterfaceIndex;
MprAdminMIBBufferFree (pIf);
rc = MprAdminMIBEntryGetNext (
g_hMIBServer,
PID_IPX,
IPX_PROTOCOL_BASE,
&MibGetInputData,
sizeof(IPX_MIB_GET_INPUT_DATA),
(LPVOID *)&pIf,
&sz);
}
if (rc==ERROR_NO_MORE_ITEMS)
return NO_ERROR;
else {
if (rc==NO_ERROR)
rc = ERROR_GEN_FAILURE;
DisplayError( g_hModule, rc);
return rc;
}
}
*/
DWORD
CfgEnumNbIpxIfs (
VOID
)
{
DWORD rc = NO_ERROR;
DWORD read, total, processed = 0, i, j;
DWORD hResume = 0;
DWORD sz;
PMPR_INTERFACE_0 pRi0;
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD dwSize = sizeof(IfName);
DisplayIPXMessage (g_hModule, MSG_NBIF_CFG_TABLE_HDR);
do
{
rc = MprConfigInterfaceEnum (
g_hMprConfig, 0, (LPBYTE * ) & pRi0, MAXULONG, &read,
&total, &hResume
);
if ( rc == NO_ERROR )
{
for (i = 0; i < read; i++)
{
HANDLE hIfTrCfg;
rc = MprConfigInterfaceTransportGetHandle(
g_hMprConfig, pRi0[i].hInterface, PID_IPX, &hIfTrCfg
);
if (rc == NO_ERROR)
{
LPBYTE pIfBlock;
rc = MprConfigInterfaceTransportGetInfo (
g_hMprConfig, pRi0[i].hInterface, hIfTrCfg,
&pIfBlock, &sz
);
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pIpxToc;
pIpxToc = GetIPXTocEntry(
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_INTERFACE_INFO_TYPE
);
if (pIpxToc != NULL)
{
PIPX_IF_INFO pIpxInfo;
PWCHAR buffer[2];
pIpxInfo = (PIPX_IF_INFO) (pIfBlock + pIpxToc->Offset);
//======================================
// Translate the Interface Name
//======================================
rc = IpmontrGetFriendlyNameFromIfName(
pRi0[i].wszInterfaceName, IfName, &dwSize
);
if ( rc == NO_ERROR )
{
buffer[ 0 ] = GetEnumString(
g_hModule, pIpxInfo->NetbiosAccept,
NUM_TOKENS_IN_TABLE( AdminStates ),
AdminStates
);
buffer[ 1 ] = GetEnumString(
g_hModule, pIpxInfo->NetbiosDeliver,
NUM_TOKENS_IN_TABLE( NbDeliverStates ),
NbDeliverStates
);
if ( buffer[ 0 ] && buffer[ 1 ] )
{
DisplayIPXMessage(
g_hModule, MSG_NBIF_CFG_TABLE_FMT,
IfName, buffer[ 0 ], buffer[ 1 ]
);
}
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED);
rc = ERROR_INVALID_DATA;
}
}
else if (rc != ERROR_NO_MORE_ITEMS)
{
// No IPX installed
DisplayError( g_hModule, rc);
}
}
else
{
//DisplayError( g_hModule, rc);
rc = NO_ERROR;
}
}
processed += read;
MprConfigBufferFree (pRi0);
}
else
{
DisplayError( g_hModule, rc);
break;
}
} while (processed < total);
return rc;
}
DWORD
CfgSetNbIpxIf (
LPWSTR InterfaceNameW,
PULONG pAccept OPTIONAL,
PULONG pDeliver OPTIONAL
)
{
DWORD rc;
DWORD sz;
HANDLE hTrCfg;
HANDLE hIfCfg;
HANDLE hIfTrCfg;
LPBYTE pIfBlock;
if (InterfaceNameW != NULL)
{
rc = MprConfigInterfaceGetHandle(
g_hMprConfig, InterfaceNameW, &hIfCfg
);
if (rc == NO_ERROR)
{
rc = MprConfigInterfaceTransportGetHandle (
g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg
);
if (rc == NO_ERROR)
{
rc = MprConfigInterfaceTransportGetInfo (
g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
);
}
}
}
else
{
rc = MprConfigTransportGetHandle (
g_hMprConfig, PID_IPX, &hTrCfg
);
if (rc == NO_ERROR)
{
rc = MprConfigTransportGetInfo (
g_hMprConfig, hTrCfg, NULL, NULL, &pIfBlock, &sz, NULL
);
}
}
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pIpxToc;
pIpxToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_INTERFACE_INFO_TYPE
);
if (pIpxToc != NULL)
{
PIPX_IF_INFO pIpxInfo;
pIpxInfo = (PIPX_IF_INFO) (pIfBlock + pIpxToc->Offset);
if (ARGUMENT_PRESENT (pAccept))
{
pIpxInfo->NetbiosAccept = *pAccept;
}
if (ARGUMENT_PRESENT (pDeliver))
{
pIpxInfo->NetbiosDeliver = *pDeliver;
}
if (InterfaceNameW != NULL)
{
rc = MprConfigInterfaceTransportSetInfo (
g_hMprConfig, hIfCfg, hIfTrCfg, pIfBlock, sz
);
}
else
{
rc = MprConfigTransportSetInfo (
g_hMprConfig, hTrCfg, NULL, 0, pIfBlock, sz, NULL
);
}
if (rc == NO_ERROR)
{
if (InterfaceNameW != NULL)
{
DisplayIPXMessage (g_hModule, MSG_NBIF_SET_CFG, InterfaceNameW );
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_CLIENT_NBIF_SET_CFG );
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED);
rc = ERROR_INVALID_DATA;
}
MprConfigBufferFree (pIfBlock);
}
else
{
DisplayError( g_hModule, rc);
}
return rc;
}
DWORD
AdmSetNbIpxIf (
LPWSTR InterfaceNameW,
PULONG pAccept OPTIONAL,
PULONG pDeliver OPTIONAL
)
{
DWORD rc;
DWORD sz;
HANDLE hIfAdm;
LPBYTE pIfBlock;
if (InterfaceNameW != NULL)
{
rc = MprAdminInterfaceGetHandle (
g_hMprAdmin, InterfaceNameW, &hIfAdm, FALSE
);
if (rc == NO_ERROR)
{
rc = MprAdminInterfaceTransportGetInfo (
g_hMprAdmin, hIfAdm, PID_IPX, &pIfBlock, &sz
);
}
}
else
{
rc = MprAdminTransportGetInfo (
g_hMprAdmin, PID_IPX, NULL, NULL, &pIfBlock, &sz
);
if (rc == NO_ERROR)
{
if (pIfBlock == NULL)
return rc;
}
}
if (rc == NO_ERROR)
{
PIPX_TOC_ENTRY pIpxToc;
pIpxToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_INTERFACE_INFO_TYPE
);
if (pIpxToc != NULL)
{
PIPX_IF_INFO pIpxInfo;
pIpxInfo = (PIPX_IF_INFO)(pIfBlock + pIpxToc->Offset);
if (ARGUMENT_PRESENT (pAccept))
{
pIpxInfo->NetbiosAccept = *pAccept;
}
if (ARGUMENT_PRESENT (pDeliver))
{
pIpxInfo->NetbiosDeliver = *pDeliver;
}
if (InterfaceNameW != NULL)
{
rc = MprAdminInterfaceTransportSetInfo (
g_hMprAdmin, hIfAdm, PID_IPX, pIfBlock,
((PIPX_INFO_BLOCK_HEADER)pIfBlock)->Size
);
}
else
{
rc = MprAdminTransportSetInfo (
g_hMprAdmin, PID_IPX, NULL, 0, pIfBlock,
((PIPX_INFO_BLOCK_HEADER)pIfBlock)->Size
);
}
if (rc == NO_ERROR)
{
if (InterfaceNameW != NULL)
{
DisplayIPXMessage (
g_hModule,MSG_NBIF_SET_ADM, InterfaceNameW
);
}
else
{
DisplayIPXMessage (g_hModule, MSG_CLIENT_NBIF_SET_ADM);
}
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED);
rc = ERROR_INVALID_DATA;
}
MprAdminBufferFree (pIfBlock);
}
else
{
DisplayError( g_hModule, rc);
}
return rc;
}