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