You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1091 lines
32 KiB
1091 lines
32 KiB
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Routing\Netsh\wins\srvrmon.c
|
|
|
|
Abstract:
|
|
|
|
WINS Server Command dispatcher.
|
|
|
|
Created by:
|
|
|
|
Shubho Bhattacharya(a-sbhatt) on 12/14/98
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
LPWSTR g_ServerNameUnicode = NULL;
|
|
LPSTR g_ServerNameAnsi = NULL;
|
|
CHAR g_ServerIpAddressAnsiString[MAX_IP_STRING_LEN+1] = {'\0'};
|
|
WCHAR g_ServerIpAddressUnicodeString[MAX_IP_STRING_LEN+1] = {L'\0'};
|
|
HKEY g_hServerRegKey = NULL;
|
|
WCHAR g_ServerNetBiosName[MAX_COMPUTER_NAME_LEN] = {L'\0'};
|
|
|
|
|
|
handle_t g_hBind = NULL;
|
|
WINSINTF_BIND_DATA_T g_BindData;
|
|
|
|
BOOL g_fServer = FALSE;
|
|
|
|
CMD_ENTRY g_SrvrAddCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY(SRVR_ADD_NAME, HandleSrvrAddName),
|
|
CREATE_CMD_ENTRY(SRVR_ADD_PARTNER, HandleSrvrAddPartner),
|
|
CREATE_CMD_ENTRY(SRVR_ADD_PNGSERVER, HandleSrvrAddPersona),
|
|
CREATE_CMD_ENTRY(SRVR_ADD_PGSERVER, HandleSrvrAddPersona)
|
|
};
|
|
|
|
CMD_ENTRY g_SrvrCheckCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY(SRVR_CHECK_DATABASE, HandleSrvrCheckDatabase),
|
|
CREATE_CMD_ENTRY(SRVR_CHECK_NAME, HandleSrvrCheckName),
|
|
CREATE_CMD_ENTRY(SRVR_CHECK_VERSION, HandleSrvrCheckVersion),
|
|
};
|
|
|
|
CMD_ENTRY g_SrvrDeleteCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY(SRVR_DELETE_NAME, HandleSrvrDeleteName),
|
|
CREATE_CMD_ENTRY(SRVR_DELETE_PARTNER, HandleSrvrDeletePartner),
|
|
CREATE_CMD_ENTRY(SRVR_DELETE_RECORDS, HandleSrvrDeleteRecords),
|
|
CREATE_CMD_ENTRY(SRVR_DELETE_WINS, HandleSrvrDeleteWins),
|
|
CREATE_CMD_ENTRY(SRVR_DELETE_PNGSERVER, HandleSrvrDeletePersona),
|
|
CREATE_CMD_ENTRY(SRVR_DELETE_PGSERVER, HandleSrvrDeletePersona)
|
|
};
|
|
|
|
CMD_ENTRY g_SrvrInitCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY(SRVR_INIT_BACKUP, HandleSrvrInitBackup),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_IMPORT, HandleSrvrInitImport),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_PULL, HandleSrvrInitPull),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_PULLRANGE, HandleSrvrInitPullrange),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_PUSH, HandleSrvrInitPush),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_REPLICATE, HandleSrvrInitReplicate),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_RESTORE, HandleSrvrInitRestore),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_SCAVENGE, HandleSrvrInitScavenge),
|
|
CREATE_CMD_ENTRY(SRVR_INIT_SEARCH, HandleSrvrInitSearch),
|
|
};
|
|
|
|
CMD_ENTRY g_SrvrResetCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY(SRVR_RESET_COUNTER, HandleSrvrResetCounter),
|
|
};
|
|
|
|
CMD_ENTRY g_SrvrSetCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY(SRVR_SET_AUTOPARTNERCONFIG, HandleSrvrSetAutopartnerconfig),
|
|
CREATE_CMD_ENTRY(SRVR_SET_BACKUPPATH, HandleSrvrSetBackuppath),
|
|
CREATE_CMD_ENTRY(SRVR_SET_BURSTPARAM, HandleSrvrSetBurstparam),
|
|
CREATE_CMD_ENTRY(SRVR_SET_DEFAULTPARAM, HandleSrvrSetDefaultparam),
|
|
CREATE_CMD_ENTRY(SRVR_SET_LOGPARAM, HandleSrvrSetLogparam),
|
|
CREATE_CMD_ENTRY(SRVR_SET_MIGRATEFLAG, HandleSrvrSetMigrateflag),
|
|
CREATE_CMD_ENTRY(SRVR_SET_NAMERECORD, HandleSrvrSetNamerecord),
|
|
CREATE_CMD_ENTRY(SRVR_SET_PERIODICDBCHECKING, HandleSrvrSetPeriodicdbchecking),
|
|
CREATE_CMD_ENTRY(SRVR_SET_PULLPERSISTENTCONNECTION, HandleSrvrSetPullpersistentconnection),
|
|
CREATE_CMD_ENTRY(SRVR_SET_PUSHPERSISTENTCONNECTION, HandleSrvrSetPushpersistentconnection),
|
|
CREATE_CMD_ENTRY(SRVR_SET_PULLPARAM, HandleSrvrSetPullparam),
|
|
CREATE_CMD_ENTRY(SRVR_SET_PUSHPARAM, HandleSrvrSetPushparam),
|
|
CREATE_CMD_ENTRY(SRVR_SET_REPLICATEFLAG, HandleSrvrSetReplicateflag),
|
|
CREATE_CMD_ENTRY(SRVR_SET_STARTVERSION, HandleSrvrSetStartversion),
|
|
CREATE_CMD_ENTRY(SRVR_SET_PGMODE, HandleSrvrSetPersMode)
|
|
};
|
|
|
|
CMD_ENTRY g_SrvrShowCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_DOMAIN, HandleSrvrShowDomain),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_DATABASE, HandleSrvrShowDatabase),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_INFO, HandleSrvrShowInfo),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_NAME, HandleSrvrShowName),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_PARTNER, HandleSrvrShowPartner),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_PARTNERPROPERTIES, HandleSrvrShowPartnerproperties),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_PULLPARTNERPROPERTIES, HandleSrvrShowPullpartnerproperties),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_PUSHPARTNERPROPERTIES, HandleSrvrShowPushpartnerproperties),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_RECCOUNT, HandleSrvrShowReccount),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_RECBYVERSION, HandleSrvrShowRecbyversion),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_SERVER, HandleSrvrShowServer),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_SERVERSTATISTICS, HandleSrvrShowStatistics),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_VERSION, HandleSrvrShowVersion),
|
|
CREATE_CMD_ENTRY(SRVR_SHOW_VERSIONMAP, HandleSrvrShowVersionmap),
|
|
};
|
|
|
|
CMD_GROUP_ENTRY g_SrvrCmdGroups[] =
|
|
{
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_ADD, g_SrvrAddCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_CHECK, g_SrvrCheckCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_DELETE, g_SrvrDeleteCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_INIT, g_SrvrInitCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_RESET, g_SrvrResetCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_SrvrSetCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_SrvrShowCmdTable),
|
|
};
|
|
|
|
|
|
CMD_ENTRY g_SrvrCmds[] =
|
|
{
|
|
CREATE_CMD_ENTRY(WINS_DUMP, HandleSrvrDump),
|
|
CREATE_CMD_ENTRY(WINS_HELP1, HandleSrvrHelp),
|
|
CREATE_CMD_ENTRY(WINS_HELP2, HandleSrvrHelp),
|
|
CREATE_CMD_ENTRY(WINS_HELP3, HandleSrvrHelp),
|
|
CREATE_CMD_ENTRY(WINS_HELP4, HandleSrvrHelp),
|
|
};
|
|
|
|
|
|
ULONG g_ulSrvrNumTopCmds = sizeof(g_SrvrCmds)/sizeof(CMD_ENTRY);
|
|
ULONG g_ulSrvrNumGroups = sizeof(g_SrvrCmdGroups)/sizeof(CMD_GROUP_ENTRY);
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
SrvrCommit(
|
|
IN DWORD dwAction
|
|
)
|
|
{
|
|
BOOL bCommit, bFlush = FALSE;
|
|
|
|
switch(dwAction)
|
|
{
|
|
case NETSH_COMMIT:
|
|
{
|
|
if(g_bCommit)
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
g_bCommit = TRUE;
|
|
|
|
break;
|
|
}
|
|
|
|
case NETSH_UNCOMMIT:
|
|
{
|
|
g_bCommit = FALSE;
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
case NETSH_SAVE:
|
|
{
|
|
if(g_bCommit)
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case NETSH_FLUSH:
|
|
{
|
|
//
|
|
// Action is a flush. Srvr current state is commit, then
|
|
// nothing to be done.
|
|
//
|
|
|
|
if(g_bCommit)
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
bFlush = TRUE;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Switched to commit mode. So set all valid info in the
|
|
// strutures. Free memory and invalidate the info.
|
|
//
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
SrvrMonitor(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT LPWSTR pwcNewContext
|
|
)
|
|
{
|
|
DWORD dwError = NO_ERROR;
|
|
DWORD dwIndex, i, j, k;
|
|
BOOL bFound = FALSE;
|
|
PFN_HANDLE_CMD pfnHandler = NULL;
|
|
PNS_CONTEXT_ENTRY_FN pfnHelperEntryPt;
|
|
PNS_CONTEXT_DUMP_FN pfnHelperDumpPt;
|
|
WCHAR wcSvrTemp[MAX_IP_STRING_LEN+1] = {L'\0'};
|
|
BOOL fTemp = FALSE;
|
|
DWORD dwNumMatched;
|
|
DWORD dwCmdHelpToken = 0;
|
|
|
|
if(dwArgCount is 1)
|
|
{
|
|
//Hmm! Hasn't passed any Server Info. Set the server to the value pwsRouter
|
|
WCHAR ServerInfo[1000] = L"\\\\";
|
|
|
|
if( pwszMachine and
|
|
wcslen(pwszMachine) > 2 and
|
|
wcsncmp(pwszMachine, L"\\\\", 2) and
|
|
IsIpAddress(pwszMachine) is FALSE )
|
|
{
|
|
wcscpy(&ServerInfo[2], pwszMachine );
|
|
pwszMachine = ServerInfo;
|
|
|
|
}
|
|
|
|
if( FALSE is SetServerInfo(pwszMachine) )
|
|
{
|
|
return GetLastError();
|
|
}
|
|
else
|
|
{
|
|
// wcscpy(pwcNewContext, L"wins server");
|
|
g_fServer = TRUE;
|
|
return ERROR_CONTEXT_SWITCH;
|
|
}
|
|
}
|
|
|
|
dwIndex = 1;
|
|
|
|
//If it is a help for server command
|
|
if( IsHelpToken(ppwcArguments[dwIndex]) is TRUE and
|
|
g_fServer is FALSE )
|
|
{
|
|
DisplayMessage(g_hModule, HLP_WINS_CONTEXT_SERVER_EX);
|
|
dwError = NO_ERROR;
|
|
goto CleanUp;
|
|
}
|
|
//Is it a servername or address?
|
|
if( IsValidServer(ppwcArguments[dwIndex]) )
|
|
{
|
|
if( g_fServer is TRUE and
|
|
dwArgCount > 2 )
|
|
{
|
|
wcscpy(wcSvrTemp, g_ServerIpAddressUnicodeString);
|
|
fTemp = TRUE;
|
|
}
|
|
if( FALSE is SetServerInfo(ppwcArguments[dwIndex]) )
|
|
{
|
|
dwError = GetLastError();
|
|
goto CleanUp;
|
|
}
|
|
|
|
pwcNewContext[wcslen(pwcNewContext)- wcslen(ppwcArguments[dwIndex]) -1 ] = L'\0';
|
|
|
|
dwIndex++;
|
|
g_fServer = TRUE;
|
|
|
|
}
|
|
else if( g_fServer is FALSE )
|
|
{
|
|
WCHAR ServerInfo[1000] = L"\\\\";
|
|
|
|
if( pwszMachine and
|
|
wcslen(pwszMachine) > 2 and
|
|
wcsncmp(pwszMachine, L"\\\\", 2) and
|
|
IsIpAddress(pwszMachine) is FALSE )
|
|
{
|
|
wcscpy(&ServerInfo[2], pwszMachine );
|
|
pwszMachine = ServerInfo;
|
|
}
|
|
|
|
if( FALSE is SetServerInfo(pwszMachine) )
|
|
{
|
|
dwError = GetLastError();
|
|
goto CleanUp;
|
|
}
|
|
g_fServer = TRUE;
|
|
}
|
|
|
|
|
|
if( dwIndex >= dwArgCount )
|
|
{
|
|
dwError = ERROR_CONTEXT_SWITCH;
|
|
//wcscpy(pwcNewContext, L"wins server");
|
|
goto CleanUp;
|
|
}
|
|
|
|
//Is it a top level(non Group command)?
|
|
for(i=0; i<g_ulSrvrNumTopCmds; i++)
|
|
{
|
|
if(MatchToken(ppwcArguments[dwIndex],
|
|
g_SrvrCmds[i].pwszCmdToken))
|
|
{
|
|
bFound = TRUE;
|
|
|
|
pfnHandler = g_SrvrCmds[i].pfnCmdHandler;
|
|
|
|
dwCmdHelpToken = g_SrvrCmds[i].dwCmdHlpToken;
|
|
|
|
dwIndex++;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
if(bFound)
|
|
{
|
|
if(dwArgCount > 3 && IsHelpToken(ppwcArguments[dwIndex]))
|
|
{
|
|
DisplayMessage(g_hModule, dwCmdHelpToken);
|
|
|
|
dwError = NO_ERROR;
|
|
goto CleanUp;
|
|
}
|
|
|
|
dwIndex++;
|
|
|
|
dwError = (*pfnHandler)(pwszMachine, ppwcArguments, dwIndex, dwArgCount,
|
|
dwFlags, pvData, &bFound);
|
|
|
|
goto CleanUp;
|
|
}
|
|
|
|
bFound = FALSE;
|
|
|
|
//It is not a non Group Command. Then is it a config command for the manager?
|
|
for(i = 0; (i < g_ulSrvrNumGroups) and !bFound; i++)
|
|
{
|
|
if(MatchToken(ppwcArguments[dwIndex],
|
|
g_SrvrCmdGroups[i].pwszCmdGroupToken))
|
|
{
|
|
//
|
|
// Command matched entry i, so look at the table of sub commands
|
|
// for this command
|
|
//
|
|
if( dwArgCount > dwIndex+1 )
|
|
{
|
|
for (j = 0; j < g_SrvrCmdGroups[i].ulCmdGroupSize; j++)
|
|
{
|
|
if (MatchCmdLine(ppwcArguments+dwIndex,
|
|
dwArgCount - 1,
|
|
g_SrvrCmdGroups[i].pCmdGroup[j].pwszCmdToken,
|
|
&dwNumMatched))
|
|
{
|
|
bFound = TRUE;
|
|
|
|
pfnHandler = g_SrvrCmdGroups[i].pCmdGroup[j].pfnCmdHandler;
|
|
|
|
dwCmdHelpToken = g_SrvrCmdGroups[i].pCmdGroup[j].dwCmdHlpToken;
|
|
|
|
//
|
|
// break out of the for(j) loop
|
|
//
|
|
dwIndex+=dwNumMatched;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!bFound)
|
|
{
|
|
//
|
|
// We matched the command group token but none of the
|
|
// sub commands
|
|
//
|
|
|
|
DisplayMessage(g_hModule,
|
|
EMSG_WINS_INCOMPLETE_COMMAND);
|
|
|
|
for (j = 0; j < g_SrvrCmdGroups[i].ulCmdGroupSize; j++)
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
g_SrvrCmdGroups[i].pCmdGroup[j].dwShortCmdHelpToken);
|
|
|
|
DisplayMessage(g_hModule, WINS_FORMAT_LINE);
|
|
}
|
|
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
goto CleanUp;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// quit the for(i)
|
|
//
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!bFound)
|
|
{
|
|
//
|
|
// Command not found.
|
|
//
|
|
if( _wcsicmp(ppwcArguments[dwIndex], L"..") is 0 )
|
|
{
|
|
if(g_ServerNameUnicode)
|
|
{
|
|
WinsFreeMemory(g_ServerNameUnicode);
|
|
g_ServerNameUnicode = NULL;
|
|
}
|
|
memset(g_ServerIpAddressUnicodeString, 0x00, (MAX_IP_STRING_LEN+1)*sizeof(WCHAR));
|
|
memset(g_ServerIpAddressAnsiString, 0x00, (MAX_IP_STRING_LEN+1)*sizeof(CHAR));
|
|
g_fServer = FALSE;
|
|
}
|
|
|
|
dwError = ERROR_CMD_NOT_FOUND;
|
|
goto CleanUp;
|
|
}
|
|
|
|
//
|
|
// See if it is a request for help.
|
|
//
|
|
|
|
if (dwNumMatched < (dwArgCount - 1) and
|
|
wcslen(ppwcArguments[dwNumMatched+1]) > 0 and
|
|
IsHelpToken(ppwcArguments[dwNumMatched + 1]))
|
|
{
|
|
DisplayMessage(g_hModule, dwCmdHelpToken);
|
|
|
|
dwError = NO_ERROR;
|
|
goto CleanUp;
|
|
}
|
|
|
|
//
|
|
// Call the parsing routine for the command
|
|
//
|
|
|
|
dwError = (*pfnHandler)(pwszMachine, ppwcArguments, dwIndex,
|
|
dwArgCount, dwFlags, pvData, &bFound);
|
|
|
|
if( dwError is ERROR_CONTEXT_SWITCH )
|
|
{
|
|
goto CleanUp;
|
|
}
|
|
CleanUp:
|
|
if( fTemp )
|
|
{
|
|
fTemp = SetServerInfo(wcSvrTemp);
|
|
}
|
|
|
|
return dwError;
|
|
}
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
SrvrUnInit(
|
|
IN DWORD dwReserved
|
|
)
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
BOOL
|
|
SetServerInfo(
|
|
IN LPCWSTR pwszServerInfo
|
|
)
|
|
{
|
|
BOOL fReturn = TRUE;
|
|
DWORD dwComputerNameLen = 0;
|
|
LPSTR pszComputerName = NULL;
|
|
LPWSTR pwszComputerName = NULL;
|
|
struct hostent * lpHostEnt = NULL;
|
|
BYTE pbAdd[4];
|
|
char szAdd[4];
|
|
DWORD dwHostName = 0;
|
|
DWORD dwIpAddress = 0;
|
|
DWORD i = 0, nLen = 0;
|
|
DWORD Status = 0;
|
|
DWORD Access = 0;
|
|
CHAR *pTemp = NULL,
|
|
*pTemp1 = NULL;
|
|
DWORD dwTempLen = 0;
|
|
CHAR cTempIp[MAX_IP_STRING_LEN+1] = {L'\0'};
|
|
WCHAR wTempIp[MAX_IP_STRING_LEN+1] = {'\0'};
|
|
LPWSTR pwszTempServer = NULL;
|
|
LPSTR pszTempServer = NULL;
|
|
WCHAR wTempNetBios[MAX_COMPUTER_NAME_LEN] = {L'\0'};
|
|
|
|
handle_t hTempBind = NULL;
|
|
WINSINTF_BIND_DATA_T TempBindData;
|
|
|
|
LPWSTR pwsz = NULL;
|
|
LPSTR psz = NULL;
|
|
|
|
|
|
if( g_ServerNameUnicode isnot NULL and
|
|
IsIpAddress(g_ServerIpAddressUnicodeString) is TRUE )
|
|
{
|
|
strcpy(cTempIp, g_ServerIpAddressAnsiString);
|
|
wcscpy(wTempIp, g_ServerIpAddressUnicodeString);
|
|
pwszTempServer = g_ServerNameUnicode;
|
|
pszTempServer = g_ServerNameAnsi;
|
|
wcscpy(wTempNetBios, g_ServerNetBiosName);
|
|
}
|
|
|
|
memset(g_ServerNetBiosName, 0x00, MAX_COMPUTER_NAME_LEN*sizeof(WCHAR));
|
|
|
|
g_ServerNetBiosName[0] = L'\\';
|
|
g_ServerNetBiosName[1] = L'\\';
|
|
|
|
|
|
if( pwszServerInfo is NULL )
|
|
{
|
|
if( !GetComputerNameEx(ComputerNameDnsFullyQualified,
|
|
NULL,
|
|
&dwComputerNameLen) )
|
|
{
|
|
|
|
pwszComputerName = WinsAllocateMemory((dwComputerNameLen+1)*sizeof(WCHAR));
|
|
|
|
if(pwszComputerName is NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
dwComputerNameLen++;
|
|
if( !GetComputerNameEx(ComputerNameDnsFullyQualified,
|
|
pwszComputerName,
|
|
&dwComputerNameLen) )
|
|
{
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
}
|
|
|
|
else //might be a computer name or IP address. Determine what.
|
|
{
|
|
if( wcslen(pwszServerInfo) > 2 and
|
|
_wcsnicmp(pwszServerInfo, L"\\\\", 2) is 0 )
|
|
{
|
|
|
|
pwszComputerName = WinsAllocateMemory((wcslen(pwszServerInfo) - 1)*sizeof(WCHAR));
|
|
if( pwszComputerName is NULL )
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
memcpy(pwszComputerName,
|
|
(pwszServerInfo+2),
|
|
(wcslen(pwszServerInfo) - 1)*sizeof(WCHAR));
|
|
}
|
|
else if( IsIpAddress(pwszServerInfo) is TRUE ) //it is an IP Address
|
|
{
|
|
|
|
memset(g_ServerIpAddressUnicodeString, 0x00,
|
|
(MAX_IP_STRING_LEN+1)*sizeof(WCHAR));
|
|
|
|
|
|
wcscpy(g_ServerIpAddressUnicodeString,
|
|
pwszServerInfo);
|
|
|
|
|
|
memset(g_ServerIpAddressAnsiString, 0x00,
|
|
(MAX_IP_STRING_LEN+1)*sizeof(CHAR));
|
|
|
|
psz = WinsUnicodeToAnsi(g_ServerIpAddressUnicodeString, NULL);
|
|
|
|
if( psz )
|
|
{
|
|
strcpy(g_ServerIpAddressAnsiString, psz);
|
|
WinsFreeMemory(psz);
|
|
psz = NULL;
|
|
}
|
|
|
|
dwIpAddress = inet_addr(g_ServerIpAddressAnsiString);
|
|
|
|
|
|
lpHostEnt = gethostbyaddr((char *)&dwIpAddress, 4, AF_INET);
|
|
|
|
if( lpHostEnt is NULL )
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_WINS_UNKNOWN_SERVER);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
dwHostName = strlen(lpHostEnt->h_name);
|
|
|
|
g_ServerNameAnsi = WinsAllocateMemory(dwHostName+1);
|
|
|
|
if (g_ServerNameAnsi == NULL)
|
|
goto RETURN;
|
|
|
|
strcpy(g_ServerNameAnsi, lpHostEnt->h_name);
|
|
|
|
g_ServerNameUnicode = WinsAllocateMemory((dwHostName+1)*sizeof(WCHAR));
|
|
|
|
wcscpy(g_ServerNameUnicode, WinsAnsiToUnicode(lpHostEnt->h_name, NULL));
|
|
//Bind the server
|
|
|
|
if( hTempBind )
|
|
{
|
|
//Unbind any previous server
|
|
WinsUnbind(&TempBindData, hTempBind);
|
|
hTempBind = NULL;
|
|
}
|
|
|
|
TempBindData.fTcpIp = TRUE;
|
|
TempBindData.pServerAdd = (LPBYTE)g_ServerIpAddressUnicodeString;
|
|
TempBindData.pPipeName = (LPBYTE)g_ServerNameUnicode;
|
|
hTempBind = WinsBind(&TempBindData);
|
|
|
|
if (hTempBind == NULL)
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
EMSG_WINS_BIND_FAILED,
|
|
g_ServerNameUnicode);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
|
|
//Make sure this is the correct address for the WINS
|
|
{
|
|
WINSINTF_ADD_T WinsAdd = {0};
|
|
UCHAR pName[256] = {'\0'};
|
|
|
|
Status = WinsGetNameAndAdd(hTempBind,
|
|
&WinsAdd,
|
|
pName);
|
|
|
|
if( Status is NO_ERROR )
|
|
{
|
|
LPWSTR pAdd = IpAddressToString(WinsAdd.IPAdd);
|
|
|
|
if( pAdd is NULL )
|
|
{
|
|
fReturn = FALSE;
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
goto RETURN;
|
|
|
|
}
|
|
wcscpy(g_ServerIpAddressUnicodeString,
|
|
pAdd);
|
|
|
|
psz = WinsUnicodeToAnsi(g_ServerIpAddressUnicodeString, NULL);
|
|
|
|
if( psz )
|
|
{
|
|
strcpy(g_ServerIpAddressAnsiString, psz );
|
|
WinsFreeMemory(psz);
|
|
psz = NULL;
|
|
}
|
|
|
|
pwsz = WinsAnsiToUnicode(pName, NULL);
|
|
if( pwsz )
|
|
{
|
|
wcscpy( g_ServerNetBiosName+2, g_ServerIpAddressUnicodeString);
|
|
WinsFreeMemory(pwsz);
|
|
pwsz = NULL;
|
|
}
|
|
else
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
EMSG_WINS_OUT_OF_MEMORY);
|
|
fReturn = FALSE;
|
|
WinsFreeMemory(pAdd);
|
|
pAdd = NULL;
|
|
goto RETURN;
|
|
}
|
|
WinsFreeMemory(pAdd);
|
|
pAdd = NULL;
|
|
}
|
|
else
|
|
{
|
|
DisplayErrorMessage(EMSG_WINS_VERIFY_ADDRESS,
|
|
Status);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//find out what type of access do we have
|
|
Access = WINS_NO_ACCESS;
|
|
Status = WinsCheckAccess(hTempBind, &Access);
|
|
|
|
if( Status is RPC_S_PROCNUM_OUT_OF_RANGE )
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
EMSG_ACCESS_NOT_DETERMINED,
|
|
g_ServerNameUnicode);
|
|
|
|
if( g_hBind )
|
|
{
|
|
WinsUnbind(&g_BindData, g_hBind);
|
|
}
|
|
|
|
g_hBind = hTempBind;
|
|
g_BindData = TempBindData;
|
|
fReturn = TRUE;
|
|
goto RETURN;
|
|
}
|
|
else if (WINSINTF_SUCCESS == Status)
|
|
{
|
|
if (Access != WINS_NO_ACCESS)
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
Access == WINS_CONTROL_ACCESS ? MSG_WINS_RWACCESS : MSG_WINS_ROACCESS,
|
|
g_ServerNameUnicode);
|
|
}
|
|
|
|
if( Access is WINS_NO_ACCESS )
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
MSG_WINS_NOACCESS,
|
|
g_ServerNameUnicode);
|
|
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
if( g_hBind )
|
|
{
|
|
WinsUnbind(&g_BindData, g_hBind);
|
|
}
|
|
g_hBind = hTempBind;
|
|
g_BindData = TempBindData;
|
|
|
|
fReturn = TRUE;
|
|
goto RETURN;
|
|
}
|
|
else
|
|
{
|
|
DisplayErrorMessage(EMSG_WINS_GETSTATUS_FAILED,
|
|
Status);
|
|
{
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
}
|
|
|
|
fReturn = TRUE;
|
|
goto RETURN;
|
|
}
|
|
|
|
}
|
|
|
|
//Now process the Computer name and convert it to ANSI because
|
|
//gethostbyname requires ANSI character string.
|
|
|
|
{
|
|
int dw = 0;
|
|
|
|
dw = WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
pwszComputerName,
|
|
wcslen(pwszComputerName),
|
|
pszComputerName,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if( dw is 0 )
|
|
{
|
|
fReturn = FALSE;
|
|
return FALSE;
|
|
}
|
|
|
|
pszComputerName = WinsAllocateMemory((dw+1)*sizeof(CHAR));
|
|
|
|
if( pszComputerName is NULL )
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
dw = WideCharToMultiByte(CP_ACP,
|
|
0,
|
|
pwszComputerName,
|
|
wcslen(pwszComputerName),
|
|
pszComputerName,
|
|
dw+1,
|
|
NULL,
|
|
NULL);
|
|
|
|
if( dw is 0 )
|
|
{
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
}
|
|
|
|
//Now get the server IP Address
|
|
lpHostEnt = gethostbyname(pszComputerName);
|
|
|
|
//Not a valid server name
|
|
if( lpHostEnt is NULL )
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTERNAME);
|
|
if( pszComputerName )
|
|
{
|
|
WinsFreeMemory(pszComputerName);
|
|
pszComputerName = NULL;
|
|
}
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
//Get the IP Address from the returned struct...
|
|
memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4);
|
|
nLen = 0;
|
|
for( i=0; i<4; i++)
|
|
{
|
|
|
|
_itoa((int)pbAdd[i], szAdd, 10);
|
|
memcpy(g_ServerIpAddressAnsiString+nLen, szAdd, strlen(szAdd));
|
|
nLen += strlen(szAdd);
|
|
*(g_ServerIpAddressAnsiString+nLen) = '.';
|
|
nLen++;
|
|
|
|
}
|
|
*(g_ServerIpAddressAnsiString+nLen-1) = '\0';
|
|
|
|
dwIpAddress = WinsDottedStringToIpAddress(g_ServerIpAddressAnsiString);
|
|
dwHostName = strlen(g_ServerIpAddressAnsiString);
|
|
|
|
//Convert IP Address to a Unicode string and store it to the global variable.
|
|
|
|
|
|
memset(g_ServerIpAddressUnicodeString, 0x00, (MAX_IP_STRING_LEN+1)*sizeof(WCHAR));
|
|
|
|
pwsz = WinsAnsiToUnicode(g_ServerIpAddressAnsiString, NULL);
|
|
|
|
if( pwsz )
|
|
{
|
|
wcscpy(g_ServerIpAddressUnicodeString, pwsz);
|
|
WinsFreeMemory(pwsz);
|
|
pwsz = NULL;
|
|
}
|
|
else
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
EMSG_WINS_OUT_OF_MEMORY);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
g_ServerNameAnsi = WinsAllocateMemory(strlen(lpHostEnt->h_name)+1);
|
|
|
|
g_ServerNameUnicode = WinsAllocateMemory((strlen(lpHostEnt->h_name) + 1)*sizeof(WCHAR));
|
|
|
|
if( ( g_ServerNameUnicode is NULL ) or
|
|
( g_ServerNameAnsi is NULL ) )
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_WINS_NOT_ENOUGH_MEMORY);
|
|
if( pszComputerName )
|
|
{
|
|
WinsFreeMemory(pszComputerName);
|
|
pszComputerName = NULL;
|
|
}
|
|
if( pwszComputerName )
|
|
{
|
|
WinsFreeMemory(pwszComputerName);
|
|
pwszComputerName = NULL;
|
|
}
|
|
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
strcpy(g_ServerNameAnsi, lpHostEnt->h_name);
|
|
|
|
{
|
|
int dw = 0;
|
|
dw = MultiByteToWideChar(CP_ACP,
|
|
0,
|
|
lpHostEnt->h_name,
|
|
strlen(lpHostEnt->h_name),
|
|
g_ServerNameUnicode,
|
|
strlen(lpHostEnt->h_name)+1);
|
|
|
|
if ( dw == 0 )
|
|
{
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
}
|
|
//Bind the server
|
|
TempBindData.fTcpIp = TRUE;
|
|
TempBindData.pServerAdd = (LPBYTE)g_ServerIpAddressUnicodeString;
|
|
TempBindData.pPipeName = (LPBYTE)g_ServerNameUnicode;
|
|
hTempBind = WinsBind(&TempBindData);
|
|
|
|
if (hTempBind == NULL)
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
EMSG_WINS_BIND_FAILED,
|
|
g_ServerIpAddressUnicodeString);
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
//Make sure this is the correct address for the WINS
|
|
{
|
|
WINSINTF_ADD_T WinsAdd = {0};
|
|
UCHAR pName[256] = {'\0'};
|
|
|
|
Status = WinsGetNameAndAdd(hTempBind,
|
|
&WinsAdd,
|
|
pName);
|
|
|
|
if( Status is NO_ERROR )
|
|
{
|
|
LPWSTR pAdd = IpAddressToString(WinsAdd.IPAdd);
|
|
|
|
if( pAdd is NULL )
|
|
{
|
|
fReturn = FALSE;
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
goto RETURN;
|
|
|
|
}
|
|
wcscpy(g_ServerIpAddressUnicodeString,
|
|
pAdd);
|
|
|
|
psz = WinsUnicodeToOem(pAdd, NULL);
|
|
if( psz )
|
|
{
|
|
strcpy(g_ServerIpAddressAnsiString, psz);
|
|
WinsFreeMemory(psz);
|
|
psz = NULL;
|
|
}
|
|
|
|
pwsz = WinsOemToUnicode(pName, NULL);
|
|
if( pwsz )
|
|
{
|
|
wcscpy( g_ServerNetBiosName+2, g_ServerIpAddressUnicodeString);
|
|
WinsFreeMemory(pwsz);
|
|
pwsz = NULL;
|
|
}
|
|
else
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
EMSG_WINS_OUT_OF_MEMORY);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
WinsFreeMemory(pAdd);
|
|
pAdd = NULL;
|
|
}
|
|
else
|
|
{
|
|
DisplayErrorMessage(EMSG_WINS_VERIFY_ADDRESS,
|
|
Status);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//find out what type of access do we have
|
|
Access = WINS_NO_ACCESS;
|
|
Status = WinsCheckAccess(hTempBind, &Access);
|
|
|
|
if( Status is RPC_S_PROCNUM_OUT_OF_RANGE )
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
EMSG_ACCESS_NOT_DETERMINED,
|
|
g_ServerNameUnicode);
|
|
|
|
if( g_hBind )
|
|
{
|
|
WinsUnbind(&g_BindData, g_hBind);
|
|
}
|
|
|
|
g_hBind = hTempBind;
|
|
g_BindData = TempBindData;
|
|
fReturn = TRUE;
|
|
goto RETURN;
|
|
}
|
|
else if (WINSINTF_SUCCESS == Status)
|
|
{
|
|
if (Access != WINS_NO_ACCESS)
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
Access == WINS_CONTROL_ACCESS ? MSG_WINS_RWACCESS : MSG_WINS_ROACCESS,
|
|
g_ServerNameUnicode);
|
|
}
|
|
|
|
if( Access is WINS_NO_ACCESS )
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
MSG_WINS_NOACCESS,
|
|
g_ServerNameUnicode);
|
|
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
if( g_hBind )
|
|
{
|
|
WinsUnbind(&g_BindData, g_hBind);
|
|
}
|
|
g_hBind = hTempBind;
|
|
g_BindData = TempBindData;
|
|
fReturn = TRUE;
|
|
goto RETURN;
|
|
|
|
}
|
|
else
|
|
{
|
|
DisplayErrorMessage(EMSG_WINS_GETSTATUS_FAILED,
|
|
Status);
|
|
fReturn = FALSE;
|
|
goto RETURN;
|
|
}
|
|
|
|
RETURN:
|
|
if( pszComputerName)
|
|
{
|
|
WinsFreeMemory(pszComputerName);
|
|
pszComputerName = NULL;
|
|
}
|
|
|
|
if( pwszComputerName )
|
|
{
|
|
WinsFreeMemory(pwszComputerName);
|
|
pwszComputerName = NULL;
|
|
}
|
|
|
|
if( pTemp1 )
|
|
{
|
|
WinsFreeMemory(pTemp1);
|
|
pTemp1 = NULL;
|
|
}
|
|
|
|
if( fReturn is FALSE )
|
|
{
|
|
wcscpy(g_ServerIpAddressUnicodeString, wTempIp);
|
|
strcpy(g_ServerIpAddressAnsiString, cTempIp);
|
|
g_ServerNameUnicode = pwszTempServer;
|
|
g_ServerNameAnsi = pszTempServer;
|
|
wcscpy(g_ServerNetBiosName, wTempNetBios);
|
|
}
|
|
return fReturn;
|
|
}
|