windows-nt/Source/XPSP1/NT/net/rras/netsh/ipx/protocols/nbnames.c

658 lines
17 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
nbnames.c
Abstract:
IPX Router Console Monitoring and Configuration tool.
NetBIOS name configuration and monitoring.
Author:
Vadim Eydelman 06/07/1996
--*/
#include "precomp.h"
#pragma hdrstop
#define OPERATION_DEL_NBNAME (-1)
#define OPERATION_ADD_NBNAME 1
DWORD
AdmSetNbName (
int operation,
LPWSTR InterfaceNameW,
PUCHAR NbName,
PWCHAR IfName
);
DWORD
CfgSetNbName (
int operation,
LPWSTR InterfaceNameW,
PUCHAR NbName,
PWCHAR IfName
);
DWORD
APIENTRY
HelpNbName (
IN int argc,
IN WCHAR *argv[]
)
{
DisplayMessage (g_hModule, HLP_IPX_NBNAME);
return 0;
}
DWORD
APIENTRY
ShowNbName (
IN int argc,
IN WCHAR *argv[],
IN HANDLE hFile
)
{
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD rc, dwSize = sizeof(IfName);
if (argc > 0)
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen (InterfaceNameW);
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc != NO_ERROR )
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); }
return ERROR_INVALID_PARAMETER;
}
if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
LPBYTE pIfBlock;
BOOLEAN fRouter = FALSE;
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_NBNAME_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 ( !hFile ) { 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 pNnToc;
pNnToc = GetIPXTocEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_NETBIOS_NAME_INFO_TYPE
);
if (pNnToc != NULL)
{
PIPX_STATIC_NETBIOS_NAME_INFO pNnInfo;
UINT i;
pNnInfo = (PIPX_STATIC_NETBIOS_NAME_INFO)
(pIfBlock + pNnToc->Offset);
for (i = 0; i < pNnToc->Count; i++, pNnInfo++)
{
if ( hFile )
{
UCHAR ucType = pNnInfo->Name[15];
pNnInfo->Name[15] = '\0';
DisplayMessageT(
DMP_IPX_NB_ADD_NAME, InterfaceNameW,
pNnInfo->Name, pNnInfo->Name[15]
);
}
else
{
DisplayIPXMessage (g_hModule,
MSG_NBNAME_TABLE_FMT,
pNnInfo->Name, pNnInfo->Name[15]
);
}
}
}
else
{
rc = ERROR_FILE_NOT_FOUND;
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
if (fRouter)
{
MprAdminBufferFree (pIfBlock);
}
else
{
MprConfigBufferFree (pIfBlock);
}
}
else
{
if ( !hFile ) { DisplayError( g_hModule, rc); }
}
}
else
{
if ( !hFile ) { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); }
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
if ( !hFile ) { DisplayMessage (g_hModule, HLP_IPX_NBNAME); }
rc = ERROR_INVALID_PARAMETER;
}
//Exit:
return rc;
#undef InterfaceNameW
}
DWORD
APIENTRY
CreateNbName (
IN int argc,
IN WCHAR *argv[]
)
{
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD rc, dwSize = sizeof(IfName);
if ((argc == 2) || (argc == 3))
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen (InterfaceNameW);
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc != NO_ERROR )
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
return ERROR_INVALID_PARAMETER;
}
if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
UINT val, n;
UCHAR NbName[16];
memset (NbName, ' ', sizeof (NbName));
if ( (swscanf (argv[1], L"%16hc%n", NbName, &n) == 1) &&
(n == wcslen (argv[1])) &&
( (argc < 3) ||
( (swscanf (argv[2], L"%2x%n", &val, &n) == 1) &&
( n == wcslen (argv[2]) ) ) )
)
{
if (argc < 3)
{
val = NbName[15];
}
NbName[15] = 0;
_strupr (NbName);
NbName[15] = (UCHAR) val;
if (g_hMprAdmin)
{
rc = AdmSetNbName(
OPERATION_ADD_NBNAME, IfName, NbName,
InterfaceNameW
);
}
else
{
rc = NO_ERROR;
}
if (rc == NO_ERROR)
{
rc = CfgSetNbName (
OPERATION_ADD_NBNAME, IfName, NbName,
InterfaceNameW
);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayMessage (g_hModule, HLP_IPX_NBNAME);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayMessage (g_hModule, HLP_IPX_NBNAME);
rc = ERROR_INVALID_PARAMETER;
}
return rc;
#undef InterfaceNameW
}
DWORD
APIENTRY
DeleteNbName(
IN int argc,
IN WCHAR *argv[]
)
{
WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ];
DWORD rc, dwSize = sizeof(IfName);
if ((argc == 2) || (argc == 3))
{
unsigned count;
#define InterfaceNameW argv[0]
count = wcslen (InterfaceNameW);
rc = IpmontrGetIfNameFromFriendlyName(
InterfaceNameW, IfName, &dwSize
);
if ( rc != NO_ERROR )
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
return ERROR_INVALID_PARAMETER;
}
if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN))
{
UINT val, n;
UCHAR NbName[16];
memset (NbName, ' ', sizeof (NbName));
if ( (swscanf (argv[1], L"%16hc%n", NbName, &n) == 1) &&
(n == wcslen (argv[1])) &&
( (argc < 3) ||
( (swscanf (argv[2], L"%2x%n", &val, &n) == 1) &&
( n == wcslen (argv[2]))) ) )
{
if (argc < 3)
{
val = NbName[15];
}
NbName[15] = 0;
_strupr (NbName);
NbName[15] = (UCHAR) val;
if (g_hMprAdmin)
{
rc = AdmSetNbName(
OPERATION_DEL_NBNAME, IfName, NbName,
InterfaceNameW
);
}
else
{
rc = NO_ERROR;
}
if (rc == NO_ERROR)
{
rc = CfgSetNbName(
OPERATION_DEL_NBNAME, IfName, NbName,
InterfaceNameW
);
}
}
else
{
rc = ERROR_INVALID_PARAMETER;
DisplayMessage (g_hModule, HLP_IPX_NBNAME);
}
}
else
{
DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME);
rc = ERROR_INVALID_PARAMETER;
}
}
else
{
DisplayMessage (g_hModule, HLP_IPX_NBNAME);
rc = ERROR_INVALID_PARAMETER;
}
return rc;
#undef InterfaceNameW
}
BOOL
NbNameEqual (
PVOID info1,
PVOID info2
)
{
#define NbName1 ((PIPX_STATIC_NETBIOS_NAME_INFO)info1)
#define NbName2 ((PIPX_STATIC_NETBIOS_NAME_INFO)info2)
return ( _strnicmp (NbName1->Name, NbName2->Name, 15) == 0) &&
(NbName1->Name[15] == NbName2->Name[15] );
#undef NbName1
#undef NbName2
}
DWORD
AdmSetNbName (
int operation,
LPWSTR InterfaceNameW,
PUCHAR NbName,
PWCHAR IfName
)
{
DWORD rc;
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_ADD_NBNAME:
rc = AddIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_NETBIOS_NAME_INFO_TYPE,
sizeof (IPX_STATIC_NETBIOS_NAME_INFO),
NbName, NbNameEqual,
(PIPX_INFO_BLOCK_HEADER * ) & pNewBlock
);
msg = MSG_NBNAME_CREATED_ADM;
break;
case OPERATION_DEL_NBNAME:
rc = DeleteIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_NETBIOS_NAME_INFO_TYPE,
sizeof (IPX_STATIC_NETBIOS_NAME_INFO),
NbName, NbNameEqual,
(PIPX_INFO_BLOCK_HEADER * ) & pNewBlock
);
msg = MSG_NBNAME_DELETED_ADM;
break;
}
if (rc == NO_ERROR)
{
if (pIfBlock != pNewBlock)
{
MprAdminBufferFree (pIfBlock);
pIfBlock = pNewBlock;
}
rc = MprAdminInterfaceTransportSetInfo (
g_hMprAdmin, hIfAdm, PID_IPX, pIfBlock,
((PIPX_INFO_BLOCK_HEADER)pIfBlock)->Size
);
if (rc == NO_ERROR)
{
DisplayIPXMessage (g_hModule, msg, IfName);
}
else
{
DisplayError( g_hModule, rc);
}
}
else
{
DisplayError( g_hModule, rc);
}
MprAdminBufferFree (pIfBlock);
}
}
else
{
DisplayError( g_hModule, rc);
}
return rc;
}
DWORD
CfgSetNbName (
int operation,
LPWSTR InterfaceNameW,
PUCHAR NbName,
PWCHAR IfName
)
{
DWORD rc;
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;
rc = MprConfigInterfaceTransportGetInfo (
g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
);
if (rc == NO_ERROR)
{
UINT msg;
LPBYTE pNewBlock;
switch (operation)
{
case OPERATION_ADD_NBNAME:
rc = AddIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_NETBIOS_NAME_INFO_TYPE,
sizeof (IPX_STATIC_NETBIOS_NAME_INFO),
NbName, NbNameEqual,
(PIPX_INFO_BLOCK_HEADER * ) & pNewBlock
);
msg = MSG_NBNAME_CREATED_CFG;
break;
case OPERATION_DEL_NBNAME:
rc = DeleteIPXInfoEntry (
(PIPX_INFO_BLOCK_HEADER)pIfBlock,
IPX_STATIC_NETBIOS_NAME_INFO_TYPE,
sizeof (IPX_STATIC_NETBIOS_NAME_INFO),
NbName, NbNameEqual,
(PIPX_INFO_BLOCK_HEADER * ) & pNewBlock
);
msg = MSG_NBNAME_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)
{
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;
}