/*++ 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; }