/*++ Copyright (c) 1998 Microsoft Corporation Module Name: Routing\Netsh\wins\srvrhndl.c Abstract: WINS Command dispatcher. Created by: Shubho Bhattacharya(a-sbhatt) on 12/10/98 --*/ #include "precomp.h" extern ULONG g_ulSrvrNumTopCmds; extern ULONG g_ulSrvrNumGroups; extern CMD_GROUP_ENTRY g_SrvrCmdGroups[]; extern CMD_ENTRY g_SrvrCmds[]; DWORD g_dwSearchCount = 0; BOOL g_fHeader = FALSE; WCHAR **LA_Table = NULL; LARGE_INTEGER **SO_Table = NULL; u_char **NBNames = NULL; WINSERVERS * WinServers = NULL; LPWSTR GetDateTimeString(DWORD_PTR TimeStamp, BOOL fShort, int *piType); DWORD HandleSrvrDump( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Dumps the current configuration of the Wins Server. Arguments : Does not take any arguments. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; if( dwArgCount > dwCurrentIndex ) { if( IsHelpToken(ppwcArguments[dwCurrentIndex]) is TRUE ) { DisplayMessage(g_hModule, HLP_WINS_DUMP_EX); } } Status = WinsDumpServer(g_ServerIpAddressUnicodeString, g_ServerNetBiosName, g_hBind, g_BindData); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } else if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, EMSG_WINS_NOT_CONFIGURED); } else { DisplayErrorMessage(EMSG_SRVR_DUMP, Status); } return Status; } DWORD HandleSrvrHelp( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the help for Wins Server context. Arguments : Does not take any arguments. Return Value: Returns the status of the operation. NO_ERROR always. --*/ { DWORD i, j; for(i = 0; i < g_ulSrvrNumTopCmds -2; i++) { if ((g_SrvrCmds[i].dwCmdHlpToken == WINS_MSG_NULL) || !g_SrvrCmds[i].pwszCmdToken[0] ) { continue; } DisplayMessage(g_hModule, g_SrvrCmds[i].dwShortCmdHelpToken); } for(i = 0; i < g_ulSrvrNumGroups; i++) { if ((g_SrvrCmdGroups[i].dwShortCmdHelpToken == WINS_MSG_NULL) || !g_SrvrCmdGroups[i].pwszCmdGroupToken[0] ) { continue; } DisplayMessage(g_hModule, g_SrvrCmdGroups[i].dwShortCmdHelpToken); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); return NO_ERROR; } DWORD HandleSrvrAddName( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Adds and registers a name record to the WINS server Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory, Record Name and Ip Address Optional, Endchar, Scope, RecordType, NodeType, GroupType Note : GroupType is ignored if EndChar is specified. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount = 0; TAG_TYPE pttTags[] = { {WINS_TOKEN_NAME, TRUE, FALSE}, {WINS_TOKEN_ENDCHAR, FALSE, FALSE}, {WINS_TOKEN_SCOPE, FALSE, FALSE}, {WINS_TOKEN_RECORDTYPE, FALSE, FALSE}, {WINS_TOKEN_GROUP, FALSE, FALSE}, {WINS_TOKEN_NODE, FALSE, FALSE}, {WINS_TOKEN_IP, TRUE, FALSE}, }; PDWORD pdwTagNum = NULL, pdwTagType = NULL; WCHAR wszName[MAX_STRING_LEN+1] = {L'\0'}; BOOL fEndChar = FALSE; BOOL fDomain = FALSE; CHAR ch16thChar = 0x00; BOOL fScope = FALSE; WCHAR wszScope[MAX_STRING_LEN] = {L'\0'}; BOOL fStatic = TRUE; DWORD dwRecType = WINSINTF_E_UNIQUE; BYTE rgbNodeType = WINSINTF_E_PNODE; PDWORD pdwIpAddress = NULL; DWORD dwIpCount = 0; DWORD dwStrLen = 0; LPWSTR pwszTemp = NULL; WINSINTF_RECORD_ACTION_T RecAction = {0}; PWINSINTF_RECORD_ACTION_T pRecAction = NULL; LPSTR pszTempName = NULL; memset(&RecAction, 0x00, sizeof(WINSINTF_RECORD_ACTION_T)); RecAction.fStatic = fStatic; //We need at least Name and Ip for the record. if( dwArgCount < dwCurrentIndex + 2 ) { DisplayMessage(g_hModule, HLP_SRVR_ADD_NAME_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } //Start processing the arguments passed by ppwcArguments and dwArgCount dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } for( k=0; k= L'a' and towlower(wc) <= L'z' ) { if( towlower(wc) > L'f' ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } ch16thChar = StringToHexA(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); break; } //Scope ( Optional ) case 2: { DWORD dwLen; dwLen = wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); fScope = TRUE; if( dwLen is 0 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwLen = ( 255 < dwLen ) ? 255 : dwLen; memcpy(wszScope, ppwcArguments[dwCurrentIndex+pdwTagNum[j]], dwLen*sizeof(WCHAR)); wszScope[dwLen] = L'\0'; break; } //Record Type ie Static or Dynamic ( Optional ) case 3: { if( wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) > 1 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } else { WCHAR wc = ppwcArguments[dwCurrentIndex+pdwTagNum[j]][0]; if( wc is L'1' ) fStatic = FALSE; else if( wc is L'0' ) fStatic = TRUE; else { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } break; } // Group Type ( Optional ) case 4: { DWORD dw = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); switch(dw) { case 0: { dwRecType = WINSINTF_E_UNIQUE; break; } case 1: { dwRecType = WINSINTF_E_NORM_GROUP; break; } case 2: { dwRecType = WINSINTF_E_SPEC_GROUP; break; } case 3: { dwRecType = WINSINTF_E_MULTIHOMED; break; } case 4: { fDomain = TRUE; dwRecType = WINSINTF_E_SPEC_GROUP; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } break; } //Node Type( Optional ) case 5: { DWORD dw = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); switch(dw) { case 0: { rgbNodeType = WINSINTF_E_BNODE; break; } case 1: { rgbNodeType = WINSINTF_E_PNODE; break; } case 3: { rgbNodeType = WINSINTF_E_HNODE; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } break; } //IP Address corresponding to the record( Compulsory ) case 6: { LPWSTR pszIps = NULL; DWORD dwIpLen = 0; LPWSTR pTemp = NULL; dwIpCount = 0; dwIpLen = wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); if( dwIpLen is 0 ) { break; } pszIps = WinsAllocateMemory((dwIpLen+1)*sizeof(WCHAR)); if( pszIps is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(pszIps, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); if( pszIps[0] isnot L'{' or pszIps[dwIpLen-1] isnot L'}') { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } pTemp = pszIps+1; pszIps[dwIpLen-1] = L'\0'; pTemp = wcstok(pTemp, L","); while(( pTemp isnot NULL ) && (dwIpCount < WINSINTF_MAX_MEM ) ) { PDWORD pdwTemp = NULL; if( IsIpAddress(pTemp) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwIpCount++; pdwTemp = WinsAllocateMemory(dwIpCount*sizeof(DWORD)); if( pdwTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } if( pdwIpAddress ) { memcpy(pdwTemp, pdwIpAddress, (dwIpCount-1)*sizeof(DWORD)); WinsFreeMemory(pdwIpAddress); pdwIpAddress = NULL; } pdwTemp[dwIpCount-1] = StringToIpAddress(pTemp); pdwIpAddress = pdwTemp; pTemp = wcstok(NULL, L","); } WinsFreeMemory(pszIps); pszIps = NULL; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } //Process Name, Scope and Endchar if specified. _wcsupr(wszName); _wcsupr(wszScope); RecAction.pName = WinsAllocateMemory(273); if( RecAction.pName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } pszTempName = WinsUnicodeToOem(wszName, NULL); if( pszTempName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwStrLen = strlen(pszTempName); if( dwStrLen >= 16 ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_NETBIOS_NAME); Status = ERROR_INVALID_PARAMETER; WinsFreeMemory(pszTempName); pszTempName = NULL; goto ErrorReturn; } strncpy(RecAction.pName, pszTempName, ( 16 > dwStrLen ) ? dwStrLen : 16); WinsFreeMemory(pszTempName); pszTempName = NULL; if( fDomain is TRUE && fEndChar is FALSE ) { ch16thChar = StringToHexA(L"1C"); fEndChar = TRUE; } for( j=dwStrLen; j<16; j++ ) { RecAction.pName[j] = ' '; } if( fEndChar is TRUE ) { RecAction.pName[15] = (CHAR)ch16thChar; } RecAction.pName[16] = '\0'; dwStrLen = 16; if( fScope ) { DWORD dwLen; RecAction.pName[dwStrLen] = '.'; pszTempName = WinsUnicodeToOem(wszScope, NULL); if( pszTempName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwLen = strlen(pszTempName); dwLen = ( 255 - dwStrLen < dwLen ) ? 255 - dwStrLen : dwLen; strncpy(RecAction.pName+dwStrLen+1, pszTempName, dwLen); WinsFreeMemory(pszTempName); pszTempName = NULL; RecAction.pName[dwStrLen+dwLen+1] = '\0'; dwStrLen = strlen(RecAction.pName); if( fEndChar and ch16thChar is 0x00 ) dwStrLen++; } RecAction.NameLen = dwStrLen; RecAction.Cmd_e = WINSINTF_E_INSERT; RecAction.fStatic = fStatic; if( pdwIpAddress is NULL ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( dwRecType isnot WINSINTF_E_NORM_GROUP and dwRecType isnot WINSINTF_E_SPEC_GROUP) { RecAction.NodeTyp = rgbNodeType; } //Treat each of the rectype when no endchar is specified specially. //This part of the code needs to be cleaned up after Beta3 if( fEndChar is FALSE ) { if( dwRecType is WINSINTF_E_SPEC_GROUP or dwRecType is WINSINTF_E_MULTIHOMED ) { RecAction.pAdd = WinsAllocateMemory(dwIpCount*sizeof(WINSINTF_ADD_T)); if( RecAction.pAdd is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } for( j=0; jIPAdd = pdwIpAddress[j]; (RecAction.pAdd+j)->Type = 0; (RecAction.pAdd+j)->Len = 4; } RecAction.NoOfAdds = dwIpCount; } else { RecAction.Add.IPAdd = pdwIpAddress[0]; RecAction.Add.Type = 0; RecAction.Add.Len = 4; } switch(dwRecType) { case WINSINTF_E_UNIQUE: { CHAR Type[]={0x03, 0x20, 0x00}; for( i=0; i<3; i++ ) { *(RecAction.pName + 15) = Type[i]; if( Type[i] is 0x00 ) { RecAction.pName[16] = '\0'; RecAction.NameLen = 16; } RecAction.TypOfRec_e = dwRecType; pRecAction = &RecAction; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status isnot NO_ERROR ) goto ErrorReturn; } break; } case WINSINTF_E_NORM_GROUP: { RecAction.pName[15] = (CHAR)0x1E; pRecAction = &RecAction; RecAction.TypOfRec_e = dwRecType; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status isnot NO_ERROR ) goto ErrorReturn; break; } case WINSINTF_E_SPEC_GROUP: { RecAction.pName[15] = (CHAR)0x20; pRecAction = &RecAction; RecAction.TypOfRec_e = dwRecType; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status isnot NO_ERROR ) goto ErrorReturn; break; } case WINSINTF_E_MULTIHOMED: { CHAR Type[]={0x03, 0x20, 0x00}; for( i=0; i<3; i++ ) { *(RecAction.pName + 15) = Type[i]; if( Type[i] is 0x00 ) { *(RecAction.pName+16) = '\0'; RecAction.NameLen = 16; } RecAction.TypOfRec_e = dwRecType; pRecAction = &RecAction; RecAction.NodeTyp = WINSINTF_E_PNODE; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status isnot NO_ERROR ) goto ErrorReturn; } break; } } } //Otherwise when Endchar is specified else { //if endchar is 0x00, ignore the scope if spcefied if( RecAction.pName[15] is 0x00 ) { RecAction.NameLen = 16; } //If endchar is 0x1C if( RecAction.pName[15] is 0x1C ) { RecAction.TypOfRec_e = WINSINTF_E_SPEC_GROUP; RecAction.NodeTyp = 0; } //else if EndChar is 0x1E or 0x1D else if( RecAction.pName[15] is 0x1E or RecAction.pName[15] is 0x1D ) { RecAction.TypOfRec_e = WINSINTF_E_NORM_GROUP; RecAction.NodeTyp = 0; } if( RecAction.TypOfRec_e is WINSINTF_E_SPEC_GROUP ) { RecAction.pAdd = WinsAllocateMemory(dwIpCount*sizeof(WINSINTF_ADD_T)); if( RecAction.pAdd is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } for( j=0; jIPAdd = pdwIpAddress[j]; (RecAction.pAdd+j)->Type = 0; (RecAction.pAdd+j)->Len = 4; } RecAction.NoOfAdds = dwIpCount; } else { RecAction.Add.IPAdd = pdwIpAddress[0]; RecAction.Add.Type = 0; RecAction.Add.Len = 4; } pRecAction = &RecAction; Status = WinsRecordAction(g_hBind, &pRecAction ); if( Status isnot NO_ERROR ) goto ErrorReturn; } CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( pszTempName ) { WinsFreeMemory(pszTempName); pszTempName = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( RecAction.pName ) { WinsFreeMemory(RecAction.pName); RecAction.pName = NULL; } if( RecAction.pAdd ) { WinsFreeMemory(RecAction.pAdd); RecAction.pAdd = NULL; } if( pdwIpAddress ) { WinsFreeMemory(pdwIpAddress); pdwIpAddress = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_ADD_NAME, Status); goto CommonReturn; } DWORD HandleSrvrAddPartner( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Adds a partner ( either Push or Pull or Both ) to the WINS server Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory, ServerIpAddress Optional, ServerNetBios name and PartnerType. Note : Server NetBios name is required when Ip address can not be resolved to a name. PartherType by default is both. Otherwise whatever specified. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVER, TRUE, FALSE}, {WINS_TOKEN_NETBIOS, FALSE, FALSE}, {WINS_TOKEN_TYPE, FALSE, FALSE}, }; LPWSTR pwszServerName = NULL; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN+1] = {L'\0'}; PDWORD pdwTagType=NULL, pdwTagNum=NULL; BOOL fPush = TRUE, fPull = TRUE; HKEY hServer = NULL, hPartner = NULL, hDefault = NULL, hKey = NULL; LPWSTR pTemp = NULL; DWORD dwKeyLen = 0; DWORD dwData = 0, dwDataLen = 0, dwType = 0; BOOL fIsNetBios = TRUE; //Need at least the server Ip Address if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_ADD_PARTNER_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } //Start processing the arguments based on ppwcArguments and dwArgCount and dwCurrnetIndex dwNumArgs = dwArgCount - dwCurrentIndex; dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; ih_name); pTemp = WinsAllocateMemory(dwLen+1); if( pTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } strcpy(pTemp, lpHostEnt->h_name); pNetBios = strchr(pTemp, '.'); if( pNetBios isnot NULL ) { dwLen = (DWORD)(pNetBios - pTemp); pTemp[dwLen] = '\0'; } pwszServerName = WinsAllocateMemory((dwLen+1)*sizeof(WCHAR)); if( pwszServerName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(pwszServerName, WinsAnsiToUnicode(pTemp, NULL)); if( pTemp ) { WinsFreeMemory(pTemp); pTemp = NULL; } break; } //Server NetBios Name. Required only when Ip can not be resolved to a name. //Otherwise ignored. case 1: { if( fIsNetBios is FALSE ) { pwszServerName = WinsAllocateMemory((wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]])+1)*sizeof(WCHAR)); if( pwszServerName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(pwszServerName, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); fIsNetBios = TRUE; } break; } //Partner Type. Default is BOTH case 2: { DWORD dwType = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwType = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); switch(dwType) { case 0: { fPull = TRUE; fPush = FALSE; break; } case 1: { fPull = FALSE; fPush = TRUE; break; } case 2: default: { fPull = TRUE; fPush = TRUE; break; } } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } if( fIsNetBios is FALSE ) { Status = ERROR_INVALID_IPADDRESS; goto ErrorReturn; } //Add the partner information to the registry and set the appropriate parameter { if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot ERROR_SUCCESS ) goto ErrorReturn; //Add the pull partner information if( fPull ) { DWORD dwDisposition = 0; Status = RegCreateKeyEx(hServer, PULLROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hPartner, &dwDisposition); if( Status isnot NO_ERROR ) { if( fPush ) goto PUSH; goto ErrorReturn; } Status = RegCreateKeyEx(hPartner, wcServerIpAdd, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); if( Status isnot NO_ERROR ) { if( fPush ) goto PUSH; goto ErrorReturn; } Status = RegSetValueEx(hKey, NETBIOSNAME, 0, REG_SZ, (LPBYTE)pwszServerName, (wcslen(pwszServerName)+1)*sizeof(WCHAR)); if(Status isnot NO_ERROR ) { if( fPush ) goto PUSH; goto ErrorReturn; } dwType = REG_DWORD; dwData = 0; dwDataLen = sizeof(DWORD); Status = RegQueryValueEx( hPartner, PERSISTENCE, 0, &dwType, (LPBYTE)&dwData, &dwDataLen); if( Status isnot NO_ERROR ) { dwData = 0; dwDataLen = sizeof(DWORD); } Status = RegSetValueEx(hKey, PERSISTENCE, 0, REG_DWORD, (LPBYTE)&dwData, dwDataLen); if( Status isnot NO_ERROR ) { if( fPush ) goto PUSH; goto ErrorReturn; } dwType = REG_DWORD; dwData = 0; dwDataLen = sizeof(DWORD); Status = RegQueryValueEx(hPartner, WINSCNF_SELF_FND_NM, 0, &dwType, (LPBYTE)&dwData, &dwDataLen); if( Status isnot NO_ERROR ) { dwData = 0; dwDataLen = sizeof(DWORD); } Status = RegSetValueEx(hKey, WINSCNF_SELF_FND_NM, 0, REG_DWORD, (LPBYTE)&dwData, dwDataLen); if( Status isnot NO_ERROR ) { if( fPush ) goto PUSH; goto ErrorReturn; } Status = RegOpenKeyEx(hServer, DEFAULTPULL, 0, KEY_ALL_ACCESS, &hDefault); if( Status is NO_ERROR ) { dwType = REG_DWORD; dwData = 0; dwDataLen = sizeof(DWORD); Status = RegQueryValueEx(hDefault, WINSCNF_RPL_INTERVAL_NM, 0, &dwType, (LPBYTE)&dwData, &dwDataLen); if(Status isnot NO_ERROR ) { dwData = 1800; dwDataLen = sizeof(DWORD); } } else { dwData = 1800; dwDataLen = sizeof(DWORD); } Status = RegSetValueEx(hKey, WINSCNF_RPL_INTERVAL_NM, 0, REG_DWORD, (LPBYTE)&dwData, dwDataLen); if( Status isnot NO_ERROR ) { if( fPush ) goto PUSH; goto ErrorReturn; } } //Add the push partner information PUSH: if( hKey ) { RegCloseKey(hKey); hKey = NULL; } if( hDefault ) { RegCloseKey(hDefault); hDefault = NULL; } if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } if( fPush ) { DWORD dwDisposition = 0; Status = RegCreateKeyEx(hServer, PUSHROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hPartner, &dwDisposition); if( Status isnot NO_ERROR ) { goto ErrorReturn; } Status = RegCreateKeyEx(hPartner, wcServerIpAdd, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); if( Status isnot NO_ERROR ) { goto ErrorReturn; } Status = RegSetValueEx(hKey, NETBIOSNAME, 0, REG_SZ, (LPBYTE)pwszServerName, (wcslen(pwszServerName)+1)*sizeof(WCHAR)); if(Status isnot NO_ERROR ) { goto ErrorReturn; } dwType = REG_DWORD; dwData = 0; dwDataLen = sizeof(DWORD); Status = RegQueryValueEx( hPartner, PERSISTENCE, 0, &dwType, (LPBYTE)&dwData, &dwDataLen); if( Status isnot NO_ERROR ) { dwData = 0; dwDataLen = sizeof(DWORD); } Status = RegSetValueEx(hKey, PERSISTENCE, 0, REG_DWORD, (LPBYTE)&dwData, dwDataLen); if( Status isnot NO_ERROR ) { goto ErrorReturn; } dwType = REG_DWORD; dwData = 0; dwDataLen = sizeof(DWORD); Status = RegQueryValueEx(hPartner, WINSCNF_SELF_FND_NM, 0, &dwType, (LPBYTE)&dwData, &dwDataLen); if( Status isnot NO_ERROR ) { dwData = 0; dwDataLen = sizeof(DWORD); } Status = RegSetValueEx(hKey, WINSCNF_SELF_FND_NM, 0, REG_DWORD, (LPBYTE)&dwData, dwDataLen); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, DEFAULTPUSH, 0, KEY_ALL_ACCESS, &hDefault); if( Status is NO_ERROR ) { dwType = REG_DWORD; dwData = 0; dwDataLen = sizeof(DWORD); Status = RegQueryValueEx(hDefault, WINSCNF_UPDATE_COUNT_NM, 0, &dwType, (LPBYTE)&dwData, &dwDataLen); if(Status isnot NO_ERROR ) { dwData = 0; dwDataLen = sizeof(DWORD); } } else { dwData = 0; dwDataLen = sizeof(DWORD); } Status = RegSetValueEx(hKey, WINSCNF_UPDATE_COUNT_NM, 0, REG_DWORD, (LPBYTE)&dwData, dwDataLen); if( Status isnot NO_ERROR ) { goto ErrorReturn; } if( hKey ) { RegCloseKey(hKey); hKey = NULL; } if( hDefault ) { RegCloseKey(hDefault); hDefault = NULL; } if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } } } CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pwszServerName ) { WinsFreeMemory(pwszServerName); pwszServerName = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( hDefault ) { RegCloseKey(hDefault); hDefault = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_ADD_PARTNER, Status); if( hKey ) { RegCloseKey(hKey); hKey = NULL; } if( hPartner ) { RegDeleteKey(hPartner, g_ServerIpAddressUnicodeString); RegCloseKey(hPartner); hPartner = NULL; } goto CommonReturn; } BOOL CheckValidPgOp(HKEY hPartner, BOOL fGrata) /*++ Routine Description : Check whether Persona Mode allows operation for persona grata (fGrata) or non-grata (!fGrata) Arguments : hPartner = opened handle to the 'Partners' registry key fGrata specifies whether the check is done for a persona Grata (TRUE) operation or of a persona Non-Grata (FALSE) operation Return Value: Returns TRUE if the operation is allowed, FALSE otherwise. --*/ { DWORD dwPersMode = 0; // default (entry not existant) = Persona Non-Grata DWORD dwType; DWORD dwSize = sizeof(DWORD); // don't chare about the return code. If something goes wrong (entry not existant) // consider Persona Mode as being 'Persona Non-Grata'. RegQueryValueExA(hPartner, WINSCNF_PERSONA_MODE_NM, NULL, &dwType, (LPVOID)&dwPersMode, &dwSize); return dwPersMode ? fGrata : !fGrata; } DWORD HandleSrvrAddPersona( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Add Persona Non Grata servers for the WINS Server Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory, List of Server Ip addresses seperated by commas and enclosed by {} ( curly braces ) Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVERS, TRUE, FALSE}, }; DWORD dwTagType = 0, dwTagNum = 0; DWORD dwSize = 0, dwType = REG_MULTI_SZ, dwPngIp = 0, dwTotal = 0; LPWSTR pwszPngIp = NULL; LPWSTR pTemp = NULL; LPWSTR pwszTempKey = NULL; LPBYTE pbByte = NULL; HKEY hServer = NULL, hPartner = NULL; LPDWORD pdwPngIp = NULL; DWORD dwLenCount = 0, dwTemp = 0; BOOL fGrata; fGrata = (wcsstr(CMD_SRVR_ADD_PNGSERVER, ppwcArguments[dwCurrentIndex-1]) == NULL); //Needs a parameter always if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, fGrata ? HLP_SRVR_ADD_PGSERVER_EX : HLP_SRVR_ADD_PNGSERVER_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARTNERROOT, 0, KEY_ALL_ACCESS, &hPartner); if( Status isnot NO_ERROR ) goto ErrorReturn; if (!CheckValidPgOp(hPartner, fGrata)) { DisplayMessage(g_hModule, fGrata ? EMSG_SRVR_PG_INVALIDOP : EMSG_SRVR_PNG_INVALIDOP); Status = ERROR_INVALID_PARAMETER; goto CommonReturn; } if (fGrata) pwszTempKey = WinsOemToUnicode(WINSCNF_PERSONA_GRATA_NM, NULL); else pwszTempKey = WinsOemToUnicode(WINSCNF_PERSONA_NON_GRATA_NM, NULL); if( pwszTempKey is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = RegQueryValueEx(hPartner, pwszTempKey, NULL, &dwType, pbByte, &dwSize); WinsFreeMemory(pwszTempKey); pwszTempKey = NULL; if( Status isnot NO_ERROR and Status isnot 2 ) goto ErrorReturn; if( dwSize > 7 ) { LPWSTR pwszPng = NULL; pbByte = WinsAllocateMemory(dwSize+2); dwSize+=2; if( pbByte is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = RegQueryValueEx(hPartner, fGrata ? PGSERVER : PNGSERVER, NULL, &dwType, pbByte, &dwSize); if( Status isnot NO_ERROR ) goto ErrorReturn; pwszPng = (LPWSTR)pbByte; pwszPngIp = WinsAllocateMemory(dwSize); if( pwszPngIp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } memcpy(pwszPngIp, pbByte, dwSize); for( i=0; i<(dwSize+2)/sizeof(WCHAR); i++ ) { if( pwszPng[i] is L'\0' and pwszPng[i+1] isnot L'\0') { pwszPng[i] = L','; i++; } } dwPngIp = 0; pTemp = wcstok(pwszPng, L","); while(pTemp isnot NULL ) { LPDWORD pdwTemp = pdwPngIp; dwPngIp++; dwLenCount += wcslen(pTemp); pdwPngIp = WinsAllocateMemory(dwPngIp*sizeof(DWORD)); if( pdwPngIp is NULL ) { WinsFreeMemory(pdwTemp); pdwTemp = NULL; Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( pdwTemp isnot NULL ) { memcpy(pdwPngIp, pdwTemp, (dwPngIp-1)*sizeof(DWORD)); WinsFreeMemory(pdwTemp); pdwTemp = NULL; } pdwPngIp[dwPngIp-1] = StringToIpAddress(pTemp); pTemp = wcstok(NULL, L","); dwLenCount++; } } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, &dwTagType, &dwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i dwCurrentIndex ) { //Start processing the arguments dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( j=0; j 18 ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_NAME, pwszName); } else { pTemp = wcsstr(pwszName, L"*"); if( pTemp is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_NAME, pwszName); } else { CHAR chEnd = 0x00; dw = (DWORD)(pTemp - pwszName + 1); if( dw > 16 ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_NETBIOS_NAME); goto ErrorReturn; } pwszName[dw-1] = L'\0'; chEnd = StringToHexA(pTemp+1); if( dwType > 255 ) { DisplayMessage(g_hModule, EMSG_WINS_VALUE_OUTOFRANGE); } else { LPWSTR pwcTemp = WinsAllocateMemory((NBT_NONCODED_NMSZ+1)*sizeof(WCHAR)); LPWSTR pwTemp = NULL; if( pwcTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; if( pwszTemp isnot NULL ) { WinsFreeMemory(pwszTemp ); pwszTemp = NULL; } goto ErrorReturn; } wcscpy(pwcTemp, pwszName); wcsncat(pwcTemp, L" ", (16 - wcslen(pwszName))); pwcTemp[15] = chEnd; for( ilen=0; ilen 18 ) { pwszTempName = WinsOemToUnicode(pszName, NULL); if( pwszTempName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } DisplayMessage(g_hModule, EMSG_WINS_INVALID_NAME, pwszTempName); WinsFreeMemory(pwszTempName); pwszTempName = NULL; } else { WCHAR wcEnd[2] = {L'\0'}; CHAR cEnd[2] = {L'\0'}; pTemp = strstr(pszName, "*"); if( pTemp is NULL ) { pwszTempName = WinsOemToUnicode(pszName, NULL); if( pwszTempName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } DisplayMessage(g_hModule, EMSG_WINS_INVALID_NAME, pwszTempName); WinsFreeMemory(pwszTempName); pwszTempName = NULL; } else { CHAR chEndChar = 0x00; LPWSTR pwszTempBuf = NULL; dw = (DWORD)(pTemp - pszName + 1); if( dw > 16 ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_NETBIOS_NAME); goto ErrorReturn; } pszName[dw-1] = L'\0'; pwszTempBuf = WinsOemToUnicode(pTemp+1, NULL); if( pwszTempBuf is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } chEndChar = StringToHexA(pwszTempBuf); WinsFreeMemory(pwszTempBuf); pwszTempBuf = NULL; if( dwType > 255 ) { DisplayMessage(g_hModule, EMSG_WINS_VALUE_OUTOFRANGE); } else { LPSTR pcTemp = WinsAllocateMemory(NBT_NONCODED_NMSZ+1); if( pcTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; if( pbFileData isnot NULL ) { WinsFreeMemory(pbFileData ); pbFileData = NULL; } goto ErrorReturn; } strcpy(pcTemp, pszName); strncat(pcTemp, " ", (16-strlen(pszName))); pcTemp[15] = chEndChar; for( ilen=0; ilen NumWinServers ) { for( i=0; i<(DWORD)NumWinServers; i++) { if( WinServers[i].Server.s_addr is Temp.s_addr ) { fPresent = TRUE; break; } } if( fPresent is FALSE ) { WinServers[NumWinServers].Server.s_addr = Temp.s_addr; NumWinServers++; } } else break; } } } if( hPull ) { RegCloseKey(hPull); hPull = NULL; } dw = dwKeys = 0; while(TRUE) { Status = RegOpenKeyEx(hServer, PUSHROOT, 0, KEY_ALL_ACCESS, &hPush); if( Status isnot NO_ERROR ) { Status = NO_ERROR; break; } Status = RegQueryInfoKey(hPush, NULL, NULL, NULL, &dwKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if( Status isnot NO_ERROR ) { Status = NO_ERROR; break; } if( dwKeys < 1 ) break; for( dw=0; dw NumWinServers ) { for( i=0; i<(DWORD)NumWinServers; i++) { if( WinServers[i].Server.s_addr is Temp.s_addr ) { fPresent = TRUE; break; } } if( fPresent is FALSE ) { WinServers[NumWinServers].Server.s_addr = Temp.s_addr; NumWinServers++; } } else break; } } } if( hPush ) { RegCloseKey(hPush); hPush = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } if( NumNBNames is 0 ) { DisplayMessage(g_hModule, EMSG_WINS_NO_NAMES); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( NumWinServers is 0 ) { DisplayMessage(g_hModule, EMSG_WINS_NO_SERVERS); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( fIpEmpty is TRUE ) { DisplayMessage(g_hModule, EMSG_WINS_NO_SERVERS); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } else { CheckNameConsistency(); } if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pdwIpAddress ) { WinsFreeMemory(pdwIpAddress); pdwIpAddress = NULL; } if( ppNames ) { WinsFreeMemory(ppNames); ppNames = NULL; } if( WinServers ) { WinsFreeMemory(WinServers); WinServers = NULL; } if( NBNames ) { WinsFreeMemory(NBNames); NBNames = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_CHECK_NAME, Status); goto CommonReturn; } DWORD HandleSrvrCheckVersion( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Checks the version number consistencies for the records Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory, IP address of the server to start with. Optional, a File Name to store the output in proper format. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount = 0; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVER, TRUE, FALSE}, {WINS_TOKEN_FILE, FALSE, FALSE}, }; PDWORD pdwTagNum = NULL, pdwTagType = NULL; BOOL fFile = FALSE; FILE *pFile = NULL; LPSTR pStartIp = NULL; //Must provide the IP address of the server to start with if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_CHECK_VERSION_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } //Start processing the arguements based on the dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) { goto ErrorReturn; } for( j=0; j MAX_PATH ) { wcscpy(wcFile, L"wins.rec"); } else { wcscpy(wcFile, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); } pFile = _wfopen(wcFile, L"w+"); if( pFile is NULL ) { pFile = _wfopen(L"wins.rec", L"w+"); fFile = TRUE; } else { fFile = TRUE; } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } CheckVersionNumbers( pStartIp, fFile, pFile); CommonReturn: if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pFile ) { fclose(pFile); pFile = NULL; } if( pStartIp) { WinsFreeMemory(pStartIp); pStartIp = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_CHECK_VERSION, Status); goto CommonReturn; } DWORD HandleSrvrDeleteName( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Deletes an record entry for the WINS server database Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory, Record Name, Endchar Optional, Scope Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount = 0; TAG_TYPE pttTags[] = { {WINS_TOKEN_NAME, TRUE, FALSE}, {WINS_TOKEN_ENDCHAR, TRUE, FALSE}, {WINS_TOKEN_SCOPE, FALSE, FALSE} }; PDWORD pdwTagNum = NULL, pdwTagType = NULL; WCHAR wszName[MAX_STRING_LEN] = {L'\0'}; BOOL fEndChar = FALSE; CHAR ch16thChar = 0x00; BOOL fScope = FALSE; WCHAR wszScope[MAX_STRING_LEN] = {L'\0'}; LPSTR pszTempName = NULL; DWORD dwTempNameLen = 0; DWORD dwStrLen = 0; LPWSTR pwszTemp = NULL; WINSINTF_RECORD_ACTION_T RecAction = {0}; PWINSINTF_RECORD_ACTION_T pRecAction = NULL; memset(&RecAction, 0x00, sizeof(WINSINTF_RECORD_ACTION_T)); RecAction.fStatic = FALSE; //Must provide at least the record name and endchar if( dwArgCount < dwCurrentIndex + 2 ) { DisplayMessage(g_hModule, HLP_SRVR_DELETE_NAME_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } //Start processing the arguments based on ppwcArguments, dwArgCount and dwCurrentIndex dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } for( k=0; k= L'a' and towlower(wc) <= L'z' ) { if( towlower(wc) > L'f' ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } ch16thChar = StringToHexA(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); break; } //Scope case 2: { DWORD dwLen = wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); fScope = TRUE; if( dwLen is 0 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwLen = ( 255 < dwLen ) ? 255 : dwLen; memcpy(wszScope, ppwcArguments[dwCurrentIndex+pdwTagNum[j]], dwLen*sizeof(WCHAR)); wszScope[dwLen] = L'\0'; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } _wcsupr(wszName); _wcsupr(wszScope); pszTempName = WinsUnicodeToOem(wszName, NULL); if( pszTempName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwStrLen = strlen(pszTempName); if( dwStrLen >= 16 ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_NETBIOS_NAME); Status = ERROR_INVALID_PARAMETER; WinsFreeMemory(pszTempName); pszTempName = NULL; goto ErrorReturn; } RecAction.pName = WinsAllocateMemory(273); if( RecAction.pName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } strncpy(RecAction.pName, pszTempName, dwStrLen); WinsFreeMemory(pszTempName); pszTempName = NULL; for( i=dwStrLen; i < 16; i++ ) { RecAction.pName[i] = ' '; } if( fEndChar ) { if( ch16thChar is 0x00 ) { RecAction.pName[15] = 0x00; } else { RecAction.pName[15] = ch16thChar; } } RecAction.pName[16] = '\0'; dwStrLen = 16; if( fScope ) { DWORD dwLen = 0; RecAction.pName[dwStrLen] = '.'; pszTempName = WinsUnicodeToOem(wszScope, NULL); if( pszTempName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwLen = strlen(pszTempName); dwLen = ( 255 - dwStrLen < dwLen ) ? 255 - dwStrLen : dwLen; strncpy(RecAction.pName + dwStrLen + 1, pszTempName, dwLen); WinsFreeMemory(pszTempName); pszTempName = NULL; RecAction.pName[dwLen + dwStrLen + 1] = '\0'; if( fEndChar and ch16thChar is 0x00 ) dwStrLen = 16+dwLen+1; else dwStrLen = strlen(RecAction.pName); } else { RecAction.pName[dwStrLen] = '\0'; } RecAction.NameLen = dwStrLen; RecAction.Cmd_e = WINSINTF_E_QUERY; RecAction.OwnerId = StringToIpAddress(g_ServerIpAddressUnicodeString); RecAction.NameLen = dwStrLen; pRecAction = &RecAction; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status isnot NO_ERROR ) goto ErrorReturn; RecAction.Cmd_e = WINSINTF_E_DELETE; RecAction.State_e = WINSINTF_E_DELETED; pRecAction = &RecAction; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status isnot NO_ERROR ) goto ErrorReturn; CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( pszTempName ) { WinsFreeMemory(pszTempName); pszTempName = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( RecAction.pName ) { WinsFreeMemory(RecAction.pName); RecAction.pName = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_DELETE_NAME, Status); goto CommonReturn; return NO_ERROR; } DWORD HandleSrvrDeletePartner( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Delete a partner from the WINS server Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Confirmation Optional : Server IP and Type. Note : If no ip is provided, it deletes all partners in the list. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVER, FALSE, FALSE}, {WINS_TOKEN_TYPE, FALSE, FALSE}, {WINS_TOKEN_CONFIRM, TRUE, FALSE}, }; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN + 1] = {L'\0'}; DWORD dwIpLen = (MAX_IP_STRING_LEN+1); BOOL fPull = TRUE, fPush = TRUE, fConfirm = FALSE; HKEY hServer = NULL, hPartner = NULL; LPWSTR pTemp = NULL; //Must provide the confirmation in order for this to succeed. if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_DELETE_PARTNER_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } //Start processing the arguments based on ppwcArguments, dwCurrentIndex and dwArgCount else { dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot ERROR_SUCCESS ) goto ErrorReturn; //PullPartners if( fPull ) { Status = RegOpenKeyEx(hServer, PULLROOT, 0, KEY_ALL_ACCESS, &hPartner); if( Status isnot NO_ERROR ) { if (Status == ERROR_FILE_NOT_FOUND) Status = NO_ERROR; goto PUSH; } if( wcslen(wcServerIpAdd) < 3 )//not a valid Ip, delete all partners { while(TRUE) { Status = RegEnumKeyEx(hPartner, 0, wcServerIpAdd, &dwIpLen, NULL, NULL, NULL, NULL); if (Status != ERROR_SUCCESS) break; RegDeleteKey(hPartner, wcServerIpAdd); dwIpLen = (MAX_IP_STRING_LEN + 1)*sizeof(WCHAR); memset(wcServerIpAdd, L'\0', MAX_IP_STRING_LEN+1); } } else { RegDeleteKey(hPartner, wcServerIpAdd); } if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } if( Status is ERROR_NO_MORE_ITEMS ) { Status = NO_ERROR; goto PUSH; } if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, EMSG_INVALID_PARTNER_NAME); if( fPush ) goto PUSH; else goto CommonReturn; } if( Status isnot NO_ERROR ) { if( fPush ) goto PUSH; else goto CommonReturn; } } //Push Partner PUSH: if( fPush ) { Status = RegOpenKeyEx(hServer, PUSHROOT, 0, KEY_ALL_ACCESS, &hPartner); if (Status is ERROR_FILE_NOT_FOUND) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); goto CommonReturn; } if( Status isnot NO_ERROR ) goto ErrorReturn; dwIpLen = (MAX_IP_STRING_LEN + 1); if( wcslen(wcServerIpAdd) < 3 )//not a valid Ip, delete all partners { while( TRUE ) { Status = RegEnumKeyEx(hPartner, 0, wcServerIpAdd, &dwIpLen, NULL, NULL, NULL, NULL); if (Status != ERROR_SUCCESS) break; RegDeleteKey(hPartner, wcServerIpAdd); dwIpLen = (MAX_IP_STRING_LEN + 1)*sizeof(WCHAR); } } else { RegDeleteKey(hPartner, wcServerIpAdd); } if( Status is ERROR_NO_MORE_ITEMS ) { Status = NO_ERROR; } if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, EMSG_INVALID_PARTNER_NAME); goto ErrorReturn; } if( Status isnot NO_ERROR ) goto ErrorReturn; if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } } } if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); else goto ErrorReturn; CommonReturn: if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_DELETE_PARTNER, Status); goto CommonReturn; } DWORD HandleSrvrDeleteRecords( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Delete or Tombstone records from a WINS server based on the version Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Minimum and Maximum version numbers( range of version ) to be deleted/tombstoned Optional : Operation - tombstone(default) or delete Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount = 0; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_MINVER, TRUE, FALSE}, {WINS_TOKEN_MAXVER, TRUE, FALSE}, {WINS_TOKEN_OP, FALSE, FALSE}, }; BOOL fDelete = TRUE; WINSINTF_VERS_NO_T MinVer, MaxVer; WINSINTF_ADD_T WinsAdd; LPWSTR pwszTemp = NULL; //Needs at least both Min Ver and Max ver if( dwArgCount < dwCurrentIndex + 2 ) { DisplayMessage(g_hModule, HLP_SRVR_DELETE_RECORDS_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } //Start processing the arguments based on ppwcArguments, dwCurrentIndex and dwArgCount dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) { goto ErrorReturn; } Status = RegOpenKeyEx(hServer, PARTNERROOT, 0, KEY_ALL_ACCESS, &hPartner); if( Status isnot NO_ERROR ) { goto ErrorReturn; } if (!CheckValidPgOp(hPartner, fGrata)) { DisplayMessage(g_hModule, fGrata ? EMSG_SRVR_PG_INVALIDOP : EMSG_SRVR_PNG_INVALIDOP); Status = ERROR_INVALID_PARAMETER; goto CommonReturn; } Status = RegQueryValueEx(hPartner, fGrata ? PGSERVER : PNGSERVER, NULL, &dwType, NULL, &dwSize); if( Status isnot NO_ERROR && Status isnot ERROR_FILE_NOT_FOUND) goto ErrorReturn; if( dwSize < 7 ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); goto CommonReturn; } pbData = WinsAllocateMemory(dwSize); if( pbData is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = RegQueryValueEx(hPartner, fGrata ? PGSERVER : PNGSERVER, NULL, &dwType, pbData, &dwSize); if( Status isnot NO_ERROR ) goto ErrorReturn; pwszPng = (LPWSTR)pbData; for( i=0; i<(dwSize+2)/sizeof(WCHAR); i++ ) { if( pwszPng[i] is L'\0' and pwszPng[i+1] isnot L'\0') { pwszPng[i] = L','; i++; } } dwPngIp = 0; dwCount = 0; pTemp = wcstok(pwszPng, L","); while((pTemp isnot NULL) && (dwLenCount+sizeof(WCHAR)*7 dwCurrentIndex ) { dwNumArgs = dwArgCount - dwCurrentIndex; pdwNumTags = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwNumTags is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } pdwTypeTags = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTypeTags is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTypeTags, pdwNumTags); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) pwszTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pwszTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) { goto ErrorReturn; } Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_ALL_ACCESS, &hParameter); if( Status isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; goto ErrorReturn; } Status = RegQueryValueEx(hParameter, WINSCNF_BACKUP_DIR_PATH_NM, 0, &dwType, (LPBYTE)wcTempSrc, &dwTempLen); RegCloseKey(hParameter); hParameter = NULL; RegCloseKey(hServer); hServer = NULL; if( Status is ERROR_FILE_NOT_FOUND or wcslen(wcTempSrc) is 0 ) { DisplayMessage(g_hModule, EMSG_SRVR_NOBACKUP_PATH); Status = ERROR_INVALID_PARAMETER; goto CommonReturn; } if( Status isnot NO_ERROR ) { goto ErrorReturn; } dwTempLen = ExpandEnvironmentStrings(wcTempSrc, wcTempDst, 1024); if( dwTempLen is 0 ) { goto ErrorReturn; } pszTempPath = WinsUnicodeToOem(wcTempDst, NULL); if( pszTempPath is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTempLen = MAX(dwTempLen, strlen(pszTempPath)); pszBackupPath = WinsAllocateMemory(dwTempLen+1); if( pszBackupPath is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } strcpy(pszBackupPath, pszTempPath); WinsFreeMemory(pszTempPath); pszTempPath = NULL; } if( pszBackupPath[strlen(pszBackupPath) - 1] is '\\' ) { pszBackupPath[strlen(pszBackupPath) - 1] = '\0'; } Status = WinsBackup(g_hBind, (LPBYTE)pszBackupPath, (short)fIncremental); if( Status isnot NO_ERROR ) goto ErrorReturn; CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( pdwTypeTags ) { WinsFreeMemory(pdwTypeTags); pdwTypeTags = NULL; } if( pdwNumTags ) { WinsFreeMemory(pdwNumTags); pdwNumTags = NULL; } if( pszBackupPath ) { WinsFreeMemory(pszBackupPath); pszBackupPath = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_INIT_BACKUP, Status); goto CommonReturn; } DWORD HandleSrvrInitImport( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Initiates import of records from LMHOSTS file. Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Lmhosts file name. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_FILE, TRUE, FALSE}, }; PDWORD pdwTagType = NULL, pdwTagNum = NULL; LPWSTR pwszFileName = NULL; WCHAR wcTemp[2042] = {L'\0'}; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_INIT_IMPORT_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 and _wcsnicmp(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], L"\\\\", 2) is 0 ) k = 2; lpHostEnt = gethostbyname(WinsUnicodeToAnsi(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k, NULL)); if( lpHostEnt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTER_NAME, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4); for( l=0;l<4; l++) { _itoa((int)pbAdd[l], szAdd, 10); memcpy(cAddr+nLen, szAdd, strlen(szAdd)); nLen += strlen(szAdd); *(cAddr+nLen) = '.'; nLen++; } *(cAddr+nLen-1) = '\0'; WinsAdd.IPAdd = WinsDottedStringToIpAddress(cAddr); } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } for( j=0; j 2 and _wcsnicmp(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], L"\\\\", 2) is 0 ) k = 2; lpHostEnt = gethostbyname(WinsUnicodeToAnsi(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k, NULL)); if( lpHostEnt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTER_NAME, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4); for( l=0;l<4; l++) { _itoa((int)pbAdd[l], szAdd, 10); memcpy(cAddr+nLen, szAdd, strlen(szAdd)); nLen += strlen(szAdd); *(cAddr+nLen) = '.'; nLen++; } *(cAddr+nLen-1) = '\0'; WinsAdd.IPAdd = WinsDottedStringToIpAddress(cAddr); } break; } case 1: { DWORD dwVal = 0; if( ( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) or ( wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) > 1 ) ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( ppwcArguments[dwCurrentIndex+pdwTagNum[j]][0] is L'1' ) dwChoice = WINSINTF_E_PUSH_PROP; else if( ppwcArguments[dwCurrentIndex+pdwTagNum[j]][0] is L'0' ) dwChoice = WINSINTF_E_PUSH; else { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } for( j=0; j 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) { goto ErrorReturn; } Status = RegOpenKeyEx(hServer, PULLROOT, 0, KEY_ALL_ACCESS, &hPullRoot); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegQueryInfoKey(hPullRoot, NULL, NULL, NULL, &dwPullKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PUSHROOT, 0, KEY_ALL_ACCESS, &hPushRoot); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegQueryInfoKey(hPushRoot, NULL, NULL, NULL, &dwPushKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; DisplayMessage(g_hModule, MSG_WINS_TIME_WARNING); WinsAdd.Len = 4; WinsAdd.Type = 0; if( dwPullKeys is 0 ) { DisplayMessage(g_hModule, EMSG_WINS_NO_PULLPARTNER); } if( dwPushKeys is 0 ) { DisplayMessage(g_hModule, EMSG_WINS_NO_PUSHPARTNER); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); for( dw=0; dw MAX_PATH - 1 ) ? MAX_PATH - 1 : dw ); WinsFreeMemory(pszTempPath); pszTempPath = NULL; break; } case 1: { DWORD eVer = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwNumTags[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } eVer = STRTOUL(ppwcArguments[dwCurrentIndex+pdwNumTags[j]], NULL, 0); if( eVer > DbVersionMin && eVer < DbVersionMax ) eVersion = eVer; else { Status = ERROR_INVALID_DB_VERSION; goto ErrorReturn; } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } //To restore the database, first stop WINS Service, Cleanup earlier dabase //do DB restore and then restart WINS { //Unbind WINS WinsUnbind(&g_BindData, g_hBind); g_hBind = NULL; //Reset Backup on Termination flag { HKEY hServer = NULL, hParameter = NULL; LPWSTR pTemp = NULL; DWORD dwSize = sizeof(DWORD); DWORD dwType = REG_DWORD; DWORD dwData = 0; if( wcslen(g_ServerNetBiosName) > 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto EXIT; Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_ALL_ACCESS, &hParameter); if( Status isnot NO_ERROR ) goto EXIT; Status = RegQueryValueEx(hParameter, WINSCNF_DO_BACKUP_ON_TERM_NM, NULL, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { if( dwData is 1 ) { DWORD dw = 0; Status = RegSetValueEx(hParameter, WINSCNF_DO_BACKUP_ON_TERM_NM, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); if( Status is NO_ERROR ) fBackupOnTerm = TRUE; } else { fBackupOnTerm = FALSE; } } EXIT: if( Status isnot NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_RESTORE_IMPROPER); } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } Status = NO_ERROR; } //Stop WINS Service Status = ControlWINSService(TRUE); if( Status isnot NO_ERROR ) { if( Status isnot ERROR_SERVICE_NOT_ACTIVE ) { g_BindData = wbdBindData; g_hBind = WinsBind(&g_BindData); goto ErrorReturn; } else { dwService = ERROR_SERVICE_NOT_ACTIVE; Status = NO_ERROR; } } //Now try restoring the database Status1 = WinsRestore((LPBYTE)szRestorePath); if( Status1 isnot NO_ERROR ) { DisplayErrorMessage(EMSG_SRVR_INIT_RESTORE, Status1); } if( dwService isnot ERROR_SERVICE_NOT_ACTIVE ) Status = ControlWINSService(FALSE); } if( Status isnot NO_ERROR ) goto ErrorReturn; if( Status1 isnot NO_ERROR ) { Status = Status1; goto ErrorReturn; } DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: g_BindData = wbdBindData; g_hBind = WinsBind(&g_BindData); //Reset the DoBackUpOnTerm value if( fBackupOnTerm is TRUE ) { HKEY hServer = NULL, hParameter = NULL; LPWSTR pTemp = NULL; DWORD dwErr = NO_ERROR; if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } dwErr = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( dwErr isnot NO_ERROR ) { DisplayErrorMessage(EMSG_WINS_REGCONNECT_FAILED, dwErr); } else { dwErr = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_ALL_ACCESS, &hParameter); if( dwErr isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; DisplayErrorMessage(EMSG_WINS_REGOPEN_FAILED, dwErr); } else { DWORD dw = 1; dwErr = RegSetValueEx(hParameter, WINSCNF_DO_BACKUP_ON_TERM_NM, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); if( dwErr isnot NO_ERROR ) { DisplayErrorMessage(EMSG_WINS_REGSETVAL_FAILED, dwErr); } RegCloseKey(hParameter); hParameter = NULL; RegCloseKey(hServer); hServer = NULL; } } } if( pdwTypeTags ) { WinsFreeMemory(pdwTypeTags); pdwTypeTags = NULL; } if( pdwNumTags ) { WinsFreeMemory(pdwNumTags); pdwNumTags = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_INIT_RESTORE, Status); goto CommonReturn; } DWORD HandleSrvrInitScavenge( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Initiates scavenging of database for the server Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; struct in_addr InAddr; BOOL fIpAddress = TRUE; DWORD j = 0; WCHAR wcName[256] = {L'\0'}; DWORD dwLen = 0; WINSINTF_ADD_T WinsAdd; WINSINTF_RESULTS_T Results; WINSINTF_VERS_NO_T MaxVer, MinVer; WINSINTF_RECS_T Recs; PWINSINTF_RECORD_ACTION_T pRow = NULL; Status = WinsDoScavenging( g_hBind ); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } else { DisplayErrorMessage(EMSG_SRVR_INIT_SCAVENGE, Status); } return Status; } DWORD HandleSrvrInitSearch( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Search WINS database based on Name, 16th char, case and optionally stores the result to a file, Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Name to search for Optional : 16th char, case sensitive or not and if the result to be stored in a file, then the file Name. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, k, dwNumArgs, dwTagCount; TAG_TYPE pttTags[]={ {WINS_TOKEN_NAME, TRUE, FALSE}, {WINS_TOKEN_ENDCHAR, FALSE, FALSE}, {WINS_TOKEN_CASE, FALSE, FALSE}, {WINS_TOKEN_FILE, FALSE, FALSE}, }; PDWORD pdwTagType = NULL, pdwTagNum = NULL; CHAR chEndChar = (CHAR)0x00; BOOL fEndChar = FALSE; WCHAR wcName[256+1] = {L'\0'}; WCHAR wcFile[MAX_PATH] = {L'\0'}; BOOL fFile = FALSE; DWORD dwLen = 0; BOOL fIpAddress = TRUE; BOOL fMatch = FALSE; BOOL fCase = FALSE; BOOL fNew = TRUE; struct in_addr InAddr; LPSTR pszName = NULL; WINSINTF_ADD_T WinsAdd; WINSINTF_RESULTS_T Results = {0}; WINSINTF_RESULTS_NEW_T ResultsN = {0}; WINSINTF_VERS_NO_T MaxVer, MinVer; WINSINTF_RECS_T Recs; PWINSINTF_RECORD_ACTION_T pRow = NULL; i = j = k = dwNumArgs = dwTagCount = 0; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_INIT_SEARCH_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } for( k=0; k= L'a' and towlower(wc) <= L'z' ) { if( towlower(wc) > L'f' ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } chEndChar = StringToHexA(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); break; } case 2: { DWORD dw = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 10); if( dw is 0 ) { fCase = FALSE; break; } if( dw is 1 ) { fCase = TRUE; break; } else { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } case 3: { DWORD dwLen = wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); if( dwLen is 0 ) { wcscpy(wcFile, L"wins.rec"); fFile = TRUE; break; } wcscpy(wcFile, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); fFile = TRUE; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } pszName = WinsUnicodeToOem(wcName, NULL); if( pszName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwLen = strlen(pszName); if( dwLen >= 16 ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_NETBIOS_NAME); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( fEndChar ) { LPSTR pTemp = pszName; pszName = WinsAllocateMemory(17); if( pszName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } memcpy(pszName, pTemp, 15); for( i=strlen(pszName); i<16; i++ ) { pszName[i] = ' '; } pszName[15] = chEndChar; pszName[16] = '\0'; WinsFreeMemory(pTemp); pTemp = NULL; dwLen = 16; } ResultsN.WinsStat.NoOfPnrs = 0; ResultsN.WinsStat.pRplPnrs = 0; ResultsN.NoOfWorkerThds = 1; ResultsN.pAddVersMaps = NULL; Status = WinsStatusNew(g_hBind, WINSINTF_E_CONFIG_ALL_MAPS, &ResultsN); if( Status is RPC_S_PROCNUM_OUT_OF_RANGE ) { //Try old API Results.WinsStat.NoOfPnrs = 0; Results.WinsStat.pRplPnrs = 0; Status = WinsStatus(g_hBind, WINSINTF_E_CONFIG_ALL_MAPS, &Results); fNew = FALSE; } if( Status isnot NO_ERROR ) goto ErrorReturn; g_dwSearchCount = 0; g_fHeader = FALSE; if( fNew is FALSE ) { if( Results.NoOfOwners is 0 ) goto CommonReturn; for( j=0; j= ONEDAY ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwInterval = dw; break; } case 2: { DWORD dw = 0; fTTL = TRUE; if( wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) < 1 ) break; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); if( dw > 32 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( dw <= 0 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwTTL = dw; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } } { if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_ALL_ACCESS, &hParameter); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_USE_SELF_FND_PNRS_NM, 0, REG_DWORD, (LPBYTE)&fState, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; if( fInterval ) { Status = RegSetValueEx(hParameter, WINSCNF_MCAST_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwInterval, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fTTL ) { Status = RegSetValueEx(hParameter, WINSCNF_MCAST_TTL_NM, 0, REG_DWORD, (LPBYTE)&dwTTL, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_AUTOPARTNERCONFIG, Status); goto CommonReturn; } DWORD HandleSrvrSetBackuppath( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Sets the backup path for the WINS database Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Backup dir Optional : Enable backup at server shutdown. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_DIR, FALSE, FALSE}, {WINS_TOKEN_ATSHUTDOWN, FALSE, FALSE}, }; LPWSTR pwszDir = L"C:\\\\"; BOOL fDir = FALSE; BOOL fAtShutDown = FALSE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hParameter = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_BACKUPPATH_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) { pwszDir = ppwcArguments[dwCurrentIndex+pdwTagNum[j]]; } else { pwszDir = L""; } fDir = TRUE; break; } case 1: { WCHAR wc = ppwcArguments[dwCurrentIndex+pdwTagNum[j]][0]; if( wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) isnot 1 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( wc is L'0' ) fAtShutDown = FALSE; else if( wc is L'1' ) fAtShutDown = TRUE; else { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegCreateKeyEx(hServer, PARAMETER, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hParameter, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; if( fDir ) { Status = RegSetValueEx(hParameter, WINSCNF_BACKUP_DIR_PATH_NM, 0, REG_EXPAND_SZ, (LPBYTE)pwszDir, (wcslen(pwszDir)+1)*sizeof(WCHAR)); if( Status isnot NO_ERROR ) { goto ErrorReturn; } } Status = RegSetValueEx(hParameter, WINSCNF_DO_BACKUP_ON_TERM_NM, 0, REG_DWORD, (LPBYTE)&fAtShutDown, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_BACKUPPATH, Status); goto CommonReturn; } DWORD HandleSrvrSetDefaultparam( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Sets the default values for all the configuration parameter. This command must be run at least once before running the dump command. Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; HKEY hServer = NULL, hWins = NULL, hParameter = NULL, hDefault = NULL, hDefaultPull = NULL, hDefaultPush = NULL, hPartner = NULL, hCheck = NULL, hPullPart = NULL, hPushPart = NULL; DWORD dwSize = 0, dwType = 0, dwData = 0; LPWSTR pTemp = NULL; if( wcslen(g_ServerNetBiosName) > 2 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) { goto RETURN; } //Open all required Registry key handles Status = RegCreateKeyEx(hServer, PARAMETER, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hParameter, NULL); if( Status isnot NO_ERROR ) goto RETURN; Status = RegCreateKeyEx(hServer, PARTNERROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hPartner, NULL); if( Status isnot NO_ERROR ) goto RETURN; Status = RegCreateKeyEx(hServer, PULLROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hPullPart, NULL); if( Status isnot NO_ERROR ) goto RETURN; Status = RegCreateKeyEx(hServer, PUSHROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hPushPart, NULL); if( Status isnot NO_ERROR ) goto RETURN; Status = RegCreateKeyEx(hServer, DEFAULTPULL, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hDefaultPull, NULL); if( Status isnot NO_ERROR ) goto RETURN; Status = RegCreateKeyEx(hServer, DEFAULTPUSH, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hDefaultPush, NULL); if( Status isnot NO_ERROR ) goto RETURN; //Start setting the default values. Status = RegSetValueEx(hParameter, WINSCNF_BACKUP_DIR_PATH_NM, 0, REG_EXPAND_SZ, (LPBYTE)L"", (wcslen(L"")+1)*sizeof(WCHAR)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0; Status = RegSetValueEx(hParameter, WINSCNF_DO_BACKUP_ON_TERM_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x7e900; Status = RegSetValueEx(hParameter, WINSCNF_REFRESH_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x54600; Status = RegSetValueEx(hParameter, WINSCNF_TOMBSTONE_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x7e900; Status = RegSetValueEx(hParameter, WINSCNF_TOMBSTONE_TMOUT_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x1fa400; Status = RegSetValueEx(hParameter, WINSCNF_VERIFY_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 1; Status = RegSetValueEx(hParameter, WINSCNF_BURST_HANDLING_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x1f4; Status = RegSetValueEx(hParameter, WINSCNF_BURST_QUE_SIZE_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0; Status = RegSetValueEx(hParameter, WINSCNF_LOG_DETAILED_EVTS_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 1; Status = RegSetValueEx(hParameter, WINSCNF_LOG_FLAG_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; Status = RegSetValueEx(hParameter, WINSCNF_LOG_FILE_PATH_NM, 0, REG_EXPAND_SZ, (LPBYTE)L"%windir%\\system32\\wins", (wcslen(L"%windir%\\system32\\wins")+1)*sizeof(WCHAR)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0; Status = RegSetValueEx(hParameter, WINSCNF_USE_SELF_FND_PNRS_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0; Status = RegSetValueEx(hParameter, WINSCNF_MIGRATION_ON_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x1; Status = RegSetValueEx(hParameter, WINSCNF_RPL_ONLY_W_CNF_PNRS_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; Status = RegSetValueEx(hParameter, WINSCNF_DB_FILE_NM, 0, REG_EXPAND_SZ, (LPBYTE)L"%windir%\\system32\\wins\\wins.mdb", (wcslen(L"%windir%\\system32\\wins\\wins.mdb")+1)*sizeof(WCHAR)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 2; Status = RegSetValueEx(hParameter, WINSCNF_MCAST_TTL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x960; Status = RegSetValueEx(hParameter, WINSCNF_MCAST_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0; Status = RegSetValueEx(hParameter, WINSCNF_INIT_VERSNO_VAL_HW_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0; Status = RegSetValueEx(hParameter, WINSCNF_INIT_VERSNO_VAL_LW_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x708; Status = RegSetValueEx(hDefaultPull, WINSCNF_RPL_INTERVAL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0; Status = RegSetValueEx(hDefaultPush, WINSCNF_UPDATE_COUNT_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x3; Status = RegSetValueEx(hPullPart, WINSCNF_RETRY_COUNT_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x1; Status = RegSetValueEx(hPullPart, WINSCNF_INIT_TIME_RPL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x1; Status = RegSetValueEx(hPullPart, WINSCNF_PRS_CONN_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x0; Status = RegSetValueEx(hPushPart, WINSCNF_INIT_TIME_RPL_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x1; Status = RegSetValueEx(hPushPart, WINSCNF_PRS_CONN_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; dwData = 0x0; Status = RegSetValueEx(hPushPart, WINSCNF_ADDCHG_TRIGGER_NM, 0, REG_DWORD, (LPBYTE)&dwData, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto RETURN; DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); RETURN: if( Status isnot NO_ERROR ) DisplayErrorMessage(EMSG_SRVR_SET_DEFAULTPARAM, Status); if( hPushPart ) { RegCloseKey(hPushPart); hPushPart = NULL; } if( hPullPart ) { RegCloseKey(hPullPart); hPullPart = NULL; } if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } if( hCheck ) { RegCloseKey(hCheck); hCheck = NULL; } if( hDefaultPull ) { RegCloseKey(hDefaultPull); hDefaultPull = NULL; } if( hDefaultPush ) { RegCloseKey(hDefaultPush); hDefaultPush = NULL; } if( hDefault ) { RegCloseKey(hDefault); hDefault = NULL; } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hWins ) { RegCloseKey(hWins); hWins = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } return Status; } DWORD HandleSrvrSetMigrateflag( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the migrate on/off flag Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Set or disable Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, }; BOOL fMigrate = FALSE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hParameter = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_MIGRATEFLAG_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegCreateKeyEx(hServer, PARAMETER, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hParameter, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_MIGRATION_ON_NM, 0, REG_DWORD, (LPBYTE)&fMigrate, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_MIGRATEFLAG, Status); goto CommonReturn; } DWORD HandleSrvrSetNamerecord( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the name record parameters for the server. Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Optional : Renew, extinction interval, extinction timeout and verification values. Note : All parameters are optional. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_RENEW, FALSE, FALSE}, {WINS_TOKEN_EXTINCTION, FALSE, FALSE}, {WINS_TOKEN_EXTIMEOUT, FALSE, FALSE}, {WINS_TOKEN_VERIFICATION, FALSE, FALSE}, }; DWORD dwRenew = SIX_DAYS, dwExtinction = SIX_DAYS, dwExTimeOut = SIX_DAYS, dwVerify = WINSCNF_MIN_VERIFY_INTERVAL; BOOL fRenew = FALSE, fExtinction = FALSE, fExTimeOut = FALSE, fVerify = FALSE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hParameter = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); return NO_ERROR; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegCreateKeyEx(hServer, PARAMETER, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hParameter, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; //First retrieve the older values for all the parameters Status = RegQueryValueEx(hParameter, WINSCNF_REFRESH_INTVL_NM, NULL, &dwType, (LPBYTE)&dwValue, &dwSize); if( Status is NO_ERROR ) { if( fRenew is FALSE ) { dwRenew = dwValue; } } dwSize = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_TOMBSTONE_INTVL_NM, NULL, &dwType, (LPBYTE)&dwValue, &dwSize); if( Status is NO_ERROR ) { if( fExtinction is FALSE ) dwExtinction = dwValue; } dwSize = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_TOMBSTONE_TMOUT_NM, NULL, &dwType, (LPBYTE)&dwValue, &dwSize); if( Status is NO_ERROR ) { if( fExTimeOut is FALSE ) dwExTimeOut = dwValue; } dwSize = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_VERIFY_INTVL_NM, NULL, &dwType, (LPBYTE)&dwValue, &dwSize); if( Status is NO_ERROR ) { if( fVerify is FALSE ) dwVerify = dwValue; } //Check the validity and range of values { if( dwRenew < WINSCNF_MIN_REFRESH_INTERVAL ) { DisplayMessage(g_hModule, EMSG_SRVR_RENEW_INTERVAL); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( dwRenew > ONE_YEAR ) { dwRenew = ONE_YEAR; } if( dwExTimeOut < WINSCNF_MIN_TOMBSTONE_TIMEOUT ) { DisplayMessage(g_hModule, EMSG_SRVR_TOMBSTONE_TIMEOUT, WINSCNF_MIN_TOMBSTONE_TIMEOUT); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( dwExTimeOut > ONE_YEAR ) { dwExTimeOut = ONE_YEAR; } if( dwExTimeOut < dwRenew ) { DisplayMessage(g_hModule, EMSG_SRVR_TOMBSTONE_TIMEOUT, dwRenew); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( dwExtinction < WINSCNF_MAKE_TOMB_INTVL_0_M(dwRenew) ) { DisplayMessage(g_hModule, EMSG_SRVR_TOMBSTONE_INTERVAL, WINSCNF_MAKE_TOMB_INTVL_0_M(dwRenew) ); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( dwVerify < WINSCNF_MAKE_VERIFY_INTVL_M(dwExtinction) ) { if( WINSCNF_MAKE_VERIFY_INTVL_M(dwExtinction) == TWENTY_FOUR_DAYS ) { DisplayMessage(g_hModule, EMSG_SRVR_VERIFY_INTERVAL, TOMB_MULTIPLIER_FOR_VERIFY, WINSCNF_MAKE_VERIFY_INTVL_M(dwExtinction)); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } Status = RegSetValueEx(hParameter, WINSCNF_REFRESH_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwRenew, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_TOMBSTONE_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwExtinction, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_TOMBSTONE_TMOUT_NM, 0, REG_DWORD, (LPBYTE)&dwExTimeOut, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_VERIFY_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwVerify, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } CommonReturn: if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_NAMERECORD, Status); goto CommonReturn; } DWORD HandleSrvrSetPeriodicdbchecking( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the periodic database checking parameters for the server Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : State Optional : Maximum record count, and other parameters. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, {WINS_TOKEN_MAXRECORDCOUNT, FALSE, FALSE}, {WINS_TOKEN_CHECKAGAINST, FALSE, FALSE}, {WINS_TOKEN_CHECKEVERY, FALSE, FALSE}, {WINS_TOKEN_START, FALSE, FALSE}, }; DWORD dwMaxRec = WINSCNF_CC_DEF_RECS_AAT, dwEvery = WINSCNF_CC_DEF_INTERVAL, dwStart = WINSCNF_DEF_CC_SP_HR*60*60; BOOL fPartner = WINSCNF_CC_DEF_USE_RPL_PNRS, fIsPartner = FALSE, fMax = FALSE, fEvery = FALSE, fStart = FALSE, fState = TRUE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hCCRoot = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_PERIODICDBCHECKING_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; RegDeleteKey(hServer, CCROOT); } else { if( fMax is TRUE or fEvery is TRUE or fIsPartner is TRUE or fStart is TRUE ) { if( wcslen(g_ServerNetBiosName) > 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegCreateKeyEx(hServer, CCROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hCCRoot, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; if( fMax ) { Status = RegSetValueEx(hCCRoot, WINSCNF_CC_MAX_RECS_AAT_NM, 0, REG_DWORD, (LPBYTE)&dwMaxRec, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fIsPartner ) { Status = RegSetValueEx(hCCRoot, WINSCNF_CC_USE_RPL_PNRS_NM, 0, REG_DWORD, (LPBYTE)&fPartner, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fEvery ) { Status = RegSetValueEx(hCCRoot, WINSCNF_CC_INTVL_NM, 0, REG_DWORD, (LPBYTE)&dwEvery, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fStart ) { LPWSTR pwszTime = MakeTimeString(dwStart); if( pwszTime is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = RegSetValueEx(hCCRoot, WINSCNF_SP_TIME_NM, 0, REG_SZ, (LPBYTE)pwszTime, (wcslen(pwszTime)+1)*sizeof(WCHAR)); WinsFreeMemory(pwszTime); pwszTime = NULL; if( Status isnot NO_ERROR ) goto ErrorReturn; } } } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hCCRoot ) { RegCloseKey(hCCRoot); hCCRoot = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_PERIODICDBCHECKING, Status); if( hServer ) { if( hCCRoot ) { RegCloseKey(hCCRoot); hCCRoot = NULL; } RegDeleteKey(hServer, CCROOT); } goto CommonReturn; } DWORD HandleSrvrSetPullpersistentconnection( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the pull partner configuration parameters Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Server IP and persistence state Optional : Start value and Time interval Note : All parameters are optional. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, {WINS_TOKEN_SERVER, TRUE, FALSE}, {WINS_TOKEN_START, FALSE, FALSE}, {WINS_TOKEN_INTERVAL, FALSE, FALSE}, }; DWORD dwStart = 0, dwInterval = 1800; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN + 1] = {L'\0'}; BOOL fState = TRUE, fStart = FALSE, fInterval = FALSE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hPullRoot = NULL, hPullServer = NULL; if( dwArgCount < dwCurrentIndex + 2 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_PULLPERSISTENTCONNECTION_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 and _wcsnicmp(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], L"\\\\", 2) is 0 ) k = 2; lpHostEnt = gethostbyname(WinsUnicodeToAnsi(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k, NULL)); if( lpHostEnt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTER_NAME, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4); for( l=0; l<4; l++) { _itoa((int)pbAdd[l], szAdd, 10); memcpy(cAddr+nLen, szAdd, strlen(szAdd)); nLen += strlen(szAdd); *(cAddr+nLen) = '.'; nLen++; } *(cAddr+nLen-1) = '\0'; WinsAnsiToUnicode(cAddr, wcServerIpAdd); break; } case 2: { DWORD dw = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); dwStart = dw; fStart = TRUE; break; } case 3: { DWORD dw = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); dwInterval = dw; fInterval = TRUE; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } { DWORD dwDisposition = 0; if( wcslen(g_ServerNetBiosName) > 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PULLROOT, 0, KEY_ALL_ACCESS, &hPullRoot); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hPullRoot, wcServerIpAdd, 0, KEY_ALL_ACCESS, &hPullServer); if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_PARTNER, wcServerIpAdd); goto CommonReturn; } if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hPullServer, PERSISTENCE, 0, REG_DWORD, (LPBYTE)&fState, sizeof(BOOL)); if( Status isnot NO_ERROR ) { goto ErrorReturn; } if( fInterval ) { Status = RegSetValueEx(hPullServer, WINSCNF_RPL_INTERVAL_NM, 0, REG_DWORD, (LPBYTE)&dwInterval, sizeof(DWORD)); if( Status isnot NO_ERROR ) { goto ErrorReturn; } } if( fStart ) { LPWSTR pwszTime = MakeTimeString(dwStart); if( pwszTime is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = RegSetValueEx(hPullServer, WINSCNF_SP_TIME_NM, 0, REG_SZ, (LPBYTE)pwszTime, (wcslen(pwszTime)+1)*sizeof(WCHAR)); WinsFreeMemory(pwszTime); pwszTime = NULL; if( Status isnot NO_ERROR ) { goto ErrorReturn; } } } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hPullServer ) { RegCloseKey(hPullServer); hPullServer = NULL; } if( hPullRoot ) { RegCloseKey(hPullRoot); hPullRoot = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_PULLPERSISTENTCONNECTION, Status); goto CommonReturn; } DWORD HandleSrvrSetPushpersistentconnection( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the push partner configuration parameters Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Server IP and persistence state Optional : Update count Note : All parameters are optional. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, {WINS_TOKEN_SERVER, TRUE, FALSE}, {WINS_TOKEN_UPDATE,FALSE, FALSE}, }; DWORD dwUpdate = 0; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN + 1] = {L'\0'}; BOOL fState = TRUE, fUpdate = FALSE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hPushRoot = NULL, hPushServer = NULL; if( dwArgCount < dwCurrentIndex + 2 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_PUSHPERSISTENTCONNECTION_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 and _wcsnicmp(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], L"\\\\", 2) is 0 ) k = 2; lpHostEnt = gethostbyname(WinsUnicodeToAnsi(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k, NULL)); if( lpHostEnt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTER_NAME, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4); for( l=0;l<4; l++) { _itoa((int)pbAdd[l], szAdd, 10); memcpy(cAddr+nLen, szAdd, strlen(szAdd)); nLen += strlen(szAdd); *(cAddr+nLen) = '.'; nLen++; } *(cAddr+nLen-1) = '\0'; WinsAnsiToUnicode(cAddr, wcServerIpAdd); break; } case 2: { DWORD dw = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); dwUpdate = dw; fUpdate = TRUE; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } { DWORD dwDisposition = 0; if( wcslen(g_ServerNetBiosName) > 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PUSHROOT, 0, KEY_ALL_ACCESS, &hPushRoot); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hPushRoot, wcServerIpAdd, 0, KEY_ALL_ACCESS, &hPushServer); if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_PARTNER, wcServerIpAdd); goto CommonReturn; } if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hPushServer, PERSISTENCE, 0, REG_DWORD, (LPBYTE)&fState, sizeof(BOOL)); if( Status isnot NO_ERROR ) { goto ErrorReturn; } if( fUpdate ) { Status = RegSetValueEx(hPushServer, WINSCNF_UPDATE_COUNT_NM, 0, REG_DWORD, (LPBYTE)&dwUpdate, sizeof(DWORD)); if( Status isnot NO_ERROR ) { goto ErrorReturn; } } } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hPushServer ) { RegCloseKey(hPushServer); hPushServer = NULL; } if( hPushRoot ) { RegCloseKey(hPushRoot); hPushRoot = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_PUSHPERSISTENTCONNECTION, Status); goto CommonReturn; } DWORD HandleSrvrSetPullparam( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the default pull parameters Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : persistence state Optional : Startup value, Start time and Time interval and retry count Note : All parameters are optional. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, {WINS_TOKEN_STARTUP, FALSE, FALSE}, {WINS_TOKEN_START, FALSE, FALSE}, {WINS_TOKEN_INTERVAL, FALSE, FALSE}, {WINS_TOKEN_RETRY, FALSE, FALSE}, }; DWORD dwStart = 0, dwInterval = 1800, dwRetry = 3; BOOL fStart = FALSE, fStartup = FALSE, fInterval = FALSE, fRetry = FALSE, fState = TRUE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hDefault = NULL, hPullRoot = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_PULLPARAM_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 && dw < 60 ) // 1 minute { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwInterval = dw; fInterval = TRUE; break; } case 4: { DWORD dw = 0; if( IsPureNumeric(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) is FALSE ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dw = STRTOUL(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], NULL, 0); dwRetry = dw; fRetry = TRUE; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } { if( wcslen(g_ServerNetBiosName) > 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegCreateKeyEx(hServer, PULLROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hPullRoot, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hPullRoot, PERSISTENCE, 0, REG_DWORD, (LPBYTE)&fState, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hPullRoot, WINSCNF_INIT_TIME_RPL_NM, 0, REG_DWORD, (LPBYTE)&fStartup, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; if( fRetry ) { Status = RegSetValueEx(hPullRoot, WINSCNF_RETRY_COUNT_NM, 0, REG_DWORD, (LPBYTE)&dwRetry, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fStart is TRUE or fInterval is TRUE ) { Status = RegCreateKeyEx(hServer, DEFAULTPULL, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hDefault, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; if( fStart ) { LPWSTR pwszTime = MakeTimeString(dwStart); if( pwszTime is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = RegSetValueEx(hDefault, WINSCNF_SP_TIME_NM, 0, REG_SZ, (LPBYTE)pwszTime, (wcslen(pwszTime)+1)*sizeof(WCHAR)); WinsFreeMemory(pwszTime); pwszTime = NULL; if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fInterval ) { Status = RegSetValueEx(hDefault, WINSCNF_RPL_INTERVAL_NM, 0, REG_DWORD, (LPBYTE)&dwInterval, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } } } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hPullRoot ) { RegCloseKey(hPullRoot); hPullRoot = NULL; } if( hDefault ) { RegCloseKey(hDefault); hDefault = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_PULLPARAM, Status); goto CommonReturn; } DWORD HandleSrvrSetPushparam( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the default push parameters Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Server IP and persistence state Optional : Start value and Time interval Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, {WINS_TOKEN_STARTUP, FALSE, FALSE}, {WINS_TOKEN_ADDRESSCHANGE, FALSE, FALSE}, {WINS_TOKEN_UPDATE, FALSE, FALSE}, }; DWORD dwUpdate = 3; BOOL fStartup = FALSE, IsStartup = FALSE, fAddressChange = FALSE, IsAddChange = FALSE, fAdd = FALSE, IsAdd = FALSE, fUpdate = FALSE, IsUpdate = FALSE, fState = TRUE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hDefault = NULL, hPushRoot = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_PUSHPARAM_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegCreateKeyEx(hServer, PUSHROOT, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hPushRoot, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hPushRoot, PERSISTENCE, 0, REG_DWORD, (LPBYTE)&fState, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; if( IsStartup ) { Status = RegSetValueEx(hPushRoot, WINSCNF_INIT_TIME_RPL_NM, 0, REG_DWORD, (LPBYTE)&fStartup, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fAdd ) { Status = RegSetValueEx(hPushRoot, WINSCNF_ADDCHG_TRIGGER_NM, 0, REG_DWORD, (LPBYTE)&fAddressChange, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } if( fUpdate is TRUE ) { Status = RegCreateKeyEx(hServer, DEFAULTPUSH, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hDefault, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hDefault, WINSCNF_UPDATE_COUNT_NM, 0, REG_DWORD, (LPBYTE)&dwUpdate, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; } } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hPushRoot ) { RegCloseKey(hPushRoot); hPushRoot = NULL; } if( hDefault ) { RegCloseKey(hDefault); hDefault = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_PUSHPARAM, Status); goto CommonReturn; } DWORD HandleSrvrSetReplicateflag( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the replication flag Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Flag state Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; PDWORD pdwTagType = NULL, pdwTagNum = NULL; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, }; BOOL fReplicate = FALSE; LPWSTR pTemp = NULL; HKEY hServer = NULL, hParameter = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_REPLICATEFLAG_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegCreateKeyEx(hServer, PARAMETER, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hParameter, NULL); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_RPL_ONLY_W_CNF_PNRS_NM, 0, REG_DWORD, (LPBYTE)&fReplicate, sizeof(BOOL)); if( Status isnot NO_ERROR ) goto ErrorReturn; } CommonReturn: if( Status is NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_REPLICATEFLAG, Status); goto CommonReturn; } DWORD HandleSrvrSetLogparam( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the logging parameters Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Optional : Log database change and detail event log options Note : All parameters are optional. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_DBCHANGE, FALSE, FALSE}, {WINS_TOKEN_EVENT, FALSE, FALSE}, }; PDWORD pdwTagType = NULL, pdwTagNum = NULL; BOOL fDbChange = FALSE, IsDbChange = FALSE, fEvent = FALSE, IsEvent = FALSE; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); goto CommonReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( j=0; j 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_ALL_ACCESS, &hParameter); if( Status isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; goto ErrorReturn; } if( IsDbChange ) { Status = RegSetValueEx(hParameter, WINSCNF_LOG_FLAG_NM, 0, dwType, (LPBYTE)&fDbChange, dwSize); if( Status isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; RegCloseKey(hParameter); hParameter = NULL; goto ErrorReturn; } } if( IsEvent ) { Status = RegSetValueEx(hParameter, WINSCNF_LOG_DETAILED_EVTS_NM, 0, dwType, (LPBYTE)&fEvent, dwSize); if( Status isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; RegCloseKey(hParameter); hParameter = NULL; goto ErrorReturn; } } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } } DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_LOGPARAM, Status); goto CommonReturn; } DWORD HandleSrvrSetBurstparam( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set the burst handling parameters Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : To enable or disable burst handling Optional : Burst handling value. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_STATE, TRUE, FALSE}, {WINS_TOKEN_VALUE, FALSE, FALSE}, }; PDWORD pdwTagType = NULL, pdwTagNum = NULL; BOOL fState = FALSE, fValue = FALSE; DWORD dwValue = 0; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_BURSTPARAM_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( j=0; j 5000 ) { DisplayMessage(g_hModule, EMSG_SRVR_BURST_PARAM_OUTOFRANGE); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } fValue = TRUE; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } { HKEY hServer = NULL, hParameter = NULL; LPWSTR pTemp = NULL; DWORD dwType = REG_DWORD, dwSize = sizeof(BOOL); if( wcslen(g_ServerNetBiosName) > 0 ) pTemp = g_ServerNetBiosName; Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_ALL_ACCESS, &hParameter); if( Status isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; goto ErrorReturn; } Status = RegSetValueEx(hParameter, WINSCNF_BURST_HANDLING_NM, 0, dwType, (LPBYTE)&fState, dwSize); if( Status isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; RegCloseKey(hParameter); hParameter = NULL; goto ErrorReturn; } if( fValue ) { dwSize = sizeof(DWORD); Status = RegSetValueEx(hParameter, WINSCNF_BURST_QUE_SIZE_NM, 0, dwType, (LPBYTE)&dwValue, dwSize); if( Status isnot NO_ERROR ) { RegCloseKey(hServer); hServer = NULL; RegCloseKey(hParameter); hParameter = NULL; goto ErrorReturn; } } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } } DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_BURSTPARAM, Status); goto CommonReturn; } DWORD HandleSrvrSetStartversion( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set start value of the version counter Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Version counter value in {high,low} format Return Value: Returns the status of the operation. --*/ { DWORD Status = 0; DWORD i, j, dwTagCount, dwNumArgs; TAG_TYPE pttTags[] = { {WINS_TOKEN_VERSION, TRUE, FALSE}, }; WINSINTF_VERS_NO_T Version={0}; LPWSTR pServer = NULL; PDWORD pdwTagNum = NULL, pdwTagType = NULL; HKEY hServer = NULL, hParameter = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_STARTVERSION_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( j=0; j 0 ) pServer = g_ServerNetBiosName; Status = RegConnectRegistry(pServer, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_ALL_ACCESS, &hParameter); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_INIT_VERSNO_VAL_HW_NM, 0, REG_DWORD, (LPBYTE)&Version.HighPart, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegSetValueEx(hParameter, WINSCNF_INIT_VERSNO_VAL_LW_NM, 0, REG_DWORD, (LPBYTE)&Version.LowPart, sizeof(DWORD)); if( Status isnot NO_ERROR ) goto ErrorReturn; DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_STARTVERSION, Status); goto CommonReturn; } DWORD HandleSrvrSetPersMode( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Set Persona Grata/Non-Grata mode Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Grat|Non-Grata Return Value: Returns the status of the operation. --*/ { DWORD Status = 0; DWORD dwTagCount; DWORD dwPersMode; PDWORD pdwTagNum = NULL; PDWORD pdwTagType = NULL; TAG_TYPE pttTags[] = {{WINS_TOKEN_MODE, TRUE, FALSE},}; LPWSTR lpwszMode; LPWSTR pTemp; HKEY hServer, hPartner; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SET_PGMODE_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } pdwTagType = WinsAllocateMemory((dwArgCount - dwCurrentIndex)*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory((dwArgCount - dwCurrentIndex)*sizeof(DWORD)); if( pdwTagType is NULL || pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; lpwszMode = ppwcArguments[dwCurrentIndex+pdwTagNum[0]]; if (wcslen(lpwszMode) == 1 && (lpwszMode[0] == L'0' || lpwszMode[0] == L'1')) { // set the value for 'persona grata mode' dwPersMode = lpwszMode[0] == L'0' ? PERSMODE_NON_GRATA : PERSMODE_GRATA; } else { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARTNERROOT, 0, KEY_ALL_ACCESS, &hPartner); if (Status isnot NO_ERROR) goto ErrorReturn; Status = RegSetValueExA( hPartner, WINSCNF_PERSONA_MODE_NM, 0, REG_DWORD, (LPVOID)&dwPersMode, sizeof(DWORD)); DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SET_PGMODE, Status); goto CommonReturn; } DWORD HandleSrvrShowDatabase( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays wins database based on (optionally)different filtering conditions Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Server ip whose database to be displayed Optional : Different conditions Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; WINSINTF_ADD_T WinsAdd = {0}; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVERS, TRUE, FALSE}, {WINS_TOKEN_RECORDTYPE, FALSE, FALSE}, {WINS_TOKEN_RECCOUNT, FALSE, FALSE}, {WINS_TOKEN_START, FALSE, FALSE}, {WINS_TOKEN_ENDCHAR, FALSE, FALSE}, {WINS_TOKEN_FILE, FALSE, FALSE}, }; PDWORD pdwTagType = NULL, pdwTagNum = NULL, pdwIp = NULL; WCHAR wcFilter = L'\0'; CHAR chFilter = 0x00; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN+1]={L'\0'}; WCHAR wcFile[MAX_PATH] = {L'\0'}; DWORD i, j, dwNumArgs, dwTagCount; DWORD dwStart = WINSINTF_BEGINNING; DWORD NoOfRecsDesired = (DWORD)~0; DWORD TypeOfRec, dwIpCount = 0, dwRecCount = 0, dwTotal = 0, dw=0; WINSINTF_RECS_T Recs = {0}; PWINSINTF_RECORD_ACTION_T pRow = NULL; BOOL fFilter = FALSE, fFile = FALSE; BOOL fAll = FALSE, fHeader = FALSE, fError = FALSE, fOnce = FALSE, fNew = TRUE; WINSINTF_RESULTS_T Results = {0}; WINSINTF_RESULTS_NEW_T ResultsN = {0}; FILE *pFile = NULL; BOOL fOpenFile = FALSE; WCHAR wszFilter[3] = {L'\0'}; LPWSTR pwszTemp = NULL; LPWSTR pwszTime = NULL; NoOfRecsDesired = (DWORD)~0; TypeOfRec = WINSINTF_BOTH; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SHOW_DATABASE_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } { dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } for( k=0; k L'f' ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } chFilter = StringToHexA(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); wcsncpy(wszFilter, ppwcArguments[dwCurrentIndex+pdwTagNum[j]], 2); fFilter = TRUE; break; } case 5: { DWORD dwLen = wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); if( dwLen is 0 or dwLen > MAX_PATH ) { wcscpy(wcFile, L"wins.rec"); fFile = TRUE; break; } wcscpy(wcFile, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); fFile = TRUE; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } } if( fAll ) { ResultsN.WinsStat.NoOfPnrs = 0; ResultsN.WinsStat.pRplPnrs = 0; ResultsN.NoOfWorkerThds = 1; ResultsN.pAddVersMaps = NULL; Status = WinsStatusNew(g_hBind, WINSINTF_E_CONFIG_ALL_MAPS, &ResultsN); if( Status is RPC_S_PROCNUM_OUT_OF_RANGE ) { //Try old API Results.WinsStat.NoOfPnrs = 0; Results.WinsStat.pRplPnrs = 0; Status = WinsStatus(g_hBind, WINSINTF_E_CONFIG_ALL_MAPS, &Results); fNew = FALSE; } if( Status isnot NO_ERROR ) goto ErrorReturn; if( fNew ) { dwIpCount = ResultsN.NoOfOwners; } else { dwIpCount = Results.NoOfOwners; } } if( fFile is TRUE ) { pFile = _wfopen(wcFile, L"a+"); if( pFile is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_FILEOPEN_FAILED, wcFile); fOpenFile = FALSE; } else { fOpenFile = TRUE; } } for( dw=0; dw 500 ) ? 500 : (NoOfRecsDesired - dwTotal); if( Recs.pRow ) { WinsFreeMem(Recs.pRow); Recs.pRow = NULL; } memset( &Recs, 0x00, sizeof(WINSINTF_RECS_T)); Status = WinsGetDbRecsByName(g_hBind, &WinsAdd, dwStart, fOnce ? pszLastName: NULL, dwLastNameLen, dwDesired, TypeOfRec, &Recs); if( Status isnot NO_ERROR ) { if( fOnce is FALSE ) { DisplayMessage(g_hModule, EMSG_SRVR_RETRIEVEDB_FAILED, IpAddressToString(WinsAdd.IPAdd)); DisplayErrorMessage(EMSG_SRVR_ERROR_MESSAGE, Status); fError = TRUE; } else if ( Status isnot ERROR_REC_NON_EXISTENT ) { DisplayMessage(g_hModule, EMSG_SRVR_RETRIEVEDB_FAILED, IpAddressToString(WinsAdd.IPAdd)); DisplayErrorMessage(EMSG_SRVR_ERROR_MESSAGE, Status); fError = TRUE; } Status = NO_ERROR; break; } fOnce = TRUE; dwTotal += Recs.NoOfRecs; if( dwDesired > Recs.NoOfRecs ) { fDone = TRUE; } pRow = Recs.pRow; if( Recs.NoOfRecs is 0 ) { DisplayMessage(g_hModule, MSG_WINS_NO_RECORDS); } else { WCHAR Name[21] = {L'\0'}; WCHAR Type[2] = {L'\0'}; WCHAR State[2] = {L'\0'}; WCHAR Version[9] = {L'\0'}; WCHAR Group[2] = {L'\0'}; WCHAR IPAdd[MAX_IP_STRING_LEN+1] = {L'\0'}; WCHAR Buffer[16] = {L'\0'}; DWORD dwState = WINS_STATE_ACTIVE; DWORD dwType = WINS_TYPE_STATIC; DWORD dwGroup = WINS_GROUP_UNIQUE; DWORD dwTempLen = 0; struct tm* time = NULL; int iType = 1; for( j=0; jpName)+2); if(pszLastName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } memset(pszLastName, 0x00, strlen(pRow->pName)+2); strcpy(pszLastName, pRow->pName); //1B records detected at the boundary, swap 1st and //16th char if( pszLastName[15] == 0x1B ) { CHAR ch = pszLastName[15]; pszLastName[15] = pszLastName[0]; pszLastName[0] = ch; } strcat(pszLastName, "\x01"); dwLastNameLen = pRow->NameLen+1; } if( pRow->NameLen > 16 ) i = 15; else i = pRow->NameLen; chEndChar = pRow->pName[i]; pRow->pName[i] = (CHAR)0x20; //pRow->pName[16] = '\0'; if( fFilter is TRUE ) { if( chFilter isnot chEndChar ) { pRow++; continue; } } pwszTemp = WinsOemToUnicode(pRow->pName, NULL); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTempLen = wcslen(pwszTemp); dwTempLen = (dwTempLen>16) ? 16 : dwTempLen; wcsncpy(Name, pwszTemp, dwTempLen); WinsFreeMemory(pwszTemp); pwszTemp = NULL; for( i=dwTempLen; i<16; i++ ) Name[i] = L' '; Name[15] = L'['; i=0; WinsHexToString(Name+16, (LPBYTE)&chEndChar, 1); Name[18] = L'h'; Name[19] = L']'; Name[20] = L'\0'; if( pRow->fStatic ) { wcscpy(Type, L"S"); pwszType = L"STATIC "; dwType = WINS_TYPE_STATIC; } else { wcscpy(Type, L"D"); pwszType = L"DYNAMIC"; dwType = WINS_TYPE_DYNAMIC; } if( pRow->State_e is WINSINTF_E_ACTIVE ) { wcscpy(State, L"A"); pwszState = L"ACTIVE "; dwState = WINS_STATE_ACTIVE; } else if( pRow->State_e is WINSINTF_E_RELEASED ) { wcscpy(State, L"R"); pwszState = L"RELEASED "; dwState = WINS_STATE_RELEASED; } else { wcscpy(State, L"T"); pwszState = L"TOMBSTONE"; dwState = WINS_STATE_TOMBSTONE; } if( pRow->TypOfRec_e is WINSINTF_E_UNIQUE ) { wcscpy(Group,L"U"); pwszGroup = L"UNIQUE "; dwGroup = WINS_GROUP_UNIQUE; } else if( pRow->TypOfRec_e is WINSINTF_E_NORM_GROUP ) { wcscpy(Group,L"N"); pwszGroup = L"GROUP "; dwGroup = WINS_GROUP_GROUP; } else if( pRow->TypOfRec_e is WINSINTF_E_SPEC_GROUP ) { if( pRow->pName[15] is 0x1C ) { wcscpy(Group, L"D"); pwszGroup = L"DOMAIN NAME "; dwGroup = WINS_GROUP_DOMAIN; } else { wcscpy(Group,L"I"); pwszGroup = L"INTERNET GROUP"; dwGroup = WINS_GROUP_INTERNET; } } else { wcscpy(Group,L"M"); pwszGroup = L"MULTIHOMED "; dwGroup = WINS_GROUP_MULTIHOMED; } dwStatelen = LoadStringW(g_hModule, dwState, wszState, sizeof(wszState)/sizeof(WCHAR)); dwGrouplen = LoadStringW(g_hModule, dwGroup, wszGroup, sizeof(wszGroup)/sizeof(WCHAR)); dwTypelen = LoadStringW(g_hModule, dwType, wszType, sizeof(wszType)/sizeof(WCHAR)); memset(Version, L'\0', 9); _itow((int)pRow->VersNo.LowPart, Buffer, 16); wcsncpy(Version, Buffer, wcslen(Buffer)>8?8:wcslen(Buffer)); for( i=wcslen(Version); i<9; i++ ) Version[i] = L' '; Version[8] = L'\0'; pwszTime = GetDateTimeString(pRow->TimeStamp, TRUE, &iType); if ( pRow->TypOfRec_e is WINSINTF_E_UNIQUE or pRow->TypOfRec_e is WINSINTF_E_NORM_GROUP ) { wcscpy(IPAdd, IpAddressToString(pRow->Add.IPAdd)); for( i=wcslen(IPAdd); i 0 ) ? wszType : pwszType, ( dwStatelen > 0 ) ? wszState : pwszState, Version, ( dwGrouplen > 0 ) ? wszGroup : pwszGroup, iType ? wszInfinite : pwszTime, IPAdd, IpAddressToString(WinsAdd.IPAdd)); } } else //spec. grp or multihomed { DWORD ind; BOOL fFirst = FALSE; for ( ind=0; ind < pRow->NoOfAdds ; /*no third expr*/ ) { struct in_addr InAddr1, InAddr2; LPWSTR pwszTempAddr = NULL; InAddr1.s_addr = htonl( (pRow->pAdd + ind++)->IPAdd); InAddr2.s_addr = htonl( (pRow->pAdd + ind++)->IPAdd); pwszTempAddr = WinsOemToUnicode(inet_ntoa(InAddr2), NULL); if( pwszTempAddr is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(IPAdd, pwszTempAddr); WinsFreeMemory(pwszTempAddr); pwszTempAddr = NULL; for( i=wcslen(IPAdd); i 0 ) ? wszType : pwszType, ( dwStatelen > 0 ) ? wszState : pwszState, Version, ( dwGrouplen > 0 ) ? wszGroup : pwszGroup, iType ? wszInfinite : pwszTime, IPAdd, pwszTempAddr); WinsFreeMemory(pwszTempAddr); pwszTempAddr = NULL; } } else { pwszTempAddr = WinsOemToUnicode(inet_ntoa(InAddr2), NULL); if( pwszTempAddr is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } DisplayMessage(g_hModule, MSG_WINS_RECORD_IPADDRESS, pwszTempAddr); WinsFreeMemory(pwszTempAddr); pwszTempAddr = NULL; if( fOpenFile ) { pwszTempAddr = WinsOemToUnicode(inet_ntoa(InAddr1), NULL); if( pwszTempAddr is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } DumpMessage(g_hModule, pFile, FMSG_WINS_RECORD_IPADDRESS, IPAdd, pwszTempAddr); WinsFreeMemory(pwszTempAddr); pwszTempAddr = NULL; DumpMessage(g_hModule, pFile, WINS_FORMAT_LINE); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); } } } pRow++; dwRecCount++; if( pwszTime ) { WinsFreeMemory(pwszTime); pwszTime = NULL; } } } } DisplayMessage(g_hModule, MSG_WINS_RECORDS_RETRIEVED, IpAddressToString(WinsAdd.IPAdd), dwTotal); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); if( fFilter ) { DisplayMessage(g_hModule, MSG_SRVR_FILTER_RECCOUNT, wszFilter, dwRecCount); if( fOpenFile ) { DumpMessage(g_hModule, pFile, MSG_SRVR_FILTER_RECCOUNT, wszFilter, dwRecCount); } } else { DisplayMessage(g_hModule, MSG_SRVR_TOTAL_RECCOUNT, dwRecCount); if( fOpenFile ) { DumpMessage(g_hModule, pFile, MSG_SRVR_TOTAL_RECCOUNT, dwRecCount); } } CommonReturn: if( Status is NO_ERROR and fError is FALSE ) { DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } else if( fError is TRUE ) { DisplayMessage(g_hModule, EMSG_WINS_RETRIEVEDB_PARTIAL); } if( fOpenFile ) { fclose(pFile); pFile = NULL; } if( Recs.pRow ) { WinsFreeMem(Recs.pRow); Recs.pRow = NULL; } if( pwszTime ) { WinsFreeMemory(pwszTime); pwszTime = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_DATABASE, Status); goto CommonReturn; } DWORD HandleSrvrShowDomain( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the domain master browser records Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i = 0, j=0; WINSINTF_BROWSER_NAMES_T Names; PWINSINTF_BROWSER_INFO_T pInfo = NULL; PWINSINTF_BROWSER_INFO_T pInfoSv = NULL; WCHAR wcName[273] = {L'\0'}, wcCount[20] = {L'\0'}; for(i=0; i<273; i++ ) wcName[i] = L' '; for(i=0; i<20; i++ ) wcCount[i] = L' '; wcCount[19] = L'\0'; Names.EntriesRead = 0; Names.pInfo = NULL; Status = WinsGetBrowserNames(&g_BindData, &Names); if (Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_DOMAIN_COUNT, Names.EntriesRead); DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_DOMAIN_TABLE); pInfoSv = pInfo = Names.pInfo; for(i=0; i < Names.EntriesRead; i++) { LPWSTR pwcTemp = NULL; LPSTR pcTemp = NULL; _itow((int)i, wcCount+3, 10); for( j=wcslen(wcCount); j<19; j++ ) wcCount[j] = L' '; wcCount[19] = L'\0'; pwcTemp = WinsOemToUnicode(pInfo->pName, NULL); if( pwcTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcsncpy(wcName+3, pwcTemp, (15>wcslen(pwcTemp))? wcslen(pwcTemp) : 15); wcName[18] = L'['; if( strlen(pInfo->pName ) > 15 ) pcTemp = pInfo->pName + 15; else pcTemp = pInfo->pName + strlen(pInfo->pName); WinsHexToString(wcName+19, (LPBYTE)pcTemp, 1); wcName[21] = L'h'; wcName[22] = L']'; if( strlen(pInfo->pName)>16) { wcName[23] = L'.'; wcscpy(wcName+24, pwcTemp+17); wcName[wcslen(wcName)] = L'\0'; } else wcName[23] = L'\0'; DisplayMessage(g_hModule, MSG_WINS_DOMAIN_ENTRY, wcCount, wcName); if( pwcTemp ) { WinsFreeMemory(pwcTemp); pwcTemp = NULL; } pInfo++; } WinsFreeMem(pInfoSv); pInfoSv = NULL; if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); } else goto ErrorReturn; CommonReturn: if( pInfoSv ) { WinsFreeMem(pInfoSv); pInfoSv = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_DOMAIN, Status); goto CommonReturn; } DWORD HandleSrvrShowInfo( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays server properties Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; HKEY hServer = NULL, hParameter = NULL, hCCRoot = NULL; LPWSTR pTemp = NULL; WCHAR wcData[256] = {L'\0'}; DWORD dwType = REG_SZ, dwLen = 256*sizeof(WCHAR), dwData = 0, dwLow = 0; LPWSTR pwszDayString = NULL, pwszTimeString = NULL; if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_READ, &hParameter); if( Status isnot NO_ERROR ) goto ErrorReturn; DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_DATABASE_BACKUPPARAM); Status = RegQueryValueEx(hParameter, WINSCNF_BACKUP_DIR_PATH_NM, 0, &dwType, (LPBYTE)wcData, &dwLen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_DATABASE_BACKUPDIR, wcData); } else { DisplayMessage(g_hModule, MSG_WINS_DATABASE_BACKUPDIR, wszUnknown); } dwLen = sizeof(DWORD); dwType = REG_DWORD; Status = RegQueryValueEx(hParameter, WINSCNF_DO_BACKUP_ON_TERM_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_DATABASE_BACKUPONTERM, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_WINS_DATABASE_BACKUPONTERM, wszUnknown); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_SETTINGS); { WINSINTF_RESULTS_T Results = {0}; WINSINTF_RESULTS_NEW_T ResultsN = {0}; BOOL fNew = TRUE; ResultsN.WinsStat.NoOfPnrs = 0; ResultsN.WinsStat.pRplPnrs = NULL; ResultsN.NoOfWorkerThds = 1; Status = WinsStatusNew(g_hBind, WINSINTF_E_CONFIG, &ResultsN); if( Status is RPC_S_PROCNUM_OUT_OF_RANGE ) { //Try old API Results.WinsStat.NoOfPnrs = 0; Results.WinsStat.pRplPnrs = 0; Status = WinsStatus(g_hBind, WINSINTF_E_CONFIG, &Results); fNew = FALSE; } if( Status is NO_ERROR ) { if( fNew ) { LPWSTR pwszDayString = NULL; pwszDayString = MakeDayTimeString(ResultsN.RefreshInterval); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_REFRESHINTVL, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; pwszDayString = MakeDayTimeString(ResultsN.TombstoneInterval); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONEINTVL, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; pwszDayString = MakeDayTimeString(ResultsN.TombstoneTimeout); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONETMOUT, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; pwszDayString = MakeDayTimeString(ResultsN.VerifyInterval); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_VERIFYINTVL, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; if( ResultsN.WinsStat.pRplPnrs) { WinsFreeMem(ResultsN.WinsStat.pRplPnrs); ResultsN.WinsStat.pRplPnrs = NULL; } } else { LPWSTR pwszDayString = NULL; pwszDayString = MakeDayTimeString(Results.RefreshInterval); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_REFRESHINTVL, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; pwszDayString = MakeDayTimeString(Results.TombstoneInterval); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONEINTVL, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; pwszDayString = MakeDayTimeString(Results.TombstoneTimeout); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONETMOUT, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; pwszDayString = MakeDayTimeString(Results.VerifyInterval); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_VERIFYINTVL, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; if( Results.WinsStat.pRplPnrs) { WinsFreeMem(Results.WinsStat.pRplPnrs); Results.WinsStat.pRplPnrs = NULL; } } } else { DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_REFRESHINTVL, wszUnknown); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONEINTVL, wszUnknown); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONETMOUT, wszUnknown); DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_VERIFYINTVL, wszUnknown); } } DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_DBCC_PARAM); Status = RegOpenKeyEx(hParameter, CC, 0, KEY_READ, &hCCRoot); if( Status isnot NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_DBCC_STATE, wszDisable); } else { DisplayMessage(g_hModule, MSG_WINS_DBCC_STATE, wszEnable); dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hCCRoot, WINSCNF_CC_MAX_RECS_AAT_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { WCHAR Buffer[20] = {L'\0'}; _itow(dwData, Buffer, 10); DisplayMessage(g_hModule, MSG_WINS_DBCC_MAXCOUNT, Buffer); } else { DisplayMessage(g_hModule, MSG_WINS_DBCC_MAXCOUNT, wszUnknown); } dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hCCRoot, WINSCNF_CC_USE_RPL_PNRS_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_DBCC_CHECKAGAINST, dwData ? wszRandom : wszOwner); } else { DisplayMessage(g_hModule, MSG_WINS_DBCC_CHECKAGAINST, wszUnknown); } dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hCCRoot, WINSCNF_CC_INTVL_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { WCHAR Buffer[5] = {L'\0'}; _itow(dwData/(60*60), Buffer, 10); DisplayMessage(g_hModule, MSG_WINS_DBCC_CHECKEVERY, Buffer); } else { DisplayMessage(g_hModule, MSG_WINS_DBCC_CHECKEVERY, wszUnknown); } memset(wcData, 0x00, 256*sizeof(WCHAR)); dwType = REG_SZ; dwLen = 256*sizeof(WCHAR); Status = RegQueryValueEx(hCCRoot, WINSCNF_SP_TIME_NM, 0, &dwType, (LPBYTE)wcData, &dwLen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_DBCC_STARTAT, wcData); } else { DisplayMessage(g_hModule, MSG_WINS_DBCC_STARTAT, wszUnknown); } } DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_LOGGING_PARAM); dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_LOG_FLAG_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_LOGGING_FLAG, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_WINS_LOGGING_FLAG, wszUnknown); } dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_LOG_DETAILED_EVTS_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_LOGGING_DETAILS, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_WINS_LOGGING_DETAILS, wszUnknown); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_BURSTHNDL_PARAM); dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_BURST_HANDLING_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_BURSTHNDL_STATE, dwData ? wszEnable : wszDisable); if( dwData > 0 ) { dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_BURST_QUE_SIZE_NM, 0, &dwType, (LPBYTE)&dwData, &dwLen); if( Status is NO_ERROR ) { WCHAR Buffer[10] = {L'\0'}; _itow(dwData, Buffer, 10); DisplayMessage(g_hModule, MSG_WINS_BURSTHNDL_SIZE, Buffer); } else { DisplayMessage(g_hModule, MSG_WINS_BURSTHNDL_SIZE, wszUnknown); } } } else { DisplayMessage(g_hModule, MSG_WINS_BURSTHNDL_STATE, wszUnknown); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); dwType = REG_DWORD; dwData = 0; dwLen = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_INIT_VERSNO_VAL_HW_NM, NULL, &dwType, (LPBYTE)&dwData, &dwLen); dwLow = 0; Status = RegQueryValueEx(hParameter, WINSCNF_INIT_VERSNO_VAL_LW_NM, NULL, &dwType, (LPBYTE)&dwLow, &dwLen); if(Status is NO_ERROR ) { wsprintf(wcData, L" %x , %x", dwData, dwLow); DisplayMessage(g_hModule, MSG_SRVR_START_VERSION, wcData); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( hCCRoot ) { RegCloseKey(hCCRoot); hCCRoot = NULL; } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_INFO, Status); goto CommonReturn; } DWORD HandleSrvrShowPartner( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the list of Partners optionally based on the partner type. Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Optional : Partner type - Pull or Push or Both(default) Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount, dwCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_TYPE, FALSE, FALSE} }; PDWORD pdwTagType = NULL, pdwTagNum = NULL; DWORD p = 0; typedef enum {all=0, pull, push, both}eType; eType Type = all; BOOL fPush = TRUE, fPull = TRUE; HKEY hServer = NULL, hPullRoot = NULL, hPushRoot = NULL; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN] = {L'\0'}; WCHAR wcServer[256] = {L'\0'}; DWORD dwLen = 0; typedef struct _Server_List { WCHAR wcServerIpAddress[MAX_IP_STRING_LEN + 1]; WCHAR wcServerName[1024]; eType etype; }Server_List, *PServer_List; PServer_List pServerList = NULL; LPWSTR pwszServerList = NULL; LPWSTR pTemp = NULL; dwCount = 0; if( dwArgCount >= dwCurrentIndex + 1 ) { dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 1 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } wc = ppwcArguments[dwCurrentIndex+pdwTagNum[j]][0]; if( wc is L'0' ) { Type = all; } if( wc is L'1' ) { Type = pull; break; } else if( wc is L'2' ) { Type = push; break; } else if ( wc is L'3' ) { Type = both; break; } else { Status = ERROR_INVALID_PARAMETER; break; } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } } if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PULLROOT, 0, KEY_READ, &hPullRoot); if( Status isnot ERROR_FILE_NOT_FOUND and Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PUSHROOT, 0, KEY_READ, &hPushRoot); if( Status isnot ERROR_FILE_NOT_FOUND and Status isnot NO_ERROR ) goto ErrorReturn; if( hPullRoot is NULL and hPushRoot is NULL ) { goto ErrorReturn; } Status = NO_ERROR; { DWORD dwSubkey = 0; HKEY hKey = NULL; if (hPullRoot != NULL) { Status = RegQueryInfoKey(hPullRoot, NULL, NULL, NULL, &dwSubkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (Status isnot NO_ERROR) { goto ErrorReturn; } } if( dwSubkey > 0 ) { pServerList = WinsAllocateMemory(dwSubkey*sizeof(Server_List)); if( pServerList is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } for( j=0; j 0 ) { PServer_List pTempList = NULL; if( pServerList ) pTempList = pServerList; pServerList= WinsAllocateMemory((dwSubkey+i)*sizeof(Server_List)); if( pServerList is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } memcpy(pServerList, pTempList, i*sizeof(Server_List)); if( pTempList ) { WinsFreeMemory(pTempList); pTempList = NULL; } p = 0; for( j=0; j 2 and _wcsnicmp(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], L"\\\\", 2) is 0 ) k = 2; lpHostEnt = gethostbyname(WinsUnicodeToAnsi(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k, NULL)); if( lpHostEnt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTER_NAME, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4); for( l=0;l<4; l++) { _itoa((int)pbAdd[l], szAdd, 10); memcpy(cAddr+nLen, szAdd, strlen(szAdd)); nLen += strlen(szAdd); *(cAddr+nLen) = '.'; nLen++; } *(cAddr+nLen-1) = '\0'; { LPWSTR pstr = WinsAnsiToUnicode(cAddr, NULL); if (pstr != NULL) { wcscpy(wcServerIpAdd, pstr); WinsFreeMemory(pstr); } else { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } } break; } case 1: { Status = GetVersionData(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], &MaxVer); if( Status isnot NO_ERROR ) goto ErrorReturn; break; } case 2: { Status = GetVersionData(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], &MinVer); if( Status isnot NO_ERROR ) goto ErrorReturn; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } WinsAdd.IPAdd = StringToIpAddress(wcServerIpAdd); WinsAdd.Len = 4; WinsAdd.Type = 0; Status = WinsGetDbRecs(g_hBind, &WinsAdd, MinVer, MaxVer, &Recs); if( Status isnot NO_ERROR ) goto ErrorReturn; DisplayMessage(g_hModule, MSG_WINS_RECORDS_COUNT_OWNER, wcServerIpAdd, Recs.TotalNoOfRecs); DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( Recs.pRow ) { WinsFreeMem(Recs.pRow); Recs.pRow = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_RECCOUNT, Status); goto CommonReturn; } DWORD HandleSrvrShowRecbyversion( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays records based on Version range, filtered by 16th char Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Address of the server whose records to be displayed Optional : Version range. Max and Min version both in the format {high,low}, 16th character, Name etc Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwTagCount, dwNumArgs; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVER, TRUE, FALSE}, {WINS_TOKEN_MAXVER, FALSE, FALSE}, {WINS_TOKEN_MINVER, FALSE, FALSE}, {WINS_TOKEN_NAME, FALSE, FALSE}, {WINS_TOKEN_ENDCHAR, FALSE, FALSE}, {WINS_TOKEN_CASE, FALSE, FALSE}, }; WCHAR wcName[17] = {L'\0'}; LPWSTR pwcScope = NULL; CHAR ch16thChar = 0x00; DWORD dwNameLen = 0; WINSINTF_VERS_NO_T MinVer={0}, MaxVer={0}; WINSINTF_ADD_T WinsAdd = {0}; WINSINTF_RECS_T Recs = {0}; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN+1] = {L'\0'}; WCHAR wcFile[MAX_PATH] = {L'\0'}; LPWSTR pwszTemp = NULL; BOOL fEndChar = FALSE, fCase = FALSE, fFile = FALSE, fName = FALSE; LPDWORD pdwTagType = NULL, pdwTagNum = NULL; LPSTR pszTempAddr = NULL; LPSTR lpName = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SHOW_RECBYVERSION_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( j=0; j 2 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } for( k=0; k= L'a' and towlower(wc) <= L'z' ) { if( towlower(wc) > L'f' ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } ch16thChar = StringToHexA(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); break; } case 5: { WCHAR wc = L'\0'; if( wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]) isnot 1 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } wc = ppwcArguments[dwCurrentIndex+pdwTagNum[j]][0]; if( wc is L'0' ) { fCase = FALSE; } else if( wc is L'1' ) { fCase = TRUE; } else { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } for( j=0; j= 16 ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_NETBIOS_NAME); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } if( fEndChar) { LPSTR pTemp = lpName; lpName = WinsAllocateMemory(17); if( lpName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } strcpy(lpName, pTemp); for( i=strlen(pTemp); i<16; i++ ) { lpName[i] = ' '; } lpName[15] = ch16thChar; lpName[16] = '\0'; WinsFreeMemory(pTemp); dwNameLen = 16; } } WinsAdd.IPAdd = StringToIpAddress(wcServerIpAdd); WinsAdd.Len = 4; WinsAdd.Type = 0; pszTempAddr = WinsUnicodeToOem(wcServerIpAdd, NULL); if( pszTempAddr is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = GetDbRecs(MinVer, MaxVer, &WinsAdd, pszTempAddr, fName, lpName, dwNameLen, FALSE, 0, FALSE, fCase, fFile, fFile ? wcFile : NULL); WinsFreeMemory(pszTempAddr); pszTempAddr = NULL; if( lpName ) { WinsFreeMemory(lpName); lpName = NULL; } if( Status isnot NO_ERROR ) goto ErrorReturn; DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); CommonReturn: if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_RECBYVERSION, Status); goto CommonReturn; } DWORD HandleSrvrShowName( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays detail information for a particular name records Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Name of the records Optional : 16th character and Scope Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount = 0; TAG_TYPE pttTags[] = { {WINS_TOKEN_NAME, TRUE, FALSE}, {WINS_TOKEN_ENDCHAR, FALSE, FALSE}, {WINS_TOKEN_SCOPE, FALSE, FALSE} }; PDWORD pdwTagNum = NULL, pdwTagType = NULL; WCHAR wszName[MAX_STRING_LEN+4] = {L'\0'}; BOOL fEndChar = FALSE; CHAR ch16thChar = 0x00; BOOL fScope = FALSE; WCHAR wszScope[MAX_STRING_LEN] = {L'\0'}; DWORD dwStrLen = 0; LPWSTR pwszTemp = NULL; WINSINTF_RECORD_ACTION_T RecAction = {0}; PWINSINTF_RECORD_ACTION_T pRecAction = NULL; LPWSTR pwszGroup = NULL, pwszState = NULL, pwszType = NULL; CHAR chEndChar = (CHAR)0x00; WCHAR wszGroup[50] = {L'\0'}, wszState[50] = {L'\0'}, wszType[50] = {L'\0'}; DWORD dwTempLen = 0; struct tm* time = NULL; DWORD dwGroup = WINS_GROUP_UNIQUE; DWORD dwState = WINS_STATE_ACTIVE; DWORD dwType = WINS_TYPE_STATIC; DWORD dwGrouplen = 0, dwStatelen = 0, dwTypelen = 0; LPSTR pszTemp = NULL; LPWSTR pwszTime = NULL; int iType = 1; memset(&RecAction, 0x00, sizeof(WINSINTF_RECORD_ACTION_T)); RecAction.fStatic = TRUE; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SHOW_NAME_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } for( k=0; k= L'a' and towlower(wc) <= L'z' ) { if( towlower(wc) > L'f' ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } ch16thChar = StringToHexA(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); break; } case 2: { DWORD dwLen = wcslen(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]); fScope = TRUE; if( dwLen is 0 ) { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwLen = ( 255 < dwLen ) ? 255 : dwLen; memcpy(wszScope, ppwcArguments[dwCurrentIndex+pdwTagNum[j]], dwLen*sizeof(WCHAR)); wszScope[dwLen] = L'\0'; break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } _wcsupr(wszName); _wcsupr(wszScope); wszName[16] = L'\0'; pszTemp = WinsUnicodeToOem(wszName, NULL); if( pszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwStrLen = strlen(pszTemp); if( dwStrLen >= 16 ) { DisplayMessage(g_hModule, EMSG_SRVR_INVALID_NETBIOS_NAME); Status = ERROR_INVALID_PARAMETER; WinsFreeMemory(pszTemp); pszTemp = NULL; goto ErrorReturn; } RecAction.pName = WinsAllocateMemory(273); if( RecAction.pName is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } strncpy(RecAction.pName, pszTemp, 16); WinsFreeMemory(pszTemp); pszTemp = NULL; for( i = dwStrLen; i<16; i++ ) { RecAction.pName[i] = ' '; } if( fEndChar ) { RecAction.pName[15] = ch16thChar; } if( fEndChar and ch16thChar is 0x00 ) RecAction.pName[15] = 0x00; RecAction.pName[16] = '\0'; dwStrLen = 16; if( fScope ) { DWORD dwLen; RecAction.pName[dwStrLen] = '.'; pszTemp = WinsUnicodeToOem(wszScope, NULL); if( pszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwLen = strlen(pszTemp); dwLen = ( 255 - dwStrLen < dwLen ) ? 255 - dwStrLen : dwLen; strncpy(RecAction.pName + dwStrLen + 1, pszTemp, dwLen); WinsFreeMemory(pszTemp); pszTemp = NULL; RecAction.pName[dwLen + dwStrLen + 1] = '\0'; if( fEndChar and ch16thChar is 0x00 ) dwStrLen = 16+dwLen+1; else dwStrLen = strlen(RecAction.pName); } else { RecAction.pName[dwStrLen] = '\0'; } RecAction.NameLen = dwStrLen; RecAction.Cmd_e = WINSINTF_E_QUERY; RecAction.OwnerId = StringToIpAddress(g_ServerIpAddressUnicodeString); RecAction.NameLen = dwStrLen; pRecAction = &RecAction; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status isnot NO_ERROR ) goto ErrorReturn; RecAction.pName[RecAction.NameLen] = L'\0'; memset(wszName, 0x00, MAX_STRING_LEN*sizeof(WCHAR)); if( pRecAction->NameLen >= 16 ) { chEndChar = pRecAction->pName[15]; pRecAction->pName[15] = 0x00; } else { chEndChar = pRecAction->pName[pRecAction->NameLen]; pRecAction->pName[pRecAction->NameLen] = 0x00; } pwszTemp = WinsOemToUnicode(pRecAction->pName, NULL); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(wszName, pwszTemp); WinsFreeMemory(pwszTemp); pwszTemp = NULL; for( i=wcslen(wszName); i<16; i++ ) { wszName[i] = L' '; } wszName[15] = L'['; WinsHexToString(wszName+16, (LPBYTE)&chEndChar, 1); wszName[18] = L'h'; wszName[19] = L']'; if( pRecAction->NameLen > 16 ) { pwszTemp = WinsOemToUnicode(pRecAction->pName+16, NULL); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(wszName + 20 , pwszTemp); WinsFreeMemory(pwszTemp); pwszTemp = NULL; wszName[wcslen(wszName)] = L'\0'; } else { wszName[20] = L'\0'; } if( pRecAction->pName[15] is 0x1C ) { pwszGroup = L"DOMAIN NAME"; dwGroup = WINS_GROUP_DOMAIN; } else if( pRecAction->TypOfRec_e is WINSINTF_E_UNIQUE ) { pwszGroup = L"UNIQUE"; dwGroup = WINS_GROUP_UNIQUE; } else if( pRecAction->TypOfRec_e is WINSINTF_E_NORM_GROUP ) { pwszGroup = L"GROUP"; dwGroup = WINS_GROUP_GROUP; } else if( pRecAction->TypOfRec_e is WINSINTF_E_SPEC_GROUP ) { pwszGroup = L"INTERNET GROUP"; dwGroup = WINS_GROUP_INTERNET; } else { pwszGroup = L"MULTIHOMED"; dwGroup = WINS_GROUP_MULTIHOMED; } //Load the group string { dwGrouplen = LoadStringW(g_hModule, dwGroup, wszGroup, sizeof(wszGroup)/sizeof(WCHAR)); if( dwGrouplen is 0 ) wcscpy(wszGroup, pwszGroup); } pwszTime = GetDateTimeString(pRecAction->TimeStamp, FALSE, &iType); if( pRecAction->State_e is WINSINTF_E_ACTIVE ) { pwszState = L"ACTIVE"; dwState = WINS_STATE_ACTIVE; } else if( pRecAction->State_e is WINSINTF_E_RELEASED ) { dwState = WINS_STATE_RELEASED; pwszState = L"RELEASED"; } else { dwState = WINS_STATE_TOMBSTONE; pwszState = L"TOMBSTONE"; } //Load the State string { dwStatelen = LoadStringW(g_hModule, dwState, wszState, sizeof(wszState)/sizeof(WCHAR)); if( dwStatelen is 0 ) wcscpy(wszState, pwszState); } if( pRecAction->fStatic ) { dwType = WINS_TYPE_STATIC; pwszType = L"STATIC"; } else { dwType = WINS_TYPE_DYNAMIC; pwszType = L"DYNAMIC"; } //Load the State string { dwTypelen = LoadStringW(g_hModule, dwType, wszType, sizeof(wszType)/sizeof(WCHAR)); if( dwTypelen is 0 ) wcscpy(wszType, pwszType); } DisplayMessage( g_hModule, MSG_WINS_DISPLAY_NAME, wszName, pRecAction->NodeTyp, wszState, iType ? wszInfinite : pwszTime, wszGroup, pRecAction->VersNo.HighPart, pRecAction->VersNo.LowPart, wszType); if( pwszTime ) { WinsFreeMemory(pwszTime); pwszTime = NULL; } if ( ( pRecAction->pName[15] isnot 0x1C and pRecAction->pName[15] isnot 0x1E ) and ( pRecAction->TypOfRec_e is WINSINTF_E_UNIQUE or pRecAction->TypOfRec_e is WINSINTF_E_NORM_GROUP ) ) { DisplayMessage(g_hModule, MSG_WINS_IPADDRESS_STRING, IpAddressToString(pRecAction->Add.IPAdd)); } else { for (i=0; iNoOfAdds; ) { DisplayMessage(g_hModule, MSG_WINS_OWNER_ADDRESS, IpAddressToString((pRecAction->pAdd + i++)->IPAdd)); DisplayMessage(g_hModule, MSG_WINS_MEMBER_ADDRESS, IpAddressToString((pRecAction->pAdd + i++)->IPAdd)); } } //If UNIQUE, look for 0x00 and 0x03 records also if( ( pRecAction->TypOfRec_e is WINSINTF_E_UNIQUE or pRecAction->TypOfRec_e is WINSINTF_E_MULTIHOMED ) and fEndChar is FALSE ) { DWORD dwNameLen = RecAction.NameLen; DisplayMessage(g_hModule, WINS_FORMAT_LINE); RecAction.pName[15] = 0x00; RecAction.NameLen = 16; pRecAction = &RecAction; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status is NO_ERROR ) { RecAction.pName[RecAction.NameLen] = L'\0'; memset(wszName, 0x00, MAX_STRING_LEN*sizeof(WCHAR)); pwszTemp = WinsOemToUnicode(pRecAction->pName, NULL); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(wszName, pwszTemp); WinsFreeMemory(pwszTemp); pwszTemp = NULL; for( i=wcslen(wszName); i<16; i++ ) { wszName[i] = L' '; } for( i=wcslen(wszName)+3; j>=15; j-- ) wszName[j-1] = wszName[j-4]; wszName[15] = L'['; WinsHexToString(wszName+16, (LPBYTE)(pRecAction->pName+15), 1); wszName[18] = L'h'; wszName[19] = L']'; if( pRecAction->NameLen > 16 ) { pwszTemp = WinsOemToUnicode(pRecAction->pName+16, NULL); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(wszName + 20 , pwszTemp); WinsFreeMemory(pwszTemp); pwszTemp = NULL; wszName[wcslen(wszName)] = L'\0'; } else { wszName[20] = L'\0'; } iType = 1; pwszTime = GetDateTimeString(pRecAction->TimeStamp, FALSE, &iType); DisplayMessage( g_hModule, MSG_WINS_DISPLAY_NAME, wszName, pRecAction->NodeTyp, wszState, iType ? wszInfinite : pwszTime, wszGroup, pRecAction->VersNo.HighPart, pRecAction->VersNo.LowPart, wszType); if( pwszTime ) { WinsFreeMemory(pwszTime); pwszTime = NULL; } if( pRecAction->TypOfRec_e is WINSINTF_E_UNIQUE ) { DisplayMessage(g_hModule, MSG_WINS_IPADDRESS_STRING, IpAddressToString(pRecAction->Add.IPAdd)); } else { for (i=0; iNoOfAdds; ) { DisplayMessage(g_hModule, MSG_WINS_OWNER_ADDRESS, IpAddressToString((pRecAction->pAdd + i++)->IPAdd)); DisplayMessage(g_hModule, MSG_WINS_MEMBER_ADDRESS, IpAddressToString((pRecAction->pAdd + i++)->IPAdd)); } } } DisplayMessage(g_hModule, WINS_FORMAT_LINE); //Now Look for 0x03 record if( fScope ) { DWORD dwLen; dwStrLen = 16; RecAction.pName[dwStrLen] = '.'; pszTemp = WinsUnicodeToOem(wszScope, NULL); if( pszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwLen = strlen(pszTemp); dwLen = ( 255 - dwStrLen < dwLen ) ? 255 - dwStrLen : dwLen; strncpy(RecAction.pName + dwStrLen + 1, pszTemp, dwLen); WinsFreeMemory(pszTemp); pszTemp = NULL; RecAction.pName[dwLen + dwStrLen + 1] = '\0'; if( fEndChar and ch16thChar is 0x00 ) dwStrLen = 16+dwLen+1; else dwStrLen = strlen(RecAction.pName); } else { RecAction.pName[dwStrLen] = '\0'; } RecAction.pName[15] = 0x03; RecAction.NameLen = dwNameLen; pRecAction = &RecAction; Status = WinsRecordAction(g_hBind, &pRecAction); if( Status is NO_ERROR ) { CHAR chEndChar = pRecAction->pName[15]; RecAction.pName[RecAction.NameLen] = L'\0'; memset(wszName, 0x00, MAX_STRING_LEN*sizeof(WCHAR)); if( pRecAction->NameLen >= 16 ) { chEndChar = pRecAction->pName[15]; pRecAction->pName[15] = 0x00; } else { chEndChar = pRecAction->pName[pRecAction->NameLen]; pRecAction->pName[pRecAction->NameLen] = 0x00; } pwszTemp = WinsOemToUnicode(pRecAction->pName, NULL); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(wszName, pwszTemp); WinsFreeMemory(pwszTemp); pwszTemp = NULL; for( i = wcslen(wszName); i < 16; i++ ) { wszName[i] = L' '; } for( i=wcslen(wszName)+3; j>=15; j-- ) wszName[j-1] = wszName[j-4]; wszName[15] = L'['; WinsHexToString(wszName+16, (LPBYTE)&chEndChar, 1); wszName[18] = L'h'; wszName[19] = L']'; if( pRecAction->NameLen > 16 ) { pwszTemp = WinsOemToUnicode(pRecAction->pName+16, NULL); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(wszName + 20 , pwszTemp); WinsFreeMemory(pwszTemp); pwszTemp = NULL; wszName[wcslen(wszName)] = L'\0'; } else { wszName[20] = L'\0'; } iType = 1; pwszTime = GetDateTimeString(pRecAction->TimeStamp, FALSE, &iType); DisplayMessage(g_hModule, MSG_WINS_DISPLAY_NAME, wszName, pRecAction->NodeTyp, wszState, iType ? wszInfinite : pwszTime, wszGroup, pRecAction->VersNo.HighPart, pRecAction->VersNo.LowPart, wszType); if( pwszTime ) { WinsFreeMemory(pwszTime); pwszTime = NULL; } if( pRecAction->TypOfRec_e is WINSINTF_E_UNIQUE ) { DisplayMessage(g_hModule, MSG_WINS_IPADDRESS_STRING, IpAddressToString(pRecAction->Add.IPAdd)); } else { for (i=0; iNoOfAdds; ) { DisplayMessage(g_hModule, MSG_WINS_OWNER_ADDRESS, IpAddressToString((pRecAction->pAdd + i++)->IPAdd)); DisplayMessage(g_hModule, MSG_WINS_MEMBER_ADDRESS, IpAddressToString((pRecAction->pAdd + i++)->IPAdd)); } } } } CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pszTemp ) { WinsFreeMemory(pszTemp); pszTemp = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( RecAction.pName ) { WinsFreeMemory(RecAction.pName); RecAction.pName = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_NAME, Status); goto CommonReturn; } DWORD HandleSrvrShowServer( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the current WINS server Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DisplayMessage(g_hModule, MSG_WINS_SERVER_NAME, g_ServerNameUnicode, g_ServerIpAddressUnicodeString); return NO_ERROR; } DWORD HandleSrvrShowStatistics( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the Server statistics Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; WINSINTF_RESULTS_T Results = {0}; WINSINTF_RESULTS_NEW_T ResultsN = {0}; WCHAR IpAddress[33] = {L'\0'}; WCHAR RepCount[25] = {L'\0'}; WCHAR Buffer[8] = {L'\0'}; BOOL fNew = TRUE; DWORD i = 0, k = 0; ResultsN.WinsStat.NoOfPnrs = 0; ResultsN.WinsStat.pRplPnrs = NULL; ResultsN.pAddVersMaps = NULL; Status = WinsStatusNew(g_hBind, WINSINTF_E_STAT, &ResultsN); if( Status is RPC_S_PROCNUM_OUT_OF_RANGE ) { //Try old API Results.WinsStat.NoOfPnrs = 0; Results.WinsStat.pRplPnrs = 0; Status = WinsStatus(g_hBind, WINSINTF_E_CONFIG_ALL_MAPS, &Results); fNew = FALSE; } if( Status isnot NO_ERROR ) { DisplayErrorMessage(EMSG_SRVR_SHOW_STATISTICS, Status); } if( fNew ) { DisplayMessage(g_hModule, MSG_WINS_TIMESTAMP, TMSTN.WinsStartTime.wMonth, TMSTN.WinsStartTime.wDay, TMSTN.WinsStartTime.wYear, TMSTN.WinsStartTime.wHour, TMSTN.WinsStartTime.wMinute, TMSTN.WinsStartTime.wSecond ); DisplayMessage(g_hModule, MSG_WINS_LAST_INIT, TIME_ARGSN(LastInitDbTime)); DisplayMessage(g_hModule, MSG_WINS_PLANNED_SCV, TIME_ARGSN(LastPScvTime)); DisplayMessage(g_hModule, MSG_WINS_TRIGGERED_SCV, TIME_ARGSN(LastATScvTime)); DisplayMessage(g_hModule, MSG_WINS_TOMBSTONE_SCV, TIME_ARGSN(LastTombScvTime)); DisplayMessage(g_hModule, MSG_WINS_REPLICA_VERIFICATION, TIME_ARGSN(LastVerifyScvTime)); DisplayMessage(g_hModule, MSG_WINS_PLANNED_REPLICATION, TMSTN.LastPRplTime.wMonth, TMSTN.LastPRplTime.wDay, TMSTN.LastPRplTime.wYear, TMSTN.LastPRplTime.wHour, TMSTN.LastPRplTime.wMinute, TMSTN.LastPRplTime.wSecond ); DisplayMessage(g_hModule, MSG_WINS_TRIGGERED_REPLICATION, TMSTN.LastATRplTime.wMonth, TMSTN.LastATRplTime.wDay, TMSTN.LastATRplTime.wYear, TMSTN.LastATRplTime.wHour, TMSTN.LastATRplTime.wMinute, TMSTN.LastATRplTime.wSecond ); DisplayMessage(g_hModule, MSG_WINS_RESET_COUNTER, TIME_ARGSN(CounterResetTime)); DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_COUNTER_INFORMATION, ResultsN.WinsStat.Counters.NoOfUniqueReg, ResultsN.WinsStat.Counters.NoOfGroupReg, ResultsN.WinsStat.Counters.NoOfSuccQueries, ResultsN.WinsStat.Counters.NoOfFailQueries, ResultsN.WinsStat.Counters.NoOfUniqueRef, ResultsN.WinsStat.Counters.NoOfGroupRef, ResultsN.WinsStat.Counters.NoOfSuccRel, ResultsN.WinsStat.Counters.NoOfFailRel, ResultsN.WinsStat.Counters.NoOfUniqueCnf, ResultsN.WinsStat.Counters.NoOfGroupCnf ); if (ResultsN.WinsStat.NoOfPnrs) { DisplayMessage(g_hModule, MSG_WINS_PARTNER_TABLE); for (i =0; i < ResultsN.WinsStat.NoOfPnrs; i++) { LPTSTR pstr; for(k=0; k<32; k++) { IpAddress[k] = L' '; } IpAddress[32] = L'\0'; for(k=0; k<24; k++) RepCount[k] = L' '; RepCount[24] = L'\0'; pstr = IpAddressToString((ResultsN.WinsStat.pRplPnrs + i)->Add.IPAdd); if (pstr == NULL) { Status = ERROR_NOT_ENOUGH_MEMORY; break; } wcscpy(IpAddress+8, pstr); IpAddress[wcslen(IpAddress)] = L' '; _itow((ResultsN.WinsStat.pRplPnrs + i)->NoOfRpls, Buffer, 10); wcscpy(RepCount+8, Buffer); RepCount[wcslen(RepCount)] = L' '; DisplayMessage(g_hModule, MSG_WINS_PARTNER_INFO, IpAddress, RepCount, (ResultsN.WinsStat.pRplPnrs + i)->NoOfCommFails ); } } WinsFreeMem(ResultsN.pAddVersMaps); ResultsN.pAddVersMaps = NULL; WinsFreeMem(ResultsN.WinsStat.pRplPnrs); ResultsN.WinsStat.pRplPnrs = NULL; } else { DisplayMessage(g_hModule, MSG_WINS_TIMESTAMP, TMST.WinsStartTime.wMonth, TMST.WinsStartTime.wDay, TMST.WinsStartTime.wYear, TMST.WinsStartTime.wHour, TMST.WinsStartTime.wMinute, TMST.WinsStartTime.wSecond ); DisplayMessage(g_hModule, MSG_WINS_LAST_INIT, TIME_ARGS(LastInitDbTime)); DisplayMessage(g_hModule, MSG_WINS_PLANNED_SCV, TIME_ARGS(LastPScvTime)); DisplayMessage(g_hModule, MSG_WINS_TRIGGERED_SCV, TIME_ARGS(LastATScvTime)); DisplayMessage(g_hModule, MSG_WINS_TOMBSTONE_SCV, TIME_ARGS(LastTombScvTime)); DisplayMessage(g_hModule, MSG_WINS_REPLICA_VERIFICATION, TIME_ARGS(LastVerifyScvTime)); DisplayMessage(g_hModule, MSG_WINS_PLANNED_REPLICATION, TMST.LastPRplTime.wMonth, TMST.LastPRplTime.wDay, TMST.LastPRplTime.wYear, TMST.LastPRplTime.wHour, TMST.LastPRplTime.wMinute, TMST.LastPRplTime.wSecond ); DisplayMessage(g_hModule, MSG_WINS_TRIGGERED_REPLICATION, TMST.LastATRplTime.wMonth, TMST.LastATRplTime.wDay, TMST.LastATRplTime.wYear, TMST.LastATRplTime.wHour, TMST.LastATRplTime.wMinute, TMST.LastATRplTime.wSecond ); DisplayMessage(g_hModule, MSG_WINS_RESET_COUNTER, TIME_ARGS(CounterResetTime)); DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_WINS_COUNTER_INFORMATION, Results.WinsStat.Counters.NoOfUniqueReg, Results.WinsStat.Counters.NoOfGroupReg, Results.WinsStat.Counters.NoOfSuccQueries, Results.WinsStat.Counters.NoOfFailQueries, Results.WinsStat.Counters.NoOfUniqueRef, Results.WinsStat.Counters.NoOfGroupRef, Results.WinsStat.Counters.NoOfSuccRel, Results.WinsStat.Counters.NoOfFailRel, Results.WinsStat.Counters.NoOfUniqueCnf, Results.WinsStat.Counters.NoOfGroupCnf ); if (Results.WinsStat.NoOfPnrs) { DisplayMessage(g_hModule, MSG_WINS_PARTNER_TABLE); for (i =0; i < Results.WinsStat.NoOfPnrs; i++) { for(k=0; k<32; k++) { IpAddress[k] = L' '; } IpAddress[32] = L'\0'; for(k=0; k<24; k++) RepCount[k] = L' '; RepCount[24] = L'\0'; wcscpy(IpAddress+8, IpAddressToString((Results.WinsStat.pRplPnrs + i)->Add.IPAdd)); IpAddress[wcslen(IpAddress)] = L' '; _itow((Results.WinsStat.pRplPnrs + i)->NoOfRpls, Buffer, 10); wcscpy(RepCount+8, Buffer); RepCount[wcslen(RepCount)] = L' '; DisplayMessage(g_hModule, MSG_WINS_PARTNER_INFO, IpAddress, RepCount, (Results.WinsStat.pRplPnrs + i)->NoOfCommFails ); } } WinsFreeMem(Results.WinsStat.pRplPnrs); Results.WinsStat.pRplPnrs = NULL; } DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); return Status; } DWORD HandleSrvrShowVersion( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displas the current version counter value. Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; WINSINTF_RESULTS_T Results; Results.AddVersMaps[0].Add.Len = 4; Results.AddVersMaps[0].Add.Type = 0; Results.AddVersMaps[0].Add.IPAdd = StringToIpAddress(g_ServerIpAddressUnicodeString); Results.WinsStat.NoOfPnrs = 0; Results.WinsStat.pRplPnrs = NULL; Status = WinsStatus(g_hBind, WINSINTF_E_ADDVERSMAP, &Results); if( Status isnot NO_ERROR ) { DisplayErrorMessage(EMSG_SRVR_SHOW_VERSION, Status); return Status; } DisplayMessage(g_hModule, MSG_WINS_VERSION_INFO, g_ServerIpAddressUnicodeString, Results.AddVersMaps[0].VersNo.HighPart, Results.AddVersMaps[0].VersNo.LowPart); return Status; } DWORD HandleSrvrShowVersionmap( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the version mapping Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; WINSINTF_RESULTS_T Results = {0}; WINSINTF_RESULTS_NEW_T ResultsN = {0}; LPSTR pszIp = NULL; ResultsN.WinsStat.NoOfPnrs = 0; ResultsN.WinsStat.pRplPnrs = NULL; pszIp = WinsUnicodeToOem(g_ServerIpAddressUnicodeString, NULL); if( pszIp is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); Status = ERROR_NOT_ENOUGH_MEMORY; return Status; } Status = GetStatus(TRUE, (LPVOID)&ResultsN, TRUE, TRUE, pszIp); if( Status is RPC_S_PROCNUM_OUT_OF_RANGE ) { //Try old API Results.WinsStat.NoOfPnrs = 0; Results.WinsStat.pRplPnrs = 0; Status = GetStatus(TRUE, (LPVOID)&Results, FALSE, TRUE, pszIp); } WinsFreeMemory(pszIp); pszIp = NULL; if( ResultsN.pAddVersMaps ) { WinsFreeMem(ResultsN.pAddVersMaps); ResultsN.pAddVersMaps = NULL; } if( Status isnot NO_ERROR ) { DisplayErrorMessage(EMSG_SRVR_SHOW_VERSIONMAP, Status); return Status; } DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); return Status; } DWORD HandleSrvrShowPartnerproperties( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the default partner properties Arguments : All aguments are passes as array of wide char strings in ppwcArguments. NONE. Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; HKEY hServer = NULL, hDefaultPull = NULL, hDefaultPush = NULL, hPullRoot = NULL, hPushRoot = NULL, hPartner = NULL, hParameter = NULL; LPWSTR pTemp = NULL, pServerList = NULL; WCHAR wcBuffer[255] = {L'\0'}; DWORD dwRplWCnfPnrs = 0, dwMigrate = 0, dwData = 0, i = 0, dwPersonaMode = 0, dwSelfFndPnrs = 0; DWORD dwType = REG_DWORD; DWORD dwSize = sizeof(DWORD); LPBYTE pbData = NULL; if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PARAMETER, 0, KEY_READ, &hParameter); if( Status isnot NO_ERROR ) { goto ErrorReturn; } DisplayMessage(g_hModule, WINS_FORMAT_LINE); Status = RegQueryValueEx(hParameter, WINSCNF_RPL_ONLY_W_CNF_PNRS_NM, 0, &dwType, (LPBYTE)&dwRplWCnfPnrs, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_REPLICATE_STATE, dwRplWCnfPnrs ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_REPLICATE_STATE, wszUnknown); } dwMigrate = 0; dwSize = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_MIGRATION_ON_NM, 0, &dwType, (LPBYTE)&dwMigrate, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_MIGRATE_STATE, dwMigrate ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_MIGRATE_STATE, wszUnknown); } DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_SRVR_AUTOCONFIGURE); Status = RegQueryValueEx(hParameter, WINSCNF_USE_SELF_FND_PNRS_NM, 0, &dwType, (LPBYTE)&dwSelfFndPnrs, &dwSize); if( Status isnot NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_SELFFINDPNRS_STATE, wszUnknown); } else { DisplayMessage(g_hModule, MSG_SRVR_SELFFINDPNRS_STATE, dwSelfFndPnrs ? wszEnable : wszDisable); if( dwSelfFndPnrs > 0 ) { dwData = 0; dwSize = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_MCAST_INTVL_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if(Status is NO_ERROR ) { LPWSTR pwszTime = MakeTimeString(dwData); if( pwszTime is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } DisplayMessage(g_hModule, MSG_SRVR_MCAST_INTERVAL, pwszTime); WinsFreeMemory(pwszTime); pwszTime = NULL; } else { DisplayMessage(g_hModule, MSG_SRVR_MCAST_INTERVAL, wszUnknown); } dwData = 0; dwSize = sizeof(DWORD); Status = RegQueryValueEx(hParameter, WINSCNF_MCAST_TTL_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { WCHAR Buffer[10] = {L'\0'}; _itow(dwData, Buffer, 10); DisplayMessage(g_hModule, MSG_SRVR_MCAST_TTL, Buffer); } else { DisplayMessage(g_hModule, MSG_SRVR_MCAST_TTL, wszUnknown); } } } //Display PNG Servers DisplayMessage(g_hModule, WINS_FORMAT_LINE); Status = RegOpenKeyEx(hServer, PARTNERROOT, 0, KEY_READ, &hPartner); if( Status isnot NO_ERROR ) goto ErrorReturn; dwSize = sizeof(DWORD); Status = RegQueryValueEx(hPartner, TEXT(WINSCNF_PERSONA_MODE_NM), 0, &dwType, (LPVOID)&dwPersonaMode, &dwSize); DisplayMessage(g_hModule, dwPersonaMode == PERSMODE_NON_GRATA ? MSG_WINS_PNGSERVER_TABLE : MSG_WINS_PGSERVER_TABLE); dwSize = 0; Status = RegQueryValueEx(hPartner, dwPersonaMode == PERSMODE_NON_GRATA ? PNGSERVER : PGSERVER, 0, &dwType, NULL, &dwSize); if( dwSize <= 2 ) { DisplayMessage(g_hModule, dwPersonaMode == PERSMODE_NON_GRATA ? MSG_WINS_NO_PNGSERVER : MSG_WINS_NO_PGSERVER); } else { pbData = WinsAllocateMemory(dwSize); if( pbData is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } Status = RegQueryValueEx(hPartner, dwPersonaMode == PERSMODE_NON_GRATA ? PNGSERVER : PGSERVER, 0, &dwType, pbData, &dwSize); if( Status isnot NO_ERROR ) goto ErrorReturn; pServerList = (LPWSTR)pbData; i = 0; while(TRUE) { if ( i+1 < dwSize/sizeof(WCHAR) ) { if( pServerList[i] is L'\0' and pServerList[i+1] isnot L'\0' ) { pServerList[i] = L','; } i++; } else break; } pTemp = wcstok(pServerList, L","); while(pTemp isnot NULL ) { DisplayMessage(g_hModule, dwPersonaMode == PERSMODE_NON_GRATA ? MSG_WINS_PNGSERVER_ENTRY : MSG_WINS_PGSERVER_ENTRY, pTemp); pTemp = wcstok(NULL, L","); } } Status = RegOpenKeyEx(hServer, DEFAULTPULL, 0, KEY_READ, &hDefaultPull); if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, MSG_NO_DEFAULT_PULL); } else if( Status isnot NO_ERROR ) { goto ErrorReturn; } Status = RegOpenKeyEx(hServer, PULLROOT, 0, KEY_READ, &hPullRoot); if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, MSG_NO_DEFAULT_PULL); } else if( Status isnot NO_ERROR ) goto ErrorReturn; DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_SRVR_PULL_INFO); dwData = 0; dwSize = sizeof(DWORD); if( hPullRoot isnot NULL ) { Status = RegQueryValueEx(hPullRoot, PERSISTENCE, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PULL_PERSISTENCE_STATE, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_PULL_PERSISTENCE_STATE, wszUnknown); } dwData = 0; dwSize = sizeof(DWORD); Status = RegQueryValueEx(hPullRoot, WINSCNF_INIT_TIME_RPL_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PULL_INITTIMEREPL_STATE, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_PULL_INITTIMEREPL_STATE, wszUnknown); } } dwData = 0; dwSize = 255; if( hDefaultPull isnot NULL ) { Status = RegQueryValueEx(hDefaultPull, WINSCNF_SP_TIME_NM, 0, &dwType, (LPBYTE)wcBuffer, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PULL_STARTTIME, wcBuffer); } else { DisplayMessage(g_hModule, MSG_SRVR_PULL_STARTTIME, wszUnknown); } dwSize = sizeof(DWORD); dwData = 0; Status = RegQueryValueEx(hDefaultPull, WINSCNF_RPL_INTERVAL_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { LPWSTR pwszDayString = MakeDayTimeString(dwData); DisplayMessage(g_hModule, MSG_WINS_PULL_REPLINTERVAL, MakeDayTimeString(dwData)); WinsFreeMemory(pwszDayString); pwszDayString = NULL; } else { DisplayMessage(g_hModule, MSG_WINS_PULL_REPLINTERVAL, wszUnknown); } } dwData = 0; dwSize = sizeof(DWORD); if( hPullRoot isnot NULL ) { Status = RegQueryValueEx(hPullRoot, WINSCNF_RETRY_COUNT_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { WCHAR Buffer[20]; _itow(dwData, Buffer, 10); DisplayMessage(g_hModule, MSG_WINS_PULL_RETRYCOUNT, Buffer); } else { DisplayMessage(g_hModule, MSG_WINS_PULL_RETRYCOUNT, wszUnknown); } } Status = RegOpenKeyEx(hServer, DEFAULTPUSH, 0, KEY_READ, &hDefaultPush); if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, MSG_NO_DEFAULT_PUSH); } else if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PUSHROOT, 0, KEY_READ, &hPushRoot); if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, MSG_NO_DEFAULT_PUSH); } else if( Status isnot NO_ERROR ) goto ErrorReturn; DisplayMessage(g_hModule, WINS_FORMAT_LINE); DisplayMessage(g_hModule, MSG_SRVR_PUSH_INFO); dwData = 0; dwSize = sizeof(DWORD); if( hPushRoot isnot NULL ) { Status = RegQueryValueEx(hPushRoot, PERSISTENCE, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PUSH_PERSISTENCE_STATE, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_PUSH_PERSISTENCE_STATE, wszUnknown); } dwData = 0; dwSize = sizeof(DWORD); Status = RegQueryValueEx(hPushRoot, WINSCNF_INIT_TIME_RPL_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PUSH_INITTIMEREPL_STATE, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_PUSH_INITTIMEREPL_STATE, wszUnknown); } dwData = 0; dwSize = sizeof(DWORD); Status = RegQueryValueEx(hPushRoot, WINSCNF_ADDCHG_TRIGGER_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PUSH_ONADDCHANGE, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_PUSH_ONADDCHANGE, wszUnknown); } } dwData = 0; dwSize = sizeof(DWORD); Status = NO_ERROR; if( hDefaultPush isnot NULL ) { Status = RegQueryValueEx(hDefaultPush, WINSCNF_UPDATE_COUNT_NM, 0, &dwType, (LPBYTE)&dwData, &dwSize); if( Status is NO_ERROR ) { WCHAR Buffer[10] = {L'\0'}; _itow(dwData, Buffer, 10); DisplayMessage(g_hModule, MSG_SRVR_PUSH_UPDATECOUNT, Buffer); } else { DisplayMessage(g_hModule, MSG_SRVR_PUSH_UPDATECOUNT, wszUnknown); } } CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( hPushRoot ) { RegCloseKey(hPushRoot); hPushRoot = NULL; } if( hPullRoot ) { RegCloseKey(hPullRoot); hPullRoot = NULL; } if( hDefaultPush ) { RegCloseKey(hDefaultPush); hDefaultPush = NULL; } if( hDefaultPull ) { RegCloseKey(hDefaultPull); hDefaultPull = NULL; } if( hParameter ) { RegCloseKey(hParameter); hParameter = NULL; } if( hPartner ) { RegCloseKey(hPartner); hPartner = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pbData ) { WinsFreeMemory(pbData); pbData = NULL; } return Status; ErrorReturn: if( Status is ERROR_FILE_NOT_FOUND ) { DisplayMessage(g_hModule, MSG_WINS_NO_PARTNER); } else { DisplayErrorMessage(EMSG_SRVR_SHOW_PARTNERPROPERTIES, Status); } goto CommonReturn; } DWORD HandleSrvrShowPullpartnerproperties( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the properties for a particular Pull partner Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Pull partner address Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVER, TRUE, FALSE}, }; PDWORD pdwTagType = NULL, pdwTagNum = NULL; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN+1] = {L'\0'}; HKEY hPullRoot = NULL, hPullServer = NULL, hServer = NULL; BOOL fPush = FALSE; LPWSTR pTemp = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SHOW_PULLPARTNERPROPERTIES_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 and _wcsnicmp(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], L"\\\\", 2) is 0 ) k = 2; lpHostEnt = gethostbyname(WinsUnicodeToAnsi(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k, NULL)); if( lpHostEnt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTER_NAME, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4); for( l=0;l<4; l++) { _itoa((int)pbAdd[l], szAdd, 10); memcpy(cAddr+nLen, szAdd, strlen(szAdd)); nLen += strlen(szAdd); *(cAddr+nLen) = '.'; nLen++; } *(cAddr+nLen-1) = '\0'; { LPWSTR pstr = WinsAnsiToUnicode(cAddr, NULL); if (pstr != NULL) { wcscpy(wcServerIpAdd, pstr); WinsFreeMemory(pstr); } else { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PULLROOT, 0, KEY_READ, &hPullRoot); if( Status isnot NO_ERROR ) { goto ErrorReturn; } DisplayMessage(g_hModule, WINS_FORMAT_LINE); //Now check if the desired server is in the list of pull server. Status = RegOpenKeyEx(hPullRoot, wcServerIpAdd, 0, KEY_READ, &hPullServer); if( Status isnot NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_PULLPARTNER, wcServerIpAdd, g_ServerIpAddressUnicodeString); goto CommonReturn; } //Check if it is also a push partner or not. { DWORD dwKeyLen = 0; HKEY hPushServer = NULL; dwKeyLen = wcslen(PUSHROOT)+ wcslen(L"\\") + wcslen(wcServerIpAdd); pTemp = WinsAllocateMemory((dwKeyLen+1)*sizeof(WCHAR)); if(pTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } memset(pTemp, 0x00, (dwKeyLen+1)*sizeof(WCHAR)); wcscat(pTemp,PUSHROOT); wcscat(pTemp, L"\\"); wcscat(pTemp, wcServerIpAdd); Status = RegOpenKeyEx(hServer, pTemp, 0, KEY_READ, &hPushServer); if( Status isnot NO_ERROR ) { fPush = FALSE; } else { fPush = TRUE; } WinsFreeMemory(pTemp); pTemp = NULL; if( hPushServer ) { RegCloseKey(hPushServer); hPushServer = NULL; } } //Now look for required parameters to display { WCHAR wcData[256] = {L'\0'}; DWORD dwData = 0; DWORD dwDatalen = 256; DWORD dwType = REG_SZ; Status = RegQueryValueEx(hPullServer, L"NetBIOSName", 0, &dwType, (LPBYTE)wcData, &dwDatalen); if( Status isnot NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_PULLPARTNER_INFO, wcServerIpAdd, wszUnknown, (fPush is TRUE) ? wszPushpull : wszPull); } else { DisplayMessage(g_hModule, MSG_WINS_PULLPARTNER_INFO, wcServerIpAdd, wcData, (fPush is TRUE) ? wszPushpull : wszPull); } dwDatalen = sizeof(DWORD); dwType = REG_DWORD; Status = RegQueryValueEx(hPullServer, PERSISTENCE, 0, &dwType, (LPBYTE)&dwData, &dwDatalen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PULL_PERSISTENCE_STATE, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_PULL_PERSISTENCE_STATE, wszUnknown); } dwType = REG_SZ; dwDatalen = 256; Status = RegQueryValueEx(hPullServer, WINSCNF_SP_TIME_NM, 0, &dwType, (LPBYTE)wcData, &dwDatalen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PULL_STARTTIME, wcData); } else { DisplayMessage(g_hModule, MSG_SRVR_PULL_STARTTIME, L"00:00:00"); } dwDatalen = sizeof(DWORD); dwType = REG_DWORD; Status = RegQueryValueEx(hPullServer, WINSCNF_RPL_INTERVAL_NM, 0, &dwType, (LPBYTE)&dwData, &dwDatalen); if( Status is NO_ERROR ) { LPWSTR pwszDayString = MakeDayTimeString(dwData); DisplayMessage(g_hModule, MSG_WINS_PULL_REPLINTERVAL, pwszDayString); WinsFreeMemory(pwszDayString); pwszDayString = NULL; } else { DisplayMessage(g_hModule, MSG_WINS_PULL_REPLINTERVAL, L"00:00:00"); } } DisplayMessage(g_hModule, WINS_FORMAT_LINE); CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( hPullServer ) { RegCloseKey(hPullServer); hPullServer = NULL; } if( hPullRoot ) { RegCloseKey(hPullRoot); hPullRoot = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_PULLPARTNERPROPERTIES, Status); goto CommonReturn; } DWORD HandleSrvrShowPushpartnerproperties( IN LPCWSTR pwszMachine, IN OUT LPWSTR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN LPCVOID pvData, OUT BOOL *pbDone ) /*++ Routine Description : Displays the properties for a particular Push partner Arguments : All aguments are passes as array of wide char strings in ppwcArguments. Compulsory : Push partner address Return Value: Returns the status of the operation. --*/ { DWORD Status = NO_ERROR; DWORD i, j, dwNumArgs, dwTagCount; TAG_TYPE pttTags[] = { {WINS_TOKEN_SERVER, TRUE, FALSE}, }; PDWORD pdwTagType = NULL, pdwTagNum = NULL; WCHAR wcServerIpAdd[MAX_IP_STRING_LEN+1] = {L'\0'}; HKEY hPushRoot = NULL, hPushServer = NULL, hServer = NULL; BOOL fPull = FALSE; LPWSTR pTemp = NULL; if( dwArgCount < dwCurrentIndex + 1 ) { DisplayMessage(g_hModule, HLP_SRVR_SHOW_PUSHPARTNERPROPERTIES_EX); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } dwNumArgs = dwArgCount - dwCurrentIndex; pdwTagType = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); pdwTagNum = WinsAllocateMemory(dwNumArgs*sizeof(DWORD)); if( pdwTagType is NULL or pdwTagNum is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } dwTagCount = sizeof(pttTags)/sizeof(TAG_TYPE); Status = PreProcessCommand(ppwcArguments, dwArgCount, dwCurrentIndex, pttTags, &dwTagCount, pdwTagType, pdwTagNum); if( Status isnot NO_ERROR ) goto ErrorReturn; for( i=0; i 2 and _wcsnicmp(ppwcArguments[dwCurrentIndex+pdwTagNum[j]], L"\\\\", 2) is 0 ) k = 2; lpHostEnt = gethostbyname(WinsUnicodeToAnsi(ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k, NULL)); if( lpHostEnt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_COMPUTER_NAME, ppwcArguments[dwCurrentIndex+pdwTagNum[j]]+k); Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } memcpy(pbAdd, lpHostEnt->h_addr_list[0], 4); for( l=0;l<4; l++) { _itoa((int)pbAdd[l], szAdd, 10); memcpy(cAddr+nLen, szAdd, strlen(szAdd)); nLen += strlen(szAdd); *(cAddr+nLen) = '.'; nLen++; } *(cAddr+nLen-1) = '\0'; { LPWSTR pstr = WinsAnsiToUnicode(cAddr, NULL); if (pstr != NULL) { wcscpy(wcServerIpAdd, pstr); WinsFreeMemory(pstr); } else { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } } break; } default: { Status = ERROR_INVALID_PARAMETER; goto ErrorReturn; } } } if( wcslen(g_ServerNetBiosName) > 0 ) { pTemp = g_ServerNetBiosName; } Status = RegConnectRegistry(pTemp, HKEY_LOCAL_MACHINE, &hServer); if( Status isnot NO_ERROR ) goto ErrorReturn; Status = RegOpenKeyEx(hServer, PUSHROOT, 0, KEY_READ, &hPushRoot); if( Status isnot NO_ERROR ) { goto ErrorReturn; } DisplayMessage(g_hModule, WINS_FORMAT_LINE); //Now check if the desired server is in the list of push server. Status = RegOpenKeyEx(hPushRoot, wcServerIpAdd, 0, KEY_READ, &hPushServer); if( Status isnot NO_ERROR ) { DisplayMessage(g_hModule, EMSG_WINS_INVALID_PUSHPARTNER, wcServerIpAdd, g_ServerIpAddressUnicodeString); goto CommonReturn; } //Check if it is also a pull partner or not. { DWORD dwKeyLen = 0; HKEY hPullServer = NULL; dwKeyLen = wcslen(PULLROOT)+ wcslen(L"\\") + wcslen(wcServerIpAdd); pTemp = WinsAllocateMemory((dwKeyLen+1)*sizeof(WCHAR)); if(pTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } memset(pTemp, 0x00, (dwKeyLen+1)*sizeof(WCHAR)); wcscat(pTemp,PULLROOT); wcscat(pTemp, L"\\"); wcscat(pTemp, wcServerIpAdd); Status = RegOpenKeyEx(hServer, pTemp, 0, KEY_READ, &hPullServer); if( Status isnot NO_ERROR ) { fPull = FALSE; } else { fPull = TRUE; } WinsFreeMemory(pTemp); pTemp = NULL; if( hPullServer ) { RegCloseKey(hPullServer); hPullServer = NULL; } } //Now look for required parameters to display { WCHAR wcData[256] = {L'\0'}; DWORD dwData = 0; DWORD dwDatalen = 256; DWORD dwType = REG_SZ; Status = RegQueryValueEx(hPushServer, L"NetBIOSName", 0, &dwType, (LPBYTE)wcData, &dwDatalen); if( Status isnot NO_ERROR ) { DisplayMessage(g_hModule, MSG_WINS_PUSHPARTNER_INFO, wcServerIpAdd, wszUnknown, (fPull is TRUE) ? wszPushpull : wszPush); } else { DisplayMessage(g_hModule, MSG_WINS_PUSHPARTNER_INFO, wcServerIpAdd, wcData, (fPull is TRUE) ? wszPushpull : wszPush); } dwDatalen = sizeof(DWORD); dwType = REG_DWORD; Status = RegQueryValueEx(hPushServer, PERSISTENCE, 0, &dwType, (LPBYTE)&dwData, &dwDatalen); if( Status is NO_ERROR ) { DisplayMessage(g_hModule, MSG_SRVR_PUSH_PERSISTENCE_STATE, dwData ? wszEnable : wszDisable); } else { DisplayMessage(g_hModule, MSG_SRVR_PUSH_PERSISTENCE_STATE, wszUnknown); } dwDatalen = sizeof(DWORD); dwType = REG_DWORD; Status = RegQueryValueEx(hPushServer, WINSCNF_UPDATE_COUNT_NM, 0, &dwType, (LPBYTE)&dwData, &dwDatalen); if( Status is NO_ERROR ) { WCHAR Buffer[10] = {L'\0'}; _itow(dwData, Buffer, 10); DisplayMessage(g_hModule, MSG_SRVR_PUSH_UPDATECOUNT, Buffer); } else { DisplayMessage(g_hModule, MSG_SRVR_PUSH_UPDATECOUNT, wszUnknown); } } DisplayMessage(g_hModule, WINS_FORMAT_LINE); CommonReturn: if( Status is NO_ERROR ) DisplayMessage(g_hModule, EMSG_WINS_ERROR_SUCCESS); if( hPushServer ) { RegCloseKey(hPushServer); hPushServer = NULL; } if( hPushRoot ) { RegCloseKey(hPushRoot); hPushRoot = NULL; } if( hServer ) { RegCloseKey(hServer); hServer = NULL; } if( pdwTagType ) { WinsFreeMemory(pdwTagType); pdwTagType = NULL; } if( pdwTagNum ) { WinsFreeMemory(pdwTagNum); pdwTagNum = NULL; } return Status; ErrorReturn: DisplayErrorMessage(EMSG_SRVR_SHOW_PUSHPARTNERPROPERTIES, Status); goto CommonReturn; } DWORD GetVersionData( LPWSTR pwszVers, WINSINTF_VERS_NO_T *Version ) { LPWSTR pTemp = NULL; LPWSTR pwcBuffer = NULL; DWORD dwLen = 0; LPWSTR pwszToken=L",-."; if( ( pwszVers is NULL ) or ( IsBadStringPtr(pwszVers, MAX_STRING_LEN) is TRUE ) ) { return ERROR_INVALID_PARAMETER; } dwLen = wcslen(pwszVers); if( dwLen<2 ) { return ERROR_INVALID_PARAMETER; } pwcBuffer = WinsAllocateMemory((dwLen+1)*sizeof(WCHAR)); if( pwcBuffer is NULL ) { return ERROR_NOT_ENOUGH_MEMORY; } wcscpy(pwcBuffer, pwszVers); if( pwcBuffer[0] isnot L'{' or pwcBuffer[dwLen-1] isnot L'}' ) { WinsFreeMemory(pwcBuffer); pwcBuffer = NULL; return ERROR_INVALID_PARAMETER; } pwcBuffer[dwLen-1] = L'\0'; pTemp = wcstok(pwcBuffer+1, pwszToken); if( pTemp is NULL ) { WinsFreeMemory(pwcBuffer); pwcBuffer = NULL; return ERROR_INVALID_PARAMETER; } Version->HighPart = wcstoul(pTemp, NULL, 16); pTemp = wcstok(NULL, pwszToken); if( pTemp is NULL ) { WinsFreeMemory(pwcBuffer); pwcBuffer = NULL; return ERROR_INVALID_PARAMETER; } Version->LowPart = wcstoul(pTemp, NULL, 16); WinsFreeMemory(pwcBuffer); pwcBuffer = NULL; return NO_ERROR; } DWORD PreProcessCommand( IN LPWSTR *ppwcArguments, IN DWORD dwArgCount, IN DWORD dwCurrentIndex, IN OUT PTAG_TYPE pttTags, IN OUT PDWORD pdwTagCount, OUT PDWORD pdwTagType, OUT PDWORD pdwTagNum ) { DWORD Status = NO_ERROR; DWORD i, j, dwTag = 0; LPWSTR pwszTemp = NULL; if( pdwTagType is NULL or pdwTagNum is NULL or pttTags is NULL or pdwTagCount is NULL ) { return ERROR_INVALID_PARAMETER; } dwTag = *pdwTagCount; i = 0; if( wcsstr(ppwcArguments[dwCurrentIndex], NETSH_ARG_DELIMITER) isnot NULL ) { LPWSTR pwszTag = NULL; while( IsBadStringPtr(ppwcArguments[dwCurrentIndex+i], MAX_STRING_LEN) is FALSE ) { pwszTag = NULL; if( dwArgCount <= dwCurrentIndex + i ) break; if( wcslen(ppwcArguments[dwCurrentIndex+i]) is 0 ) break; pwszTemp = WinsAllocateMemory((wcslen(ppwcArguments[dwCurrentIndex+i])+1)*sizeof(WCHAR)); if( pwszTemp is NULL ) { Status = ERROR_NOT_ENOUGH_MEMORY; goto ErrorReturn; } wcscpy(pwszTemp, ppwcArguments[dwCurrentIndex+i]); if( wcsstr(ppwcArguments[dwCurrentIndex+i], NETSH_ARG_DELIMITER ) is NULL ) { DisplayMessage(g_hModule, EMSG_SRVR_NOT_TAGGED, i+1); i++; continue; } pwszTag = wcstok(pwszTemp, NETSH_ARG_DELIMITER); for( j=0; jpAddVersMaps = NULL; Status = WinsStatusNew(BindHdl, WINSINTF_E_CONFIG, pResultsN); } if( Status isnot NO_ERROR ) { WinsUnbind(&BindData, BindHdl); return Status; } if( fShort is TRUE ) { DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_SETTINGS); if( fNew ) { pwszDay = MakeDayTimeString(pResultsN->RefreshInterval); } else { pwszDay = MakeDayTimeString(pResults->RefreshInterval); } DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_REFRESHINTVL, pwszDay); WinsFreeMemory(pwszDay); pwszDay = NULL; if( fNew ) { pwszDay = MakeDayTimeString(pResultsN->TombstoneInterval); } else { pwszDay = MakeDayTimeString(pResults->TombstoneInterval); } DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONEINTVL, pwszDay); WinsFreeMemory(pwszDay); pwszDay = NULL; if( fNew ) { pwszDay = MakeDayTimeString(pResultsN->TombstoneTimeout); } else { pwszDay = MakeDayTimeString(pResults->TombstoneTimeout); } DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_TOMBSTONETMOUT, pwszDay); WinsFreeMemory(pwszDay); pwszDay = NULL; if( fNew ) { pwszDay = MakeDayTimeString(pResultsN->VerifyInterval); } else { pwszDay = MakeDayTimeString(pResults->VerifyInterval); } DisplayMessage(g_hModule, MSG_WINS_NAMERECORD_VERIFYINTVL, pwszDay); WinsFreeMemory(pwszDay); pwszDay = NULL; DisplayMessage(g_hModule,WINS_FORMAT_LINE); if (!fNew) { DisplayMessage(g_hModule, MSG_WINS_PRIORITY_CLASS, pResults->WinsPriorityClass == NORMAL_PRIORITY_CLASS ? wszNormal : wszHigh); DisplayMessage(g_hModule, MSG_WINS_WORKER_THREAD, pResults->NoOfWorkerThds); pAddVersMaps = pResults->AddVersMaps; NoOfOwners = pResults->NoOfOwners; } else { DisplayMessage(g_hModule, MSG_WINS_PRIORITY_CLASS, pResultsN->WinsPriorityClass == NORMAL_PRIORITY_CLASS ? wszNormal : wszHigh); DisplayMessage(g_hModule, MSG_WINS_WORKER_THREAD, pResultsN->NoOfWorkerThds); pAddVersMaps = pResultsN->pAddVersMaps; NoOfOwners = pResultsN->NoOfOwners; } DisplayMessage(g_hModule,WINS_FORMAT_LINE); if (NoOfOwners isnot 0) { DisplayMessage(g_hModule, MSG_WINS_OWNER_TABLE); for ( i= 0; i < NoOfOwners; i++, pAddVersMaps++) { DWORD j=0; for(j=0; j<20; j++) { IpAddress[j] = L' '; } IpAddress[20] = L'\0'; for(j=0; j<14; j++) { OwnerId[j] = L' '; } OwnerId[14] = L'\0'; _itow(i, Buffer, 10); wcscpy(OwnerId+4, Buffer); for(j=wcslen(OwnerId); j<14; j++) OwnerId[j] = L' '; OwnerId[14] = L'\0'; wcscpy(IpAddress+2, IpAddressToString(pAddVersMaps->Add.IPAdd)); for(j=wcslen(IpAddress); j<20; j++) IpAddress[j] = L' '; IpAddress[20] = L'\0'; if (fNew) { if( pAddVersMaps->VersNo.HighPart is MAXLONG and pAddVersMaps->VersNo.LowPart is MAXULONG ) { DisplayMessage(g_hModule, MSG_WINS_OWNER_INFO_MAX, OwnerId, IpAddress, wszDeleted); continue; } if (fShort && pAddVersMaps->VersNo.QuadPart == 0) { continue; } DisplayMessage(g_hModule, MSG_WINS_OWNER_INFO, OwnerId, IpAddress, pAddVersMaps->VersNo.HighPart, pAddVersMaps->VersNo.LowPart); } } } else { DisplayMessage(g_hModule, MSG_WINS_NO_RECORDS); } } WinsUnbind(&BindData, BindHdl); if( BindData.pServerAdd ) { WinsFreeMemory(BindData.pServerAdd); BindData.pServerAdd = NULL; } return(Status); } VOID ChkAdd( PWINSINTF_RECORD_ACTION_T pRow, DWORD Add, BOOL fFile, FILE *pFile, DWORD OwnerIP, LPBOOL pfMatch ) { struct in_addr InAddr1, InAddr2; DWORD dwIpAddress = 0; LPWSTR pwszAdd1 = NULL; LPWSTR pwszAdd2 = NULL; LPWSTR pwszOwner = NULL; BOOL fFirst = FALSE; if ( pRow->TypOfRec_e is WINSINTF_E_UNIQUE or pRow->TypOfRec_e is WINSINTF_E_NORM_GROUP ) { pwszAdd2 = IpAddressToString(pRow->Add.IPAdd); pwszOwner = IpAddressToString(OwnerIP); if( pwszAdd2 is NULL or pwszOwner is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); if( pwszAdd2 ) { WinsFreeMemory(pwszAdd2); pwszAdd2 = NULL; } if( pwszOwner ) { WinsFreeMemory(pwszOwner); pwszOwner = NULL; } return; } if (*pfMatch) { if (Add isnot pRow->Add.IPAdd) { WinsFreeMemory(pwszAdd2); pwszAdd2 = NULL; WinsFreeMemory(pwszOwner ); pwszOwner = NULL; *pfMatch = FALSE; return; } } DisplayMessage(g_hModule, MSG_WINS_IPADDRESS_STRING, pwszAdd2 ); if( fFile ) { DumpMessage(g_hModule, pFile, FMSG_WINS_IPADDRESS_STRING, pwszAdd2, pwszOwner); } WinsFreeMemory(pwszAdd2); pwszAdd2 = NULL; WinsFreeMemory(pwszOwner ); pwszOwner = NULL; return; } else //spec. grp or multihomed { DWORD ind; if (!*pfMatch) { DisplayMessage(g_hModule, MSG_WINS_MEMBER_COUNT, pRow->NoOfAdds/2); } for ( ind=0; ind < pRow->NoOfAdds ; /*no third expr*/ ) { LPSTR psz1 = NULL; InAddr1.s_addr = htonl( (pRow->pAdd + ind++)->IPAdd); psz1 = inet_ntoa(InAddr1); if( psz1 is NULL ) { continue; } pwszAdd1 = WinsOemToUnicode(psz1, NULL ); if( pwszAdd1 is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); return; } if (!*pfMatch) { DisplayMessage(g_hModule, MSG_WINS_OWNER_ADDRESS, pwszAdd1); } InAddr2.s_addr = htonl((pRow->pAdd + ind++)->IPAdd); psz1 = inet_ntoa(InAddr2); if( psz1 is NULL ) { if( pwszAdd1 ) { WinsFreeMemory(pwszAdd1); pwszAdd1 = NULL; } continue; } pwszAdd2 = WinsOemToUnicode(psz1, NULL); if( pwszAdd2 is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); if( pwszAdd1 ) { WinsFreeMemory(pwszAdd1); pwszAdd1 = NULL; } return; } if (!*pfMatch) { DisplayMessage(g_hModule, MSG_WINS_IPADDRESS_STRING, pwszAdd2 ); if( fFile ) { if( fFirst is FALSE ) { DumpMessage(g_hModule, pFile, FMSG_WINS_IPADDRESS_STRING, pwszAdd2, pwszAdd1); fFirst = TRUE; } else { DumpMessage(g_hModule, pFile, FMSG_WINS_IPADDRESS_LIST, pwszAdd2, pwszAdd1); } } } if (*pfMatch) { if (Add isnot (pRow->pAdd + ind - 1)->IPAdd) { *pfMatch = FALSE; if( pwszAdd1 ) { WinsFreeMemory(pwszAdd1); pwszAdd1 = NULL; } if( pwszAdd2 ) { WinsFreeMemory(pwszAdd2); pwszAdd2 = NULL; } return; } } } // // If there were no members to compare with, then // let us set *pfMatch to FALSE. // if (ind == 0) { if (*pfMatch) { *pfMatch = FALSE; } } if( pwszAdd1 ) { WinsFreeMemory(pwszAdd1); pwszAdd1 = NULL; } if( pwszAdd2 ) { WinsFreeMemory(pwszAdd2); pwszAdd2 = NULL; } return; } } DWORD GetDbRecs( WINSINTF_VERS_NO_T LowVersNo, WINSINTF_VERS_NO_T HighVersNo, PWINSINTF_ADD_T pWinsAdd, LPBYTE pTgtAdd, BOOL fSetFilter, LPBYTE pFilterName, DWORD Len, BOOL fAddFilter, DWORD AddFilter, BOOL fCountRec, BOOL fCase, BOOL fFile, LPWSTR pwszFile ) { WINSINTF_RECS_T Recs; DWORD Choice; DWORD Status = WINSINTF_SUCCESS; DWORD TotalCnt = 0; BOOL fMatch; WINSINTF_VERS_NO_T sTmpVersNo; WCHAR Name[20] = {L'\0'}; DWORD dwCount = 0; struct tm* time = NULL; LPWSTR pwszTime = NULL; int iType = 1; FILE *pFile = NULL; BOOL fOpenFile = FALSE; BOOL fHeader = FALSE; LPWSTR pwszGroup = NULL, pwszType = NULL, pwszState = NULL; WCHAR wszGroup[50] = {L'\0'}, wszState[50] = {L'\0'}, wszType[50] = {L'\0'}; DWORD dwGroup = WINS_GROUP_UNIQUE, dwGrouplen = 0, dwState = WINS_STATE_ACTIVE, dwStatelen = 0, dwType = WINS_TYPE_STATIC, dwTypelen = 0; sTmpVersNo.LowPart = 1; sTmpVersNo.HighPart = 0; if( fFile ) { pFile = _wfopen(pwszFile, L"a+"); if( pFile is NULL ) { fOpenFile = FALSE; DisplayMessage(g_hModule, EMSG_WINS_FILEOPEN_FAILED, pwszFile); } else { fOpenFile = TRUE; } } while (TRUE) { LPWSTR pwszTempTgt = NULL; Recs.pRow = NULL; Status = WinsGetDbRecs(g_hBind, pWinsAdd, LowVersNo, HighVersNo, &Recs); if (fCountRec) { DisplayMessage(g_hModule, MSG_WINS_RECORDS_COUNT, Recs.TotalNoOfRecs); break; } if (Status is WINSINTF_SUCCESS) { if (Recs.NoOfRecs > 0) { DWORD i, k; PWINSINTF_RECORD_ACTION_T pRow = Recs.pRow; TotalCnt += Recs.NoOfRecs; if (!fSetFilter) { DisplayMessage(g_hModule, MSG_WINS_RECORDS_RETRIEVED, IpAddressToString(pWinsAdd->IPAdd), Recs.NoOfRecs); } for (i=0; iIPAdd, &fMatch ); } else { fMatch = FALSE; } // // If the address matched or if no filter // was specified or if there was a name // filter and the names matched, print // out the details // if( fCase ) { if( fMatch or fSetFilter is FALSE or ( fAddFilter is FALSE and IsBadStringPtrA(pRow->pName, 256) is FALSE and strncmp(pRow->pName, pFilterName, (pRow->NameLen>Len)?Len:pRow->NameLen) is 0 ) ) { WCHAR Name[256] = {L'\0'}; CHAR chEndChar = 0x00; LPWSTR pwszTemp = NULL; DWORD dwTempLen = 0; DisplayMessage(g_hModule, MSG_WINS_RECORD_LINE); if( fOpenFile and g_fHeader is FALSE ) { DumpMessage(g_hModule, pFile, FMSG_WINS_RECORD_TABLE); g_fHeader = TRUE; } chEndChar = (CHAR)pRow->pName[15]; pRow->pName[15] = '\0'; pwszTemp = WinsOemToUnicode(pRow->pName, NULL); if( pwszTemp is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); Status = WINSINTF_FAILURE; break; } dwTempLen = ( 16 > wcslen(pwszTemp) ) ? wcslen(pwszTemp) : 16; wcsncpy(Name, pwszTemp, dwTempLen); WinsFreeMemory(pwszTemp); pwszTemp = NULL; for( k=dwTempLen; k<15; k++ ) { Name[k] = L' '; } Name[15] = L'['; WinsHexToString(Name+16, (LPBYTE)&chEndChar, 1); Name[18] = L'h'; Name[19] = L']'; Name[20] = L'\0'; if( IsBadStringPtrA(pRow->pName+16, 240) is FALSE ) { pwszTemp = WinsOemToUnicode(pRow->pName+16, NULL); if( pwszTemp is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); Status = WINSINTF_FAILURE; break; } dwTempLen = ( 240 > wcslen(pwszTemp) ) ? wcslen(pwszTemp) : 240; wcsncpy(Name+20, pwszTemp, dwTempLen); WinsFreeMemory(pwszTemp); pwszTemp = NULL; } Name[wcslen(Name)] = L'\0'; if( chEndChar is 0x1C ) { dwGroup = WINS_GROUP_DOMAIN; pwszGroup = L"DOMAIN NAME "; } else if( pRow->TypOfRec_e is WINSINTF_E_UNIQUE ) { pwszGroup = L"UNIQUE "; dwGroup = WINS_GROUP_UNIQUE; } else if( pRow->TypOfRec_e is WINSINTF_E_NORM_GROUP ) { pwszGroup = L"GROUP "; dwGroup = WINS_GROUP_GROUP; } else if( pRow->TypOfRec_e is WINSINTF_E_SPEC_GROUP ) { pwszGroup = L"INTERNET GROUP"; dwGroup = WINS_GROUP_INTERNET; } else { pwszGroup = L"MULTIHOMED "; dwGroup = WINS_GROUP_MULTIHOMED; } //Load the group string { dwGrouplen = LoadStringW(g_hModule, dwGroup, wszGroup, sizeof(wszGroup)/sizeof(WCHAR)); if( dwGrouplen is 0 ) wcscpy(wszGroup, pwszGroup); } if( pRow->State_e is WINSINTF_E_ACTIVE ) { pwszState = L"ACTIVE"; dwState = WINS_STATE_ACTIVE; } else if( pRow->State_e is WINSINTF_E_RELEASED ) { dwState = WINS_STATE_RELEASED; pwszState = L"RELEASED"; } else { dwState = WINS_STATE_TOMBSTONE; pwszState = L"TOMBSTONE"; } //Load the State string { dwStatelen = LoadStringW(g_hModule, dwState, wszState, sizeof(wszState)/sizeof(WCHAR)); if( dwStatelen is 0 ) wcscpy(wszState, pwszState); } if( pRow->fStatic ) { dwType = WINS_TYPE_STATIC; pwszType = L"STATIC"; } else { dwType = WINS_TYPE_DYNAMIC; pwszType = L"DYNAMIC"; } //Load the State string { dwTypelen = LoadStringW(g_hModule, dwType, wszType, sizeof(wszType)/sizeof(WCHAR)); if( dwTypelen is 0 ) wcscpy(wszType, pwszType); } iType = 1; pwszTime = GetDateTimeString(pRow->TimeStamp, FALSE, &iType); DisplayMessage(g_hModule, MSG_WINS_RECORD_INFO, Name, wszType, wszState, pRow->VersNo.HighPart, pRow->VersNo.LowPart, pRow->NodeTyp, wszGroup, iType ? wszInfinite : pwszTime); if( fOpenFile ) { DumpMessage(g_hModule, pFile, FMSG_WINS_RECORDS_INFO, Name, wszType, wszState, pRow->VersNo.HighPart, pRow->VersNo.LowPart, pRow->NodeTyp, wszGroup, iType ? wszInfinite : pwszTime); } if( pwszTime ) { WinsFreeMemory(pwszTime); pwszTime = NULL; } fMatch = FALSE; ChkAdd( pRow, AddFilter, fOpenFile, pFile, pWinsAdd->IPAdd, &fMatch ); DisplayMessage(g_hModule, MSG_WINS_RECORD_LINE); dwCount++; } } else { if( fMatch or fSetFilter is FALSE or ( fAddFilter is FALSE and IsBadStringPtrA(pRow->pName, 256) is FALSE and _strnicmp(pRow->pName, pFilterName, (pRow->NameLen>Len)?Len:pRow->NameLen) is 0 ) ) { WCHAR Name[256] = {L'\0'}; CHAR chEndChar = 0x00; LPWSTR pwszTemp = NULL; DWORD dwTempLen = 0; DisplayMessage(g_hModule, MSG_WINS_RECORD_LINE); if( fOpenFile and g_fHeader is FALSE ) { DumpMessage(g_hModule, pFile, FMSG_WINS_RECORD_TABLE); g_fHeader = TRUE; } chEndChar = (CHAR)pRow->pName[15]; pRow->pName[15] = '\0'; pwszTemp = WinsOemToUnicode(pRow->pName, NULL); if( pwszTemp is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); Status = WINSINTF_FAILURE; break; } dwTempLen = ( 16 > wcslen(pwszTemp) ) ? wcslen(pwszTemp) : 16; wcsncpy(Name, pwszTemp, dwTempLen); WinsFreeMemory(pwszTemp); pwszTemp = NULL; for( k=dwTempLen; k<15; k++ ) { Name[k] = L' '; } Name[15] = L'['; WinsHexToString(Name+16, (LPBYTE)&chEndChar, 1); Name[18] = L'h'; Name[19] = L']'; Name[20] = L'\0'; if( IsBadStringPtrA(pRow->pName+16, 240) is FALSE ) { pwszTemp = WinsOemToUnicode(pRow->pName+16, NULL); if( pwszTemp is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); Status = WINSINTF_FAILURE; break; } dwTempLen = ( 240 > wcslen(pwszTemp) ) ? wcslen(pwszTemp) : 240; wcsncpy(Name+20, pwszTemp, dwTempLen); WinsFreeMemory(pwszTemp); pwszTemp = NULL; } Name[wcslen(Name)] = L'\0'; if( chEndChar is 0x1C ) { dwGroup = WINS_GROUP_DOMAIN; pwszGroup = L"DOMAIN NAME "; } else if( pRow->TypOfRec_e is WINSINTF_E_UNIQUE ) { pwszGroup = L"UNIQUE "; dwGroup = WINS_GROUP_UNIQUE; } else if( pRow->TypOfRec_e is WINSINTF_E_NORM_GROUP ) { pwszGroup = L"GROUP "; dwGroup = WINS_GROUP_GROUP; } else if( pRow->TypOfRec_e is WINSINTF_E_SPEC_GROUP ) { pwszGroup = L"INTERNET GROUP"; dwGroup = WINS_GROUP_INTERNET; } else { pwszGroup = L"MULTIHOMED "; dwGroup = WINS_GROUP_MULTIHOMED; } //Load the group string { dwGrouplen = LoadStringW(g_hModule, dwGroup, wszGroup, sizeof(wszGroup)/sizeof(WCHAR)); if( dwGrouplen is 0 ) wcscpy(wszGroup, pwszGroup); } if( pRow->State_e is WINSINTF_E_ACTIVE ) { pwszState = L"ACTIVE"; dwState = WINS_STATE_ACTIVE; } else if( pRow->State_e is WINSINTF_E_RELEASED ) { dwState = WINS_STATE_RELEASED; pwszState = L"RELEASED"; } else { dwState = WINS_STATE_TOMBSTONE; pwszState = L"TOMBSTONE"; } //Load the State string { dwStatelen = LoadStringW(g_hModule, dwState, wszState, sizeof(wszState)/sizeof(WCHAR)); if( dwStatelen is 0 ) wcscpy(wszState, pwszState); } if( pRow->fStatic ) { dwType = WINS_TYPE_STATIC; pwszType = L"STATIC"; } else { dwType = WINS_TYPE_DYNAMIC; pwszType = L"DYNAMIC"; } //Load the State string { dwTypelen = LoadStringW(g_hModule, dwType, wszType, sizeof(wszType)/sizeof(WCHAR)); if( dwTypelen is 0 ) wcscpy(wszType, pwszType); } iType = 1; pwszTime = GetDateTimeString(pRow->TimeStamp, FALSE, &iType); DisplayMessage(g_hModule, MSG_WINS_RECORD_INFO, Name, wszType, wszState, pRow->VersNo.HighPart, pRow->VersNo.LowPart, pRow->NodeTyp, wszGroup, iType ? wszInfinite : pwszTime); if( fOpenFile ) { DumpMessage(g_hModule, pFile, FMSG_WINS_RECORDS_INFO, Name, wszType, wszState, pRow->VersNo.HighPart, pRow->VersNo.LowPart, pRow->NodeTyp, wszGroup, iType ? wszInfinite : pwszTime); } if( pwszTime ) { WinsFreeMemory(pwszTime); pwszTime = NULL; } fMatch = FALSE; ChkAdd( pRow, AddFilter, fOpenFile, pFile, pWinsAdd->IPAdd, &fMatch ); DisplayMessage(g_hModule, MSG_WINS_RECORD_LINE); dwCount++; } } pRow++; }// end of for (all recs) if (Status != WINSINTF_SUCCESS) break; // // If a range was chosen and records // retrieved are == the limit of 100 // and if the Max vers no retrieved // is less than that specified, ask // user if he wishes to continue // if (!fSetFilter) { DisplayMessage(g_hModule, MSG_WINS_RECORDS_SEARCHED, Recs.NoOfRecs); } if ( Recs.NoOfRecs < Recs.TotalNoOfRecs and LiLtr((--pRow)->VersNo,HighVersNo) ) { LowVersNo.QuadPart = LiAdd(pRow->VersNo, sTmpVersNo); continue; } DisplayMessage(g_hModule, MSG_WINS_SEARCHDB_COUNT, TotalCnt); break; } pwszTempTgt = WinsOemToUnicode(pTgtAdd, NULL); if( pwszTempTgt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); Status = WINSINTF_FAILURE; break; } DisplayMessage(g_hModule, MSG_WINS_NO_RECORD, pwszTempTgt); WinsFreeMemory(pwszTempTgt); pwszTempTgt = NULL; } else { pwszTempTgt = WinsOemToUnicode(pTgtAdd, NULL); if( pwszTempTgt is NULL ) { DisplayMessage(g_hModule, EMSG_WINS_OUT_OF_MEMORY); break; } DisplayMessage(g_hModule, MSG_WINS_NO_RECORD, pwszTempTgt); WinsFreeMemory(pwszTempTgt); pwszTempTgt = NULL; } break; } // while (TRUE) DisplayMessage(g_hModule, MSG_SRVR_RECORD_MATCH, dwCount); if( fOpenFile is TRUE ) { fclose(pFile); pFile = NULL; } g_dwSearchCount += dwCount; if (Recs.pRow != NULL) { WinsFreeMem(Recs.pRow); } return(Status); } // GetDbRecs LPWSTR GetDateTimeString(DWORD_PTR TimeStamp, BOOL fShort, int *piType ) { DWORD Status = NO_ERROR, dwTime = 0; int iType = 1; LPWSTR pwszTime = NULL; if( TimeStamp is INFINITE_EXPIRATION ) { iType = 1; } else { Status = FormatDateTimeString(TimeStamp, fShort, NULL, &dwTime); if( Status is NO_ERROR ) { pwszTime = WinsAllocateMemory((dwTime+1)*sizeof(WCHAR)); if( pwszTime ) { dwTime++; Status = FormatDateTimeString(TimeStamp, fShort, pwszTime, &dwTime); } if( Status is NO_ERROR ) { iType = 0; } } } *piType = iType; return pwszTime; }