mirror of
https://github.com/reactos/reactos.git
synced 2025-06-03 16:30:26 +00:00
Prepare front-end for saving settings
svn path=/trunk/; revision=20758
This commit is contained in:
parent
29f2266458
commit
d0ab58d96c
5 changed files with 383 additions and 216 deletions
|
@ -60,22 +60,22 @@ CAPTION "General"
|
|||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
LTEXT "You can get IP settings assigned automatically if your network supports this capability. Otherwise, you need to ask your network administrator for the appropriate IP settings.", -1, 9, 9, 228, 27
|
||||
CONTROL "Obtain the IP address automatically", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP, 14, 43, 210, 12
|
||||
CONTROL "Obtain the IP address automatically", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 43, 210, 12
|
||||
GROUPBOX "", -1, 9, 61, 228, 70, BS_GROUPBOX
|
||||
CONTROL "&Use the following IP address:", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON, 14, 59, 105, 12
|
||||
LTEXT "IP address:", -1, 14, 75, 135, 8
|
||||
CONTROL "",IDC_IPADDR,"SysIPAddress32",0,150,75-2,80,12
|
||||
CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP,150,75-2,80,12
|
||||
LTEXT "Subnet mask:", -1, 14, 90, 135, 8
|
||||
CONTROL "",IDC_SUBNETMASK,"SysIPAddress32",0,150,90-2,80,12
|
||||
CONTROL "",IDC_SUBNETMASK,"SysIPAddress32",WS_TABSTOP,150,90-2,80,12
|
||||
LTEXT "Default gateway:", -1, 14, 105, 135, 8
|
||||
CONTROL "",IDC_DEFGATEWAY,"SysIPAddress32",0,150,105-2,80,12
|
||||
CONTROL "Obtain the DNS server address automatically", IDC_AUTODNS, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP, 14, 139, 210, 12
|
||||
CONTROL "",IDC_DEFGATEWAY,"SysIPAddress32",WS_TABSTOP,150,105-2,80,12
|
||||
CONTROL "Obtain the DNS server address automatically", IDC_AUTODNS, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 139, 210, 12
|
||||
GROUPBOX "", -1, 9, 157, 228, 47, BS_GROUPBOX
|
||||
CONTROL "&Use the following DNS server addresses", IDC_FIXEDDNS, "BUTTON", BS_AUTORADIOBUTTON, 14, 155, 142, 12
|
||||
LTEXT "Preferred DNS server:", -1, 14, 171, 135, 8
|
||||
CONTROL "",IDC_DNS1,"SysIPAddress32",0,150,171-2,80,12
|
||||
CONTROL "",IDC_DNS1,"SysIPAddress32",WS_TABSTOP,150,171-2,80,12
|
||||
LTEXT "Alternate DNS server:", -1, 14, 186, 135, 8
|
||||
CONTROL "",IDC_DNS2,"SysIPAddress32",0,150,186-2,80,12
|
||||
CONTROL "",IDC_DNS2,"SysIPAddress32",WS_TABSTOP,150,186-2,80,12
|
||||
PUSHBUTTON "&Advanced", IDC_ADVANCED, 186, 209, 50, 14, WS_DISABLED | WS_TABSTOP
|
||||
}
|
||||
|
||||
|
@ -85,3 +85,14 @@ BEGIN
|
|||
IDS_CPLSYSTEMNAME "Network Properties"
|
||||
IDS_CPLSYSTEMDESCRIPTION "Customizes network settings."
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_ERROR "Error"
|
||||
IDS_ENTER_VALID_IPADDRESS "You must enter a valid IP address"
|
||||
IDS_ENTER_VALID_SUBNET "You must enter a valid subnet mask"
|
||||
IDS_CANNOT_LOAD_CONFIG "Unable to load current config data"
|
||||
IDS_CANNOT_CREATE_PROPSHEET "Unable to create property sheet"
|
||||
IDS_OUT_OF_MEMORY "Out of memory"
|
||||
IDS_CANNOT_SAVE_CHANGES "Unable to save the changes you made"
|
||||
END
|
||||
|
|
|
@ -25,6 +25,14 @@
|
|||
|
||||
#define IDS_CPLSYSTEMNAME 1001
|
||||
#define IDS_CPLSYSTEMDESCRIPTION 2001
|
||||
#define IDS_ERROR 3001
|
||||
#define IDS_ENTER_VALID_IPADDRESS 3002
|
||||
#define IDS_ENTER_VALID_SUBNET 3003
|
||||
#define IDS_CANNOT_LOAD_CONFIG 3004
|
||||
#define IDS_CANNOT_CREATE_PROPSHEET 3005
|
||||
#define IDS_OUT_OF_MEMORY 3006
|
||||
#define IDS_CANNOT_SAVE_CHANGES 3007
|
||||
|
||||
|
||||
/* controls */
|
||||
#define IDC_NETCARDLIST 100
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
* FILE: lib/cpl/system/tcpip_properties.c
|
||||
* PURPOSE: ReactOS Network Control Panel
|
||||
* COPYRIGHT: Copyright 2004 Gero Kuehn (reactos.filter@gkware.com)
|
||||
* Copyright 2006 Ge van Geldorp <gvg@reactos.org>
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -29,257 +30,368 @@
|
|||
|
||||
#endif
|
||||
|
||||
|
||||
#include "resource.h"
|
||||
#include "ncpa.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
typedef struct _TCPIP_PROPERTIES_DATA {
|
||||
DWORD AdapterIndex;
|
||||
char *AdapterName;
|
||||
BOOL DhcpEnabled;
|
||||
DWORD IpAddress;
|
||||
DWORD SubnetMask;
|
||||
DWORD Gateway;
|
||||
DWORD Dns1;
|
||||
DWORD Dns2;
|
||||
BOOL OldDhcpEnabled;
|
||||
DWORD OldIpAddress;
|
||||
DWORD OldSubnetMask;
|
||||
DWORD OldGateway;
|
||||
DWORD OldDns1;
|
||||
DWORD OldDns2;
|
||||
} TCPIP_PROPERTIES_DATA, *PTCPIP_PROPERTIES_DATA;
|
||||
|
||||
void InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc);
|
||||
DWORD APIENTRY DhcpNotifyConfigChange(LPWSTR ServerName, LPWSTR AdapterName,
|
||||
BOOL NewIpAddress, DWORD IpIndex,
|
||||
DWORD IpAddress, DWORD SubnetMask,
|
||||
int DhcpAction);
|
||||
|
||||
|
||||
static void
|
||||
ManualDNS( HWND hwndDlg, BOOL Enabled ) {
|
||||
CheckDlgButton(hwndDlg, IDC_FIXEDDNS, Enabled ? BST_CHECKED : BST_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_AUTODNS, Enabled ? BST_UNCHECKED : BST_CHECKED);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), Enabled);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), Enabled);
|
||||
if ( ! Enabled ) {
|
||||
SendDlgItemMessage(hwndDlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0);
|
||||
SendDlgItemMessage(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
|
||||
ManualDNS(HWND Dlg, BOOL Enabled) {
|
||||
CheckDlgButton(Dlg, IDC_FIXEDDNS,
|
||||
Enabled ? BST_CHECKED : BST_UNCHECKED);
|
||||
CheckDlgButton(Dlg, IDC_AUTODNS,
|
||||
Enabled ? BST_UNCHECKED : BST_CHECKED);
|
||||
EnableWindow(GetDlgItem(Dlg, IDC_DNS1), Enabled);
|
||||
EnableWindow(GetDlgItem(Dlg, IDC_DNS2), Enabled);
|
||||
if (! Enabled) {
|
||||
SendDlgItemMessage(Dlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0);
|
||||
SendDlgItemMessage(Dlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
EnableDHCP( HWND hwndDlg, BOOL Enabled ) {
|
||||
CheckDlgButton(hwndDlg, IDC_USEDHCP, Enabled ? BST_CHECKED : BST_UNCHECKED);
|
||||
CheckDlgButton(hwndDlg, IDC_NODHCP, Enabled ? BST_UNCHECKED : BST_CHECKED);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), ! Enabled);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), ! Enabled);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), ! Enabled);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), Enabled);
|
||||
if ( Enabled ) {
|
||||
SendDlgItemMessage(hwndDlg, IDC_IPADDR, IPM_CLEARADDRESS, 0, 0);
|
||||
SendDlgItemMessage(hwndDlg, IDC_SUBNETMASK, IPM_CLEARADDRESS, 0, 0);
|
||||
SendDlgItemMessage(hwndDlg, IDC_DEFGATEWAY, IPM_CLEARADDRESS, 0, 0);
|
||||
EnableDHCP(HWND Dlg, BOOL Enabled) {
|
||||
CheckDlgButton(Dlg, IDC_USEDHCP, Enabled ? BST_CHECKED : BST_UNCHECKED);
|
||||
CheckDlgButton(Dlg, IDC_NODHCP, Enabled ? BST_UNCHECKED : BST_CHECKED);
|
||||
EnableWindow(GetDlgItem(Dlg, IDC_IPADDR), ! Enabled);
|
||||
EnableWindow(GetDlgItem(Dlg, IDC_SUBNETMASK), ! Enabled);
|
||||
EnableWindow(GetDlgItem(Dlg, IDC_DEFGATEWAY), ! Enabled);
|
||||
EnableWindow(GetDlgItem(Dlg, IDC_AUTODNS), Enabled);
|
||||
if (Enabled) {
|
||||
SendDlgItemMessage(Dlg, IDC_IPADDR, IPM_CLEARADDRESS, 0, 0);
|
||||
SendDlgItemMessage(Dlg, IDC_SUBNETMASK, IPM_CLEARADDRESS, 0, 0);
|
||||
SendDlgItemMessage(Dlg, IDC_DEFGATEWAY, IPM_CLEARADDRESS, 0, 0);
|
||||
} else {
|
||||
ManualDNS(hwndDlg, TRUE);
|
||||
ManualDNS(Dlg, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ShowError(HWND Parent, UINT MsgId)
|
||||
{
|
||||
WCHAR Error[32], Msg[64];
|
||||
|
||||
if (0 == LoadStringW((HINSTANCE) GetWindowLongPtrW(Parent, GWLP_HINSTANCE),
|
||||
IDS_ERROR, Error, sizeof(Error) / sizeof(Error[0]))) {
|
||||
wcscpy(Error, L"Error");
|
||||
}
|
||||
if (0 == LoadStringW((HINSTANCE) GetWindowLongPtrW(Parent, GWLP_HINSTANCE),
|
||||
MsgId, Msg, sizeof(Msg) / sizeof(Msg[0]))) {
|
||||
wcscpy(Msg, L"Unknown error");
|
||||
}
|
||||
MessageBoxW(Parent, Msg, Error, MB_OK | MB_ICONSTOP);
|
||||
}
|
||||
|
||||
static BOOL
|
||||
GetAddressFromField( HWND hwndDlg, UINT CtlId,
|
||||
DWORD *dwIPAddr,
|
||||
const char **AddressString ) {
|
||||
LRESULT lResult;
|
||||
struct in_addr inIPAddr;
|
||||
ValidateAndStore(HWND Dlg, PTCPIP_PROPERTIES_DATA DlgData)
|
||||
{
|
||||
DWORD IpAddress;
|
||||
|
||||
*AddressString = NULL;
|
||||
DlgData->DhcpEnabled = (BST_CHECKED ==
|
||||
IsDlgButtonChecked(Dlg, IDC_USEDHCP));
|
||||
if (! DlgData->DhcpEnabled) {
|
||||
if (4 != SendMessageW(GetDlgItem(Dlg, IDC_IPADDR), IPM_GETADDRESS,
|
||||
0, (LPARAM) &IpAddress)) {
|
||||
ShowError(Dlg, IDS_ENTER_VALID_IPADDRESS);
|
||||
SetFocus(GetDlgItem(Dlg, IDC_IPADDR));
|
||||
return FALSE;
|
||||
}
|
||||
DlgData->IpAddress = htonl(IpAddress);
|
||||
if (4 != SendMessageW(GetDlgItem(Dlg, IDC_SUBNETMASK), IPM_GETADDRESS,
|
||||
0, (LPARAM) &IpAddress)) {
|
||||
ShowError(Dlg, IDS_ENTER_VALID_SUBNET);
|
||||
SetFocus(GetDlgItem(Dlg, IDC_SUBNETMASK));
|
||||
return FALSE;
|
||||
}
|
||||
DlgData->SubnetMask = htonl(IpAddress);
|
||||
if (4 != SendMessageW(GetDlgItem(Dlg, IDC_DEFGATEWAY), IPM_GETADDRESS,
|
||||
0, (LPARAM) &IpAddress)) {
|
||||
DlgData->Gateway = INADDR_NONE;
|
||||
} else {
|
||||
DlgData->Gateway = htonl(IpAddress);
|
||||
}
|
||||
ASSERT(BST_CHECKED == IsDlgButtonChecked(Dlg, IDC_FIXEDDNS));
|
||||
} else {
|
||||
DlgData->IpAddress = INADDR_NONE;
|
||||
DlgData->SubnetMask = INADDR_NONE;
|
||||
DlgData->Gateway = INADDR_NONE;
|
||||
}
|
||||
|
||||
lResult = SendMessage(GetDlgItem(hwndDlg, IDC_IPADDR), IPM_GETADDRESS, 0,
|
||||
(ULONG_PTR)dwIPAddr);
|
||||
if( lResult != 4 ) return FALSE;
|
||||
|
||||
inIPAddr.s_addr = *dwIPAddr;
|
||||
*AddressString = inet_ntoa(inIPAddr);
|
||||
if( !*AddressString ) return FALSE;
|
||||
if (BST_CHECKED == IsDlgButtonChecked(Dlg, IDC_FIXEDDNS)) {
|
||||
if (4 != SendMessageW(GetDlgItem(Dlg, IDC_DNS1), IPM_GETADDRESS,
|
||||
0, (LPARAM) &IpAddress)) {
|
||||
DlgData->Dns1 = INADDR_NONE;
|
||||
} else {
|
||||
DlgData->Dns1 = htonl(IpAddress);
|
||||
}
|
||||
if (4 != SendMessageW(GetDlgItem(Dlg, IDC_DNS2), IPM_GETADDRESS,
|
||||
0, (LPARAM) &IpAddress)) {
|
||||
DlgData->Dns2 = INADDR_NONE;
|
||||
} else {
|
||||
DlgData->Dns2 = htonl(IpAddress);
|
||||
}
|
||||
} else {
|
||||
DlgData->Dns1 = INADDR_NONE;
|
||||
DlgData->Dns2 = INADDR_NONE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
InternTCPIPSettings( HWND hwndDlg ) {
|
||||
PROPSHEETPAGE *pPage = (PROPSHEETPAGE *)GetWindowLongPtr(hwndDlg,GWL_USERDATA);
|
||||
IP_ADAPTER_INFO *pInfo = NULL;
|
||||
TCHAR pszRegKey[MAX_PATH];
|
||||
HKEY hKey = NULL;
|
||||
DWORD IpAddress, NetMask, Gateway;
|
||||
const char *AddressString;
|
||||
BOOL RetVal = FALSE;
|
||||
BOOL DhcpEnabled = FALSE;
|
||||
MIB_IPFORWARDROW RowToAdd = { 0 };
|
||||
|
||||
if(pPage)
|
||||
pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
|
||||
InternTCPIPSettings(HWND Dlg, PTCPIP_PROPERTIES_DATA DlgData) {
|
||||
BOOL Changed;
|
||||
BOOL IpChanged;
|
||||
int DhcpAction;
|
||||
LPWSTR AdapterName;
|
||||
|
||||
if( !pPage || !pInfo ) goto cleanup;
|
||||
|
||||
_stprintf(pszRegKey,_T("SYSTEM\\CurrentControlSet\\Services\\TCPIP\\Parameters\\Interfaces\\%S"),pInfo->AdapterName);
|
||||
if(RegOpenKey(HKEY_LOCAL_MACHINE,pszRegKey,&hKey)!=ERROR_SUCCESS) goto cleanup;
|
||||
|
||||
if( !GetAddressFromField
|
||||
( hwndDlg, IDC_IPADDR, &IpAddress, &AddressString ) ||
|
||||
RegSetValueEx
|
||||
( hKey, _T("IPAddress"), 0, REG_SZ, (const BYTE*)AddressString,
|
||||
strlen(AddressString) ) != ERROR_SUCCESS )
|
||||
goto cleanup;
|
||||
|
||||
if( !GetAddressFromField
|
||||
( hwndDlg, IDC_SUBNETMASK, &NetMask, &AddressString ) ||
|
||||
RegSetValueEx
|
||||
( hKey, _T("SubnetMask"), 0, REG_SZ, (const BYTE*)AddressString,
|
||||
strlen(AddressString) ) != ERROR_SUCCESS )
|
||||
goto cleanup;
|
||||
|
||||
if( DhcpEnabled ) /* FIXME - DhcpEnabled is never initialized at this point! */
|
||||
DhcpLeaseIpAddress( pInfo->Index );
|
||||
else {
|
||||
DhcpReleaseIpAddressLease( pInfo->Index );
|
||||
DhcpStaticRefreshParams( pInfo->Index, IpAddress, NetMask );
|
||||
if (! ValidateAndStore(Dlg, DlgData)) {
|
||||
/* Should never happen, we should have validated at PSN_KILLACTIVE */
|
||||
ASSERT(FALSE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if( !GetAddressFromField
|
||||
( hwndDlg, IDC_DEFGATEWAY, &Gateway, &AddressString ) ||
|
||||
RegSetValueEx
|
||||
( hKey, _T("DefaultGateway"), 0, REG_SZ, (const BYTE*)AddressString,
|
||||
strlen(AddressString) ) != ERROR_SUCCESS )
|
||||
goto cleanup;
|
||||
|
||||
/* If not on DHCP then add a default gateway, assuming one was specified */
|
||||
if( !DhcpEnabled ) {
|
||||
RowToAdd.dwForwardMask = 0;
|
||||
RowToAdd.dwForwardMetric1 = 1;
|
||||
RowToAdd.dwForwardNextHop = Gateway;
|
||||
CreateIpForwardEntry( &RowToAdd );
|
||||
Changed = FALSE;
|
||||
if (DlgData->DhcpEnabled) {
|
||||
Changed = ! DlgData->OldDhcpEnabled;
|
||||
IpChanged = FALSE;
|
||||
DhcpAction = 1;
|
||||
} else {
|
||||
Changed = DlgData->OldDhcpEnabled ||
|
||||
DlgData->IpAddress != DlgData->OldIpAddress ||
|
||||
DlgData->SubnetMask != DlgData->OldSubnetMask;
|
||||
IpChanged = DlgData->OldDhcpEnabled ||
|
||||
DlgData->IpAddress != DlgData->OldIpAddress;
|
||||
DhcpAction = 2;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
if( hKey ) RegCloseKey( hKey );
|
||||
if (Changed) {
|
||||
AdapterName = HeapAlloc(GetProcessHeap(), 0,
|
||||
(strlen(DlgData->AdapterName) + 1) *
|
||||
sizeof(WCHAR));
|
||||
if (NULL == AdapterName) {
|
||||
ShowError(Dlg, IDS_OUT_OF_MEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
MultiByteToWideChar(CP_THREAD_ACP, 0, DlgData->AdapterName, -1,
|
||||
AdapterName, strlen(DlgData->AdapterName) + 1);
|
||||
if (0 == DhcpNotifyConfigChange(NULL, AdapterName, IpChanged,
|
||||
DlgData->AdapterIndex,
|
||||
DlgData->IpAddress,
|
||||
DlgData->SubnetMask, DhcpAction)) {
|
||||
HeapFree(GetProcessHeap(), 0, AdapterName);
|
||||
ShowError(Dlg, IDS_CANNOT_SAVE_CHANGES);
|
||||
return FALSE;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, AdapterName);
|
||||
}
|
||||
|
||||
return RetVal;
|
||||
/* FIXME Save default gateway and DNS entries */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static INT_PTR CALLBACK
|
||||
TCPIPPropertyPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
TCPIPPropertyPageProc(HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
PROPSHEETPAGE *pPage = (PROPSHEETPAGE *)GetWindowLongPtr(hwndDlg,GWL_USERDATA);
|
||||
IP_ADAPTER_INFO *pInfo = NULL;
|
||||
int StaticDNS = 0;
|
||||
char *NextDNSServer;
|
||||
LPPROPSHEETPAGEW Page;
|
||||
PTCPIP_PROPERTIES_DATA DlgData;
|
||||
LPNMHDR Nmhdr;
|
||||
|
||||
if(pPage)
|
||||
pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
|
||||
switch(uMsg)
|
||||
{
|
||||
DlgData = (PTCPIP_PROPERTIES_DATA) GetWindowLongPtrW(Dlg, GWL_USERDATA);
|
||||
switch(uMsg) {
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
pPage = (PROPSHEETPAGE *)lParam;
|
||||
pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
|
||||
EnableWindow(GetDlgItem(hwndDlg,IDC_ADVANCED),FALSE);
|
||||
SetWindowLongPtr(hwndDlg,GWL_USERDATA,(DWORD_PTR)pPage->lParam);
|
||||
Page = (LPPROPSHEETPAGEW) lParam;
|
||||
DlgData = (PTCPIP_PROPERTIES_DATA) Page->lParam;
|
||||
SetWindowLongPtrW(Dlg, GWL_USERDATA, Page->lParam);
|
||||
|
||||
EnableDHCP( hwndDlg, pInfo->DhcpEnabled );
|
||||
EnableWindow(GetDlgItem(Dlg, IDC_ADVANCED), FALSE);
|
||||
|
||||
if ( ! pInfo->DhcpEnabled )
|
||||
EnableDHCP(Dlg, DlgData->OldDhcpEnabled);
|
||||
|
||||
if (! DlgData->OldDhcpEnabled)
|
||||
{
|
||||
DWORD dwIPAddr;
|
||||
IP_ADDR_STRING *pString;
|
||||
pString = &pInfo->IpAddressList;
|
||||
while(pString->Next)
|
||||
pString = pString->Next;
|
||||
dwIPAddr = inet_addr(pString->IpAddress.String);
|
||||
SendDlgItemMessage(hwndDlg,IDC_IPADDR,IPM_SETADDRESS,0,
|
||||
ntohl(dwIPAddr));
|
||||
dwIPAddr = inet_addr(pString->IpMask.String);
|
||||
SendDlgItemMessage(hwndDlg,IDC_SUBNETMASK,IPM_SETADDRESS,0,
|
||||
ntohl(dwIPAddr));
|
||||
|
||||
pString = &pInfo->GatewayList;
|
||||
while(pString->Next)
|
||||
pString = pString->Next;
|
||||
dwIPAddr = inet_addr(pString->IpAddress.String);
|
||||
SendDlgItemMessage(hwndDlg,IDC_DEFGATEWAY,IPM_SETADDRESS,0,
|
||||
ntohl(dwIPAddr));
|
||||
|
||||
}
|
||||
{
|
||||
TCHAR pszRegKey[MAX_PATH];
|
||||
HKEY hKey;
|
||||
_stprintf(pszRegKey,_T("SYSTEM\\CurrentControlSet\\Services\\TCPIP\\Parameters\\Interfaces\\%S"),pInfo->AdapterName);
|
||||
if(RegOpenKey(HKEY_LOCAL_MACHINE,pszRegKey,&hKey)==ERROR_SUCCESS)
|
||||
{
|
||||
char pszDNS[MAX_PATH];
|
||||
DWORD dwSize = sizeof(pszDNS);
|
||||
DWORD dwType = REG_SZ;
|
||||
DWORD dwIPAddr;
|
||||
RegQueryValueExA(hKey,"NameServer",NULL,&dwType,(BYTE*)pszDNS,&dwSize);
|
||||
RegCloseKey(hKey);
|
||||
|
||||
NextDNSServer = pszDNS;
|
||||
|
||||
while( NextDNSServer && *NextDNSServer && StaticDNS < 2 ) {
|
||||
dwIPAddr = inet_addr(NextDNSServer);
|
||||
if( dwIPAddr != INADDR_NONE ) {
|
||||
SendDlgItemMessage(hwndDlg,IDC_DNS1 + StaticDNS,
|
||||
IPM_SETADDRESS,0,ntohl(dwIPAddr));
|
||||
StaticDNS++;
|
||||
}
|
||||
NextDNSServer = strchr( pszDNS, ',' );
|
||||
if( NextDNSServer )
|
||||
NextDNSServer++;
|
||||
}
|
||||
if (INADDR_NONE != DlgData->OldIpAddress) {
|
||||
SendDlgItemMessage(Dlg, IDC_IPADDR, IPM_SETADDRESS, 0,
|
||||
ntohl(DlgData->OldIpAddress));
|
||||
}
|
||||
if (INADDR_NONE != DlgData->OldSubnetMask) {
|
||||
SendDlgItemMessage(Dlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0,
|
||||
ntohl(DlgData->OldSubnetMask));
|
||||
}
|
||||
if (INADDR_NONE != DlgData->OldGateway) {
|
||||
SendDlgItemMessage(Dlg, IDC_DEFGATEWAY, IPM_SETADDRESS, 0,
|
||||
ntohl(DlgData->OldGateway));
|
||||
}
|
||||
ManualDNS( hwndDlg, StaticDNS );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
if (INADDR_NONE != DlgData->OldDns1) {
|
||||
SendDlgItemMessage(Dlg, IDC_DNS1, IPM_SETADDRESS, 0,
|
||||
ntohl(DlgData->OldDns1));
|
||||
if (INADDR_NONE != DlgData->OldDns2) {
|
||||
SendDlgItemMessage(Dlg, IDC_DNS2, IPM_SETADDRESS, 0,
|
||||
ntohl(DlgData->OldDns2));
|
||||
}
|
||||
}
|
||||
ManualDNS(Dlg, INADDR_NONE != DlgData->OldDns1);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch(LOWORD(wParam))
|
||||
{
|
||||
switch(LOWORD(wParam)) {
|
||||
case IDC_FIXEDDNS:
|
||||
ManualDNS( hwndDlg, TRUE );
|
||||
break;
|
||||
ManualDNS(Dlg, TRUE);
|
||||
return TRUE;
|
||||
|
||||
case IDC_AUTODNS:
|
||||
ManualDNS( hwndDlg, FALSE );
|
||||
break;
|
||||
ManualDNS(Dlg, FALSE);
|
||||
return TRUE;
|
||||
|
||||
case IDC_USEDHCP:
|
||||
EnableDHCP( hwndDlg, TRUE );
|
||||
break;
|
||||
EnableDHCP(Dlg, TRUE);
|
||||
return TRUE;
|
||||
|
||||
case IDC_NODHCP:
|
||||
EnableDHCP( hwndDlg, FALSE );
|
||||
break;
|
||||
EnableDHCP(Dlg, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case IDOK:
|
||||
case WM_NOTIFY:
|
||||
Nmhdr = (LPNMHDR) lParam;
|
||||
|
||||
switch(Nmhdr->code) {
|
||||
case PSN_KILLACTIVE:
|
||||
/* Do validation here, must set FALSE to continue */
|
||||
SetWindowLongPtrW(Dlg, DWL_MSGRESULT,
|
||||
(LONG_PTR) ! ValidateAndStore(Dlg, DlgData));
|
||||
return TRUE;
|
||||
|
||||
case PSN_APPLY:
|
||||
/* Set the IP Address and DNS Information so we won't
|
||||
* be doing all this for nothing */
|
||||
InternTCPIPSettings( hwndDlg );
|
||||
break;
|
||||
SetWindowLongPtrW(Dlg, DWL_MSGRESULT,
|
||||
InternTCPIPSettings(Dlg, DlgData) ?
|
||||
PSNRET_NOERROR : PSNRET_INVALID);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void DisplayTCPIPProperties(HWND hParent,IP_ADAPTER_INFO *pInfo)
|
||||
static BOOL
|
||||
LoadDataFromInfo(PTCPIP_PROPERTIES_DATA DlgData, IP_ADAPTER_INFO *Info)
|
||||
{
|
||||
PROPSHEETPAGE psp[1];
|
||||
PROPSHEETHEADER psh;
|
||||
INITCOMMONCONTROLSEX cce;
|
||||
IP_ADDR_STRING *pString;
|
||||
WCHAR RegKey[MAX_PATH];
|
||||
HKEY hKey;
|
||||
char Dns[MAX_PATH];
|
||||
DWORD Size;
|
||||
DWORD Type;
|
||||
char *NextDnsServer;
|
||||
|
||||
cce.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
||||
cce.dwICC = ICC_INTERNET_CLASSES;
|
||||
InitCommonControlsEx(&cce);
|
||||
DlgData->AdapterName = Info->AdapterName;
|
||||
DlgData->AdapterIndex = Info->Index;
|
||||
|
||||
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
|
||||
psh.dwSize = sizeof(PROPSHEETHEADER);
|
||||
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
|
||||
psh.hwndParent = hParent;
|
||||
psh.hInstance = hApplet;
|
||||
psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
|
||||
psh.pszCaption = NULL;//Caption;
|
||||
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
|
||||
psh.nStartPage = 0;
|
||||
psh.ppsp = psp;
|
||||
psh.pfnCallback = NULL;
|
||||
|
||||
DlgData->OldDhcpEnabled = Info->DhcpEnabled;
|
||||
|
||||
InitPropSheetPage(&psp[0], IDD_TCPIPPROPERTIES, TCPIPPropertyPageProc);
|
||||
psp[0].lParam = (LPARAM)pInfo;
|
||||
pString = &Info->IpAddressList;
|
||||
while (NULL != pString->Next) {
|
||||
pString = pString->Next;
|
||||
}
|
||||
DlgData->OldIpAddress = inet_addr(pString->IpAddress.String);
|
||||
DlgData->OldSubnetMask = inet_addr(pString->IpMask.String);
|
||||
pString = &Info->GatewayList;
|
||||
while (NULL != pString->Next) {
|
||||
pString = pString->Next;
|
||||
}
|
||||
DlgData->OldGateway = inet_addr(pString->IpAddress.String);
|
||||
|
||||
if (PropertySheet(&psh) == -1)
|
||||
{
|
||||
MessageBox(hParent,_T("Unable to create property sheet"),_T("Error"),MB_ICONSTOP);
|
||||
}
|
||||
DlgData->OldDns1 = INADDR_NONE;
|
||||
DlgData->OldDns2 = INADDR_NONE;
|
||||
swprintf(RegKey,
|
||||
L"SYSTEM\\CurrentControlSet\\Services\\TCPIP\\Parameters\\Interfaces\\%S",
|
||||
Info->AdapterName);
|
||||
if (ERROR_SUCCESS == RegOpenKeyW(HKEY_LOCAL_MACHINE, RegKey, &hKey)) {
|
||||
Size = sizeof(Dns);
|
||||
RegQueryValueExA(hKey, "NameServer", NULL, &Type, (BYTE *)Dns,
|
||||
&Size);
|
||||
RegCloseKey(hKey);
|
||||
|
||||
return;
|
||||
if ('\0' != Dns[0]) {
|
||||
DlgData->OldDns1 = inet_addr(Dns);
|
||||
NextDnsServer = strchr(Dns, ',');
|
||||
if (NULL != NextDnsServer && '\0' != *NextDnsServer) {
|
||||
DlgData->OldDns2 = inet_addr(NextDnsServer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
DisplayTCPIPProperties(HWND hParent, IP_ADAPTER_INFO *pInfo)
|
||||
{
|
||||
PROPSHEETPAGEW psp[1];
|
||||
PROPSHEETHEADERW psh;
|
||||
INITCOMMONCONTROLSEX cce;
|
||||
TCPIP_PROPERTIES_DATA DlgData;
|
||||
|
||||
if (! LoadDataFromInfo(&DlgData, pInfo))
|
||||
{
|
||||
ShowError(hParent, IDS_CANNOT_LOAD_CONFIG);
|
||||
return;
|
||||
}
|
||||
|
||||
cce.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
||||
cce.dwICC = ICC_INTERNET_CLASSES;
|
||||
InitCommonControlsEx(&cce);
|
||||
|
||||
ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
|
||||
psh.dwSize = sizeof(PROPSHEETHEADER);
|
||||
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
|
||||
psh.hwndParent = hParent;
|
||||
psh.hInstance = hApplet;
|
||||
psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
|
||||
psh.pszCaption = NULL;//Caption;
|
||||
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
|
||||
psh.nStartPage = 0;
|
||||
psh.ppsp = psp;
|
||||
psh.pfnCallback = NULL;
|
||||
|
||||
InitPropSheetPage(&psp[0], IDD_TCPIPPROPERTIES, TCPIPPropertyPageProc);
|
||||
psp[0].lParam = (LPARAM) &DlgData;
|
||||
|
||||
if (PropertySheetW(&psh) == -1)
|
||||
{
|
||||
ShowError(hParent, IDS_CANNOT_CREATE_PROPSHEET);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
/* $Id: dllmain.c 12852 2005-01-06 13:58:04Z mf $
|
||||
*
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
* FILE: lib/dhcpcapi/dhcpcapi.c
|
||||
* PURPOSE: Client API for DHCP
|
||||
* PROGRAMMER: arty (ayerkes@speakeasy.net)
|
||||
* UPDATE HISTORY:
|
||||
* Created 12/04/2005
|
||||
* COPYRIGHT: Copyright 2005 Art Yerkes <ayerkes@speakeasy.net>
|
||||
*/
|
||||
|
||||
#include <roscfg.h>
|
||||
|
@ -15,6 +12,9 @@
|
|||
#include <time.h>
|
||||
#include <dhcp/rosdhcp_public.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#define DHCP_TIMEOUT 1000
|
||||
|
||||
DWORD APIENTRY DhcpCApiInitialize(LPDWORD Version) {
|
||||
|
@ -118,34 +118,70 @@ DWORD APIENTRY DhcpStaticRefreshParams( DWORD AdapterIndex,
|
|||
return Reply.Reply;
|
||||
}
|
||||
|
||||
/*++
|
||||
* @name DhcpRosGetAdapterInfo
|
||||
* @implemented ReactOS only
|
||||
/*!
|
||||
* Set new TCP/IP parameters and notify DHCP client service of this
|
||||
*
|
||||
* \param[in] ServerName
|
||||
* NULL for local machine
|
||||
*
|
||||
* \param[in] AdapterName
|
||||
* IPHLPAPI name of adapter to change
|
||||
*
|
||||
* \param[in] NewIpAddress
|
||||
* TRUE if IP address changes
|
||||
*
|
||||
* \param[in] IpAddress
|
||||
* New IP address (network byte order)
|
||||
*
|
||||
* \param[in] SubnetMask
|
||||
* New subnet mask (network byte order)
|
||||
*
|
||||
* \param[in] DhcpAction
|
||||
* 0 - don't modify
|
||||
* 1 - enable DHCP
|
||||
* 2 - disable DHCP
|
||||
*
|
||||
* \return non-zero on success
|
||||
*
|
||||
* \remarks Undocumented by Microsoft
|
||||
*/
|
||||
DWORD APIENTRY
|
||||
DhcpNotifyConfigChange(LPWSTR ServerName,
|
||||
LPWSTR AdapterName,
|
||||
BOOL NewIpAddress,
|
||||
DWORD IpIndex,
|
||||
DWORD IpAddress,
|
||||
DWORD SubnetMask,
|
||||
int DhcpAction)
|
||||
{
|
||||
DPRINT1("DhcpNotifyConfigChange not implemented yet\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Get DHCP info for an adapter
|
||||
*
|
||||
* @param AdapterIndex
|
||||
* \param[in] AdapterIndex
|
||||
* Index of the adapter (iphlpapi-style) for which info is
|
||||
* requested
|
||||
*
|
||||
* @param DhcpEnabled
|
||||
* \param[out] DhcpEnabled
|
||||
* Returns whether DHCP is enabled for the adapter
|
||||
*
|
||||
* @param DhcpServer
|
||||
* \param[out] DhcpServer
|
||||
* Returns DHCP server IP address (255.255.255.255 if no
|
||||
* server reached yet), in network byte order
|
||||
*
|
||||
* @param LeaseObtained
|
||||
* \param[out] LeaseObtained
|
||||
* Returns time at which the lease was obtained
|
||||
*
|
||||
* @param LeaseExpires
|
||||
* \param[out] LeaseExpires
|
||||
* Returns time at which the lease will expire
|
||||
*
|
||||
* @return non-zero on success
|
||||
* \return non-zero on success
|
||||
*
|
||||
* @remarks This is a ReactOS-only routine
|
||||
*
|
||||
*--*/
|
||||
* \remarks This is a ReactOS-only routine
|
||||
*/
|
||||
DWORD APIENTRY DhcpRosGetAdapterInfo( DWORD AdapterIndex,
|
||||
PBOOL DhcpEnabled,
|
||||
PDWORD DhcpServer,
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
@ stub DhcpHandlePnPEvent
|
||||
@ stdcall DhcpLeaseIpAddress(long)
|
||||
@ stub DhcpLeaseIpAddressEx
|
||||
@ stub DhcpNotifyConfigChange
|
||||
@ stdcall DhcpNotifyConfigChange(ptr ptr long long long long long)
|
||||
@ stub DhcpNotifyConfigChangeEx
|
||||
@ stub DhcpNotifyMediaReconnected
|
||||
@ stub DhcpOpenGlobalEvent
|
||||
|
|
Loading…
Reference in a new issue