Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

511 lines
13 KiB

/*
File tcpipui.c
Dialog that edits the tcpip properties.
Paul Mayfield, 10/9/97
*/
#include "rassrv.h"
#define IDH_DISABLEHELP ((DWORD)-1)
// Help maps
static const DWORD phmTcpipui[] =
{
CID_NetTab_Tcpipui_CB_ExposeNetwork, IDH_NetTab_Tcpipui_CB_ExposeNetwork,
CID_NetTab_Tcpipui_EB_Start, IDH_NetTab_Tcpipui_EB_Start,
CID_NetTab_Tcpipui_RB_Dhcp, IDH_NetTab_Tcpipui_RB_Dhcp,
CID_NetTab_Tcpipui_RB_StaticPool, IDH_NetTab_Tcpipui_RB_StaticPool,
CID_NetTab_Tcpipui_EB_Mask, IDH_NetTab_Tcpipui_EB_Mask,
CID_NetTab_Tcpipui_CB_CallerSpec, IDH_NetTab_Tcpipui_CB_CallerSpec,
CID_NetTab_Tcpipui_EB_Range, IDH_DISABLEHELP,
CID_NetTab_Tcpipui_EB_Total, IDH_DISABLEHELP,
0, 0
};
// Error reporting
void
TcpipUiDisplayError(
HWND hwnd,
DWORD dwErr)
{
ErrDisplayError(
hwnd,
dwErr,
ERR_TCPIPPROP_CATAGORY,
0,
Globals.dwErrorData);
}
// Converts a dword ip address (in host order) to a wide character string
//
DWORD
TcpipDwordToAddr(
DWORD dwAddr,
PWCHAR pszAddr)
{
wsprintfW(
pszAddr,
L"%d.%d.%d.%d",
FIRST_IPADDRESS (dwAddr),
SECOND_IPADDRESS(dwAddr),
THIRD_IPADDRESS (dwAddr),
FOURTH_IPADDRESS(dwAddr));
return NO_ERROR;
}
//
// Returns NO_ERROR if the given address is a valid IP pool.
// The offending component is returned in lpdwErrReason.
// See RASIP_F_* values
//
DWORD
TcpipUiValidatePool(
IN DWORD dwAddress,
IN DWORD dwEnd,
OUT LPDWORD lpdwErrReason
)
{
DWORD i, dwMaskMask;
DWORD dwLowIp, dwHighIp, dwErr;
// Initialize
//
dwLowIp = MAKEIPADDRESS(1,0,0,0);
dwHighIp = MAKEIPADDRESS(224,0,0,0);
// Make sure that the netId is a valid class
//
if ((dwAddress < dwLowIp) ||
(dwAddress >= dwHighIp) ||
(FIRST_IPADDRESS(dwAddress) == 127))
{
*lpdwErrReason = SID_TCPIP_InvalidNetId;
return ERROR_BAD_FORMAT;
}
// Make sure the pool base is not more specific than
// the mask
//
if (dwAddress >= dwEnd)
{
*lpdwErrReason = SID_TCPIP_NetidMaskSame;
return ERROR_BAD_FORMAT;
}
return NO_ERROR;
}
// Enables/disables windows in the dialog box depending
// on the tcpip parameters
//
DWORD
TcpipEnableWindows(
HWND hwndDlg,
TCPIP_PARAMS * pTcpipParams)
{
EnableWindow(
GetDlgItem(
hwndDlg,
CID_NetTab_Tcpipui_EB_Start),
!pTcpipParams->bUseDhcp);
EnableWindow(
GetDlgItem(
hwndDlg,
CID_NetTab_Tcpipui_EB_Mask),
!pTcpipParams->bUseDhcp);
return NO_ERROR;
}
// Generates number formatting data
//
DWORD
TcpipGenerateNumberFormatter (
NUMBERFMT * pNumFmt)
{
CHAR pszNeg[64], pszLz[2];
ZeroMemory (pNumFmt->lpDecimalSep, 4);
pNumFmt->NumDigits = 0;
pNumFmt->Grouping = 3;
GetLocaleInfoA (LOCALE_SYSTEM_DEFAULT,
LOCALE_ILZERO,
pszLz,
2);
GetLocaleInfoW (LOCALE_SYSTEM_DEFAULT,
LOCALE_STHOUSAND,
pNumFmt->lpThousandSep,
2);
GetLocaleInfoA (LOCALE_SYSTEM_DEFAULT,
LOCALE_INEGNUMBER,
pszNeg,
2);
pNumFmt->LeadingZero = atoi(pszLz);
pNumFmt->NegativeOrder = atoi(pszNeg);
return NO_ERROR;
}
// Formats an unsigned number with commas, etc.
//
PWCHAR
TcpipFormatDword(
DWORD dwVal)
{
static WCHAR pszRet[64], pszDSep[2], pszTSep[2] = {0,0};
static NUMBERFMT NumberFmt = {0,0,0,pszDSep,pszTSep,0};
static BOOL bInitialized = FALSE;
WCHAR pszNum[64];
// Stringize the number
wsprintfW (pszNum, L"%u", dwVal);
pszRet[0] = (WCHAR)0;
// Initialize number formatting
if (!bInitialized)
{
TcpipGenerateNumberFormatter (&NumberFmt);
bInitialized = TRUE;
}
// Get the local version of this
GetNumberFormatW (
LOCALE_SYSTEM_DEFAULT,
0,
pszNum,
&NumberFmt,
pszRet,
sizeof(pszRet) / sizeof(WCHAR));
return pszRet;
}
// Sets the range and total incoming clients fields of the tcpip properties
// dialog.
//
DWORD
TcpipReCalcPoolSize(
HWND hwndDlg)
{
HWND hwndStart, hwndEnd, hwndTotal;
DWORD dwStart = 0, dwEnd = 0, dwTotal=0;
WCHAR pszBuf[256];
hwndStart = GetDlgItem(hwndDlg, CID_NetTab_Tcpipui_EB_Start);
hwndEnd = GetDlgItem(hwndDlg, CID_NetTab_Tcpipui_EB_Mask);
hwndTotal = GetDlgItem(hwndDlg, CID_NetTab_Tcpipui_EB_Total);
SendMessage(hwndStart, IP_GETADDRESS, 0, (LPARAM)&dwStart);
SendMessage(hwndEnd, IP_GETADDRESS, 0, (LPARAM)&dwEnd);
//For whistler bug 281545 gangz
//
if ( 0 == dwStart )
{
dwTotal = dwEnd - dwStart;
}
else
{
if (dwEnd >= dwStart)
{
dwTotal = dwEnd - dwStart + 1;
}
else
{
dwTotal = 0;
}
}
SetWindowTextW(hwndTotal, TcpipFormatDword(dwTotal) );
return NO_ERROR;
}
// Initializes the Tcpip Properties Dialog
//
DWORD
TcpipInitDialog(
HWND hwndDlg,
LPARAM lParam)
{
LPSTR pszAddr;
TCPIP_PARAMS * pTcpipParams = (TCPIP_PARAMS *)
(((PROT_EDIT_DATA*)lParam)->pbData);
HWND hwndFrom, hwndTo;
WCHAR pszAddrW[256];
// Store the parameters with the window handle
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
// Set the network exposure check
SendDlgItemMessage(
hwndDlg,
CID_NetTab_Tcpipui_CB_ExposeNetwork,
BM_SETCHECK,
(((PROT_EDIT_DATA*)lParam)->bExpose) ? BST_CHECKED : BST_UNCHECKED,
0);
// Set the address assignmnet radio buttons
SendDlgItemMessage(
hwndDlg,
CID_NetTab_Tcpipui_RB_Dhcp,
BM_SETCHECK,
(pTcpipParams->bUseDhcp) ? BST_CHECKED : BST_UNCHECKED,
0);
// Set the address assignmnet radio buttons
SendDlgItemMessage(
hwndDlg,
CID_NetTab_Tcpipui_RB_StaticPool,
BM_SETCHECK,
(pTcpipParams->bUseDhcp) ? BST_UNCHECKED : BST_CHECKED,
0);
// Set the "allow caller to specify ip address" check
SendDlgItemMessage(
hwndDlg,
CID_NetTab_Tcpipui_CB_CallerSpec,
BM_SETCHECK,
(pTcpipParams->bCaller) ? BST_CHECKED : BST_UNCHECKED,
0);
// Set the text of the ip addresses
if (pTcpipParams->dwPoolStart != 0)
{
hwndFrom = GetDlgItem(hwndDlg, CID_NetTab_Tcpipui_EB_Start);
hwndTo = GetDlgItem(hwndDlg, CID_NetTab_Tcpipui_EB_Mask);
TcpipDwordToAddr(pTcpipParams->dwPoolStart, pszAddrW);
SetWindowText(hwndFrom, pszAddrW);
TcpipDwordToAddr(pTcpipParams->dwPoolEnd, pszAddrW);
SetWindowText(hwndTo, pszAddrW);
}
// Enable/disable windows as per the settings
TcpipEnableWindows(hwndDlg, pTcpipParams);
return NO_ERROR;
}
// Gets the settings from the ui and puts them into
// the tcpip parameter structure.
//
DWORD
TcpipGetUISettings(
IN HWND hwndDlg,
OUT PROT_EDIT_DATA * pEditData,
OUT LPDWORD lpdwFrom,
OUT LPDWORD lpdwTo)
{
TCPIP_PARAMS * pTcpipParams =
(TCPIP_PARAMS *) pEditData->pbData;
HWND hwndFrom, hwndTo;
hwndFrom = GetDlgItem(hwndDlg, CID_NetTab_Tcpipui_EB_Start);
hwndTo = GetDlgItem(hwndDlg, CID_NetTab_Tcpipui_EB_Mask);
pEditData->bExpose =
SendDlgItemMessage(
hwndDlg,
CID_NetTab_Tcpipui_CB_ExposeNetwork,
BM_GETCHECK,
0,
0) == BST_CHECKED;
SendMessage(
hwndFrom,
IP_GETADDRESS,
0,
(LPARAM)&pTcpipParams->dwPoolStart);
SendMessage(
hwndTo,
IP_GETADDRESS,
0,
(LPARAM)&pTcpipParams->dwPoolEnd);
*lpdwFrom = pTcpipParams->dwPoolStart;
*lpdwTo = pTcpipParams->dwPoolEnd;
return NO_ERROR;
}
DWORD
TcpipUiHandleOk(
IN HWND hwndDlg)
{
PROT_EDIT_DATA* pData = NULL;
TCPIP_PARAMS * pParams = NULL;
DWORD dwErr, dwId = SID_TCPIP_InvalidPool;
DWORD dwStart = 0, dwEnd = 0;
PWCHAR pszMessage = NULL;
MSGARGS MsgArgs;
// Get the context
//
pData = (PROT_EDIT_DATA*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
if (pData == NULL)
{
return ERROR_CAN_NOT_COMPLETE;
}
// Read values from the UI
//
dwErr = TcpipGetUISettings(hwndDlg, pData, &dwStart, &dwEnd);
if (dwErr != NO_ERROR)
{
return dwErr;
}
// Validate the pool if one was entered
//
pParams = (TCPIP_PARAMS *)pData->pbData;
if (pParams->bUseDhcp == FALSE)
{
dwErr = TcpipUiValidatePool(
dwStart,
dwEnd,
&dwId);
if (dwErr != NO_ERROR)
{
ZeroMemory(&MsgArgs, sizeof(MsgArgs));
MsgArgs.dwFlags = MB_OK;
MsgDlgUtil(
hwndDlg,
dwId,
&MsgArgs,
Globals.hInstDll,
SID_DEFAULT_MSG_TITLE);
}
}
return dwErr;
}
// Dialog proc that governs the tcpip settings dialog
INT_PTR
CALLBACK
TcpipSettingsDialogProc (
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) {
case WM_INITDIALOG:
TcpipInitDialog(hwndDlg, lParam);
return FALSE;
case WM_HELP:
case WM_CONTEXTMENU:
{
RasSrvHelp (hwndDlg, uMsg, wParam, lParam, phmTcpipui);
break;
}
case WM_DESTROY:
// Cleanup the work done at WM_INITDIALOG
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0);
break;
case WM_COMMAND:
{
TCPIP_PARAMS * pTcpipParams = (TCPIP_PARAMS *)
(((PROT_EDIT_DATA*)
GetWindowLongPtr(hwndDlg, GWLP_USERDATA))->pbData);
switch (wParam)
{
case IDOK:
if (TcpipUiHandleOk(hwndDlg) == NO_ERROR)
{
EndDialog(hwndDlg, 1);
}
break;
case IDCANCEL:
EndDialog(hwndDlg, 0);
break;
case CID_NetTab_Tcpipui_RB_Dhcp:
pTcpipParams->bUseDhcp = TRUE;
TcpipEnableWindows(hwndDlg, pTcpipParams);
break;
case CID_NetTab_Tcpipui_RB_StaticPool:
pTcpipParams->bUseDhcp = FALSE;
TcpipEnableWindows(hwndDlg, pTcpipParams);
break;
case CID_NetTab_Tcpipui_CB_CallerSpec:
pTcpipParams->bCaller = (BOOL)
SendDlgItemMessage(
hwndDlg,
CID_NetTab_Tcpipui_CB_CallerSpec,
BM_GETCHECK,
0,
0);
break;
}
// Recal the pool size as appropriate
//
if (HIWORD(wParam) == EN_CHANGE)
{
if (LOWORD(wParam) == CID_NetTab_Tcpipui_EB_Start ||
LOWORD(wParam) == CID_NetTab_Tcpipui_EB_Mask)
{
TcpipReCalcPoolSize(hwndDlg);
}
}
break;
}
}
return FALSE;
}
// Edits tcp ip protocol properties
//
DWORD
TcpipEditProperties(
HWND hwndParent,
PROT_EDIT_DATA * pEditData,
BOOL * pbCommit)
{
DWORD dwErr;
int ret;
// Initialize the ip address custom controls
IpAddrInit(Globals.hInstDll, SID_TCPIP_TITLE, SID_TCPIP_BADRANGE);
// Popup the dialog box
ret = (int) DialogBoxParam(
Globals.hInstDll,
MAKEINTRESOURCE(DID_NetTab_Tcpipui),
hwndParent,
TcpipSettingsDialogProc,
(LPARAM)pEditData);
if (ret == -1)
{
TcpipUiDisplayError(hwndParent, ERR_TCPIP_CANT_DISPLAY);
}
// If ok was pressed, save off the new settings
*pbCommit = FALSE;
if (ret && ret != -1)
{
*pbCommit = TRUE;
}
return NO_ERROR;
}