Preliminary commit for tcpip control panel. I've been sitting on this

for a while, mainly because it used to bugcheck in a named pipe call.
I've lost my modifications to dhcpcapi, so stuff in there might not
be right.  Looking at it.

svn path=/trunk/; revision=19110
This commit is contained in:
Art Yerkes 2005-11-10 06:12:27 +00:00
parent 381dcf3a8c
commit 9fc73bcf41
2 changed files with 187 additions and 73 deletions

View file

@ -11,6 +11,9 @@
<library>user32</library>
<library>comctl32</library>
<library>iphlpapi</library>
<library>ws2_32</library>
<library>dhcpcapi</library>
<library>ntdll</library>
<file>ncpa.c</file>
<file>tcpip_properties.c</file>
<file>ncpa.rc</file>

View file

@ -34,6 +34,7 @@
#include <iptypes.h>
#include <iphlpapi.h>
#include <commctrl.h>
#include <dhcpcapi.h>
#include <prsht.h>
@ -54,86 +55,196 @@
extern void InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc);
void EnableDHCP( HWND hwndDlg, BOOL Enabled ) {
CheckDlgButton(hwndDlg,IDC_USEDHCP,Enabled ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hwndDlg,IDC_NODHCP,Enabled ? BST_UNCHECKED : BST_CHECKED);
}
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);
}
BOOL GetAddressFromField( HWND hwndDlg, UINT CtlId,
DWORD *dwIPAddr,
const char **AddressString ) {
LRESULT lResult;
struct in_addr inIPAddr;
*AddressString = NULL;
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;
return TRUE;
}
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;
MIB_IPFORWARDROW RowToAdd = { 0 };
if(pPage)
pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
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, AddressString,
strlen(AddressString) ) != ERROR_SUCCESS )
goto cleanup;
if( !GetAddressFromField
( hwndDlg, IDC_SUBNETMASK, &NetMask, &AddressString ) ||
RegSetValueEx
( hKey, _T("SubnetMask"), 0, REG_SZ, AddressString,
strlen(AddressString) ) != ERROR_SUCCESS )
goto cleanup;
if( DhcpEnabled )
DhcpLeaseIpAddress( pInfo->Index );
else {
DhcpReleaseIpAddressLease( pInfo->Index );
DhcpStaticRefreshParams( pInfo->Index, IpAddress, NetMask );
}
if( !GetAddressFromField
( hwndDlg, IDC_DEFGATEWAY, &Gateway, &AddressString ) ||
RegSetValueEx
( hKey, _T("DefaultGateway"), 0, REG_SZ, 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 );
}
cleanup:
if( hKey ) RegCloseKey( hKey );
return RetVal;
}
INT_PTR CALLBACK
TCPIPPropertyPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PROPSHEETPAGE *pPage = (PROPSHEETPAGE *)GetWindowLongPtr(hwndDlg,GWL_USERDATA);
IP_ADAPTER_INFO *pInfo = NULL;
if(pPage)
pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
switch(uMsg)
{
PROPSHEETPAGE *pPage = (PROPSHEETPAGE *)GetWindowLongPtr(hwndDlg,GWL_USERDATA);
IP_ADAPTER_INFO *pInfo = NULL;
int StaticDNS = 0;
char *NextDNSServer;
if(pPage)
pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
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);
{
pPage = (PROPSHEETPAGE *)lParam;
pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
EnableWindow(GetDlgItem(hwndDlg,IDC_ADVANCED),FALSE);
SetWindowLongPtr(hwndDlg,GWL_USERDATA,(DWORD_PTR)pPage->lParam);
if(pInfo->DhcpEnabled) {
CheckDlgButton(hwndDlg,IDC_USEDHCP,BST_CHECKED);
CheckDlgButton(hwndDlg,IDC_NODHCP,BST_UNCHECKED);
} else {
CheckDlgButton(hwndDlg,IDC_USEDHCP,BST_UNCHECKED);
CheckDlgButton(hwndDlg,IDC_NODHCP,BST_CHECKED);
}
{
DWORD dwIPAddr;
int b[4];
IP_ADDR_STRING *pString;
pString = &pInfo->IpAddressList;
while(pString->Next)
pString = pString->Next;
sscanf(pString->IpAddress.String,"%d.%d.%d.%d",&b[0],&b[1],&b[2],&b[3]);
dwIPAddr = b[0]<<24|b[1]<<16|b[2]<<8|b[3];
SendDlgItemMessage(hwndDlg,IDC_IPADDR,IPM_SETADDRESS,0,dwIPAddr);
sscanf(pString->IpMask.String,"%d.%d.%d.%d",&b[0],&b[1],&b[2],&b[3]);
dwIPAddr = b[0]<<24|b[1]<<16|b[2]<<8|b[3];
SendDlgItemMessage(hwndDlg,IDC_SUBNETMASK,IPM_SETADDRESS,0,dwIPAddr);
EnableDHCP( hwndDlg, pInfo->DhcpEnabled );
pString = &pInfo->GatewayList;
while(pString->Next)
pString = pString->Next;
sscanf(pString->IpAddress.String,"%d.%d.%d.%d",&b[0],&b[1],&b[2],&b[3]);
dwIPAddr = b[0]<<24|b[1]<<16|b[2]<<8|b[3];
SendDlgItemMessage(hwndDlg,IDC_DEFGATEWAY,IPM_SETADDRESS,0,dwIPAddr);
{
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,dwIPAddr);
dwIPAddr = inet_addr(pString->IpMask.String);
SendDlgItemMessage(hwndDlg,IDC_SUBNETMASK,IPM_SETADDRESS,0,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;
int b[2][4];
DWORD dwIPAddr;
RegQueryValueExA(hKey,"NameServer",NULL,&dwType,(BYTE*)pszDNS,&dwSize);
RegCloseKey(hKey);
sscanf(pszDNS,"%d.%d.%d.%d,%d.%d.%d.%d",&b[0][0],&b[0][1],&b[0][2],&b[0][3],&b[1][0],&b[1][1],&b[1][2],&b[1][3]);
dwIPAddr = b[0][0]<<24|b[0][1]<<16|b[0][2]<<8|b[0][3];
SendDlgItemMessage(hwndDlg,IDC_DNS1,IPM_SETADDRESS,0,dwIPAddr);
dwIPAddr = b[1][0]<<24|b[1][1]<<16|b[1][2]<<8|b[1][3];
SendDlgItemMessage(hwndDlg,IDC_DNS2,IPM_SETADDRESS,0,dwIPAddr);
CheckDlgButton(hwndDlg,IDC_FIXEDDNS,TRUE);
EnableWindow(GetDlgItem(hwndDlg,IDC_DNS1),FALSE);
EnableWindow(GetDlgItem(hwndDlg,IDC_DNS2),FALSE);
EnableWindow(GetDlgItem(hwndDlg,IDC_AUTODNS),FALSE);
EnableWindow(GetDlgItem(hwndDlg,IDC_FIXEDDNS),FALSE);
}
}
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
}
break;
}
return FALSE;
pString = &pInfo->GatewayList;
while(pString->Next)
pString = pString->Next;
dwIPAddr = inet_addr(pString->IpAddress.String);
SendDlgItemMessage(hwndDlg,IDC_DEFGATEWAY,IPM_SETADDRESS,0,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 && StaticDNS < 2 ) {
dwIPAddr = inet_addr(NextDNSServer);
if( dwIPAddr != INADDR_NONE ) {
SendDlgItemMessage(hwndDlg,IDC_DNS1 + StaticDNS,IPM_SETADDRESS,0,dwIPAddr);
StaticDNS++;
}
NextDNSServer = strchr( pszDNS, ',' );
if( NextDNSServer )
NextDNSServer++;
}
ManualDNS( hwndDlg, StaticDNS );
}
}
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_FIXEDDNS:
ManualDNS( hwndDlg, TRUE );
break;
case IDC_AUTODNS:
ManualDNS( hwndDlg, FALSE );
break;
case IDC_USEDHCP:
EnableDHCP( hwndDlg, TRUE );
break;
case IDC_NODHCP:
EnableDHCP( hwndDlg, FALSE );
break;
case IDOK:
/* Set the IP Address and DNS Information so we won't
* be doing all this for nothing */
InternTCPIPSettings( hwndDlg );
break;
}
break;
}
return FALSE;
}
void DisplayTCPIPProperties(HWND hParent,IP_ADAPTER_INFO *pInfo)