Author: arty
Date: Mon May 8 15:00:26 2006
New Revision: 21851
URL:
http://svn.reactos.ru/svn/reactos?rev=21851&view=rev
Log:
tcpip: make sure to clean up failed adapter bindings
ndis: manage global adapter list correctly
ncpa: wip code from my old tree ... it can now be used to set a static ip
addr at least. more to come
Modified:
trunk/reactos/dll/cpl/ncpa/en.rc
trunk/reactos/dll/cpl/ncpa/ncpa.c
trunk/reactos/dll/cpl/ncpa/tcpip_properties.c
trunk/reactos/drivers/network/ndis/include/ndissys.h
trunk/reactos/drivers/network/ndis/ndis/miniport.c
trunk/reactos/drivers/network/tcpip/datalink/lan.c
trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c
trunk/reactos/drivers/network/tcpip/tcpip/info.c
trunk/reactos/drivers/network/tcpip/tcpip/main.c
Modified: trunk/reactos/dll/cpl/ncpa/en.rc
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/dll/cpl/ncpa/en.rc?rev=2185…
==============================================================================
--- trunk/reactos/dll/cpl/ncpa/en.rc (original)
+++ trunk/reactos/dll/cpl/ncpa/en.rc Mon May 8 15:00:26 2006
@@ -77,7 +77,7 @@
LTEXT "Alternate DNS server:", -1, 14, 186, 135, 8
CONTROL "",IDC_DNS2,"SysIPAddress32",WS_TABSTOP,150,186-2,80,12
PUSHBUTTON "&Advanced", IDC_ADVANCED, 186, 209, 50, 14, WS_DISABLED |
WS_TABSTOP
-}
+END
STRINGTABLE
Modified: trunk/reactos/dll/cpl/ncpa/ncpa.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/dll/cpl/ncpa/ncpa.c?rev=218…
==============================================================================
--- trunk/reactos/dll/cpl/ncpa/ncpa.c (original)
+++ trunk/reactos/dll/cpl/ncpa/ncpa.c Mon May 8 15:00:26 2006
@@ -322,22 +322,24 @@
if(_tcscmp(tpszTCPIPClsID,tpszClsIDText)==0)
{
- IP_ADAPTER_INFO Adapters[64];
+ IP_ADAPTER_INFO *Adapters = LocalAlloc( LMEM_FIXED, sizeof(IP_ADAPTER_INFO) *
64 );
IP_ADAPTER_INFO *pAdapter;
TCHAR *tpszCfgInstanceID;
- DWORD dwSize = sizeof(Adapters);
- memset(&Adapters,0x00,sizeof(Adapters));
+ DWORD dwSize = sizeof(*Adapters) * 64;
+ memset(Adapters,0x00,dwSize);
if(GetAdaptersInfo(Adapters,&dwSize)!=ERROR_SUCCESS)
- break;;
+ break;
pAdapter = Adapters;
tpszCfgInstanceID = (TCHAR*)pPage->lParam;
while(pAdapter)
{
- TCHAR tpszAdatperName[MAX_PATH];
- swprintf(tpszAdatperName,L"%S",pAdapter->AdapterName);
- DPRINT("IPHLPAPI returned: %S\n", tpszAdatperName);
- if(_tcscmp(tpszAdatperName,tpszCfgInstanceID)==0)
+ TCHAR tpszAdatperName[MAX_PATH];
+ swprintf(tpszAdatperName,L"%S",pAdapter->AdapterName);
+ DPRINT("IPHLPAPI returned: %S\n", tpszAdatperName);
+ if(_tcscmp(tpszAdatperName,tpszCfgInstanceID)==0)
{
+ memcpy(Adapters,pAdapter,sizeof(*pAdapter));
+ pAdapter = Adapters;
DisplayTCPIPProperties(hwndDlg,pAdapter);
break;
} else
Modified: trunk/reactos/dll/cpl/ncpa/tcpip_properties.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/dll/cpl/ncpa/tcpip_properti…
==============================================================================
--- trunk/reactos/dll/cpl/ncpa/tcpip_properties.c (original)
+++ trunk/reactos/dll/cpl/ncpa/tcpip_properties.c Mon May 8 15:00:26 2006
@@ -1,10 +1,29 @@
/*
- * PROJECT: ReactOS Network Control Panel
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: lib/cpl/system/tcpip_properties.c
- * PURPOSE: ReactOS Network Control Panel
- * COPYRIGHT: Copyright 2004 Gero Kuehn (reactos.filter(a)gkware.com)
- * Copyright 2006 Ge van Geldorp <gvg(a)reactos.org>
+ * ReactOS
+ * Copyright (C) 2004 ReactOS Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/* $Id$
+ *
+ * PROJECT: ReactOS Network Control Panel
+ * FILE: lib/cpl/system/tcpip_properties.c
+ * PURPOSE: ReactOS Network Control Panel
+ * PROGRAMMER: Gero Kuehn (reactos.filter(a)gkware.com)
+ * UPDATE HISTORY:
+ * 08-15-2004 Created
*/
#include <stdlib.h>
@@ -30,368 +49,263 @@
#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 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);
+extern void InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, LPARAM
lParam);
+
+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;
+
+ *dwIPAddr = htonl(*dwIPAddr);
+ 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, Disposition;
+ const char *AddressString;
+ BOOL RetVal = FALSE;
+ BOOL DhcpEnabled = FALSE;
+ MIB_IPFORWARDROW RowToAdd = { 0 };
+
+ DbgPrint("TCPIP_PROPERTIES: InternTCPIPSettings\n");
+
+ if(pPage)
+ pInfo = (IP_ADAPTER_INFO *)pPage->lParam;
+
+ DbgPrint("TCPIP_PROPERTIES: pPage: 0x%x pInfo: 0x%x\n", pPage, pInfo);
+
+ if( !pPage || !pInfo ) goto cleanup;
+
+ DbgPrint("TCPIP_PROPERTIES: AdapterName: %s\n", pInfo->AdapterName);
+
+
_stprintf(pszRegKey,_T("SYSTEM\\CurrentControlSet\\Services\\TCPIP\\Parameters\\Interfaces\\%S"),pInfo->AdapterName);
+ if(RegCreateKeyEx
+ (HKEY_LOCAL_MACHINE,pszRegKey,0,NULL,
+ REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&Disposition)!=ERROR_SUCCESS)
{
+ DbgPrint("TCPIP_PROPERTIES: Could not open HKLM\\%S\n", pszRegKey);
+ goto cleanup;
}
-}
-
-static void
-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);
+
+ if( !GetAddressFromField
+ ( hwndDlg, IDC_IPADDR, &IpAddress, &AddressString ) ||
+ RegSetValueEx
+ ( hKey, _T("IPAddress"), 0, REG_SZ, AddressString,
+ strlen(AddressString) ) != ERROR_SUCCESS )
+ goto cleanup;
+
+ DbgPrint("TCPIP_PROPERTIES: IpAddress: %x\n", IpAddress);
+
+ if( !GetAddressFromField
+ ( hwndDlg, IDC_SUBNETMASK, &NetMask, &AddressString ) ||
+ RegSetValueEx
+ ( hKey, _T("SubnetMask"), 0, REG_SZ, AddressString,
+ strlen(AddressString) ) != ERROR_SUCCESS )
+ goto cleanup;
+
+ DbgPrint("TCPIP_PROPERTIES: NetMask: %x\n", NetMask);
+
+ if( !GetAddressFromField
+ ( hwndDlg, IDC_DEFGATEWAY, &Gateway, &AddressString ) ||
+ RegSetValueEx
+ ( hKey, _T("DefaultGateway"), 0, REG_SZ, AddressString,
+ strlen(AddressString) ) != ERROR_SUCCESS )
+ goto cleanup;
+
+ if( DhcpEnabled ) {
+ DbgPrint("TCPIP_PROPERTIES: Lease address\n");
+ DhcpLeaseIpAddress( pInfo->Index );
} else {
- ManualDNS(Dlg, TRUE);
+ /* If not on DHCP then add a default gateway, assuming one was specified */
+ DbgPrint("TCPIP_PROPERTIES: Adding gateway entry\n");
+ DhcpReleaseIpAddressLease( pInfo->Index );
+ DhcpStaticRefreshParams( pInfo->Index, IpAddress, NetMask );
+
+ RowToAdd.dwForwardMask = 0;
+ RowToAdd.dwForwardMetric1 = 1;
+ RowToAdd.dwForwardNextHop = Gateway;
+
+ CreateIpForwardEntry( &RowToAdd );
}
-}
-
-static void
-ShowError(HWND Parent, UINT MsgId)
+
+ DbgPrint("TCPIP_PROPERTIES: Done changing settings\n");
+
+cleanup:
+ if( hKey ) RegCloseKey( hKey );
+
+ return RetVal;
+}
+
+INT_PTR CALLBACK
+TCPIPPropertyPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- 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
-ValidateAndStore(HWND Dlg, PTCPIP_PROPERTIES_DATA DlgData)
-{
- DWORD IpAddress;
-
- 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;
+ 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, (LPARAM)pPage);
+
+ EnableDHCP( hwndDlg, pInfo->DhcpEnabled );
+
+ {
+ DWORD dwIPAddr;
+ IP_ADDR_STRING *pString;
+ pString = &pInfo->IpAddressList;
+ while(pString->Next)
+ pString = pString->Next;
+ dwIPAddr = ntohl(inet_addr(pString->IpAddress.String));
+ SendDlgItemMessage(hwndDlg,IDC_IPADDR,IPM_SETADDRESS,0,dwIPAddr);
+ dwIPAddr = ntohl(inet_addr(pString->IpMask.String));
+ SendDlgItemMessage(hwndDlg,IDC_SUBNETMASK,IPM_SETADDRESS,0,dwIPAddr);
+
+ pString = &pInfo->GatewayList;
+ while(pString->Next)
+ pString = pString->Next;
+ dwIPAddr = ntohl(inet_addr(pString->IpAddress.String));
+ SendDlgItemMessage(hwndDlg,IDC_DEFGATEWAY,IPM_SETADDRESS,0,dwIPAddr);
+
}
- 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;
- }
-
- 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 Dlg, PTCPIP_PROPERTIES_DATA DlgData) {
- BOOL Changed;
- BOOL IpChanged;
- int DhcpAction;
- LPWSTR AdapterName;
-
- if (! ValidateAndStore(Dlg, DlgData)) {
- /* Should never happen, we should have validated at PSN_KILLACTIVE */
- ASSERT(FALSE);
- return FALSE;
- }
-
- 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;
- }
-
- 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);
- }
-
- /* FIXME Save default gateway and DNS entries */
- return TRUE;
-}
-
-static INT_PTR CALLBACK
-TCPIPPropertyPageProc(HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- LPPROPSHEETPAGEW Page;
- PTCPIP_PROPERTIES_DATA DlgData;
- LPNMHDR Nmhdr;
-
- DlgData = (PTCPIP_PROPERTIES_DATA) GetWindowLongPtrW(Dlg, GWL_USERDATA);
- switch(uMsg) {
- case WM_INITDIALOG:
- Page = (LPPROPSHEETPAGEW) lParam;
- DlgData = (PTCPIP_PROPERTIES_DATA) Page->lParam;
- SetWindowLongPtrW(Dlg, GWL_USERDATA, Page->lParam);
-
- EnableWindow(GetDlgItem(Dlg, IDC_ADVANCED), FALSE);
-
- EnableDHCP(Dlg, DlgData->OldDhcpEnabled);
-
- if (! DlgData->OldDhcpEnabled)
{
- 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));
+ 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 = ntohl(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 );
}
}
-
- 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;
-
+ }
+ break;
+ case WM_DESTROY:
case WM_COMMAND:
- switch(LOWORD(wParam)) {
+ switch(LOWORD(wParam))
+ {
case IDC_FIXEDDNS:
- ManualDNS(Dlg, TRUE);
- return TRUE;
+ ManualDNS( hwndDlg, TRUE );
+ break;
case IDC_AUTODNS:
- ManualDNS(Dlg, FALSE);
- return TRUE;
+ ManualDNS( hwndDlg, FALSE );
+ break;
case IDC_USEDHCP:
- EnableDHCP(Dlg, TRUE);
- return TRUE;
+ EnableDHCP( hwndDlg, TRUE );
+ break;
case IDC_NODHCP:
- EnableDHCP(Dlg, FALSE);
- return TRUE;
- }
- break;
-
- 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:
+ EnableDHCP( hwndDlg, FALSE );
+ break;
+
+ case 0:
/* Set the IP Address and DNS Information so we won't
* be doing all this for nothing */
- SetWindowLongPtrW(Dlg, DWL_MSGRESULT,
- InternTCPIPSettings(Dlg, DlgData) ?
- PSNRET_NOERROR : PSNRET_INVALID);
- return TRUE;
+ InternTCPIPSettings( hwndDlg );
+ LocalFree((void *)pPage->lParam);
+ LocalFree(pPage);
+ break;
}
break;
}
-
return FALSE;
}
-static BOOL
-LoadDataFromInfo(PTCPIP_PROPERTIES_DATA DlgData, IP_ADAPTER_INFO *Info)
+void DisplayTCPIPProperties(HWND hParent,IP_ADAPTER_INFO *pInfo)
{
- IP_ADDR_STRING *pString;
- WCHAR RegKey[MAX_PATH];
- HKEY hKey;
- char Dns[MAX_PATH];
- DWORD Size;
- DWORD Type;
- char *NextDnsServer;
-
- DlgData->AdapterName = Info->AdapterName;
- DlgData->AdapterIndex = Info->Index;
-
- DlgData->OldDhcpEnabled = Info->DhcpEnabled;
-
- 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);
-
- 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);
-
- 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;
-}
+ PROPSHEETPAGE *psp = LocalAlloc( LMEM_FIXED, sizeof(PROPSHEETPAGE) );
+ PROPSHEETHEADER psh;
+ INITCOMMONCONTROLSEX cce;
+
+ DbgPrint("TCPIP_PROPERTIES: psp = %x\n", psp);
+
+ 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 = 1;
+ psh.nStartPage = 0;
+ psh.ppsp = psp;
+ psh.pfnCallback = NULL;
+
+ DbgPrint("TCPIP_PROPERTIES: About to InitPropSheetPage (pInfo: %x)\n",
pInfo);
+
+ InitPropSheetPage(psp, IDD_TCPIPPROPERTIES, TCPIPPropertyPageProc, (LPARAM)pInfo);
+
+ DbgPrint("TCPIP_PROPERTIES: About to realize property sheet\n", psp);
+
+ if (PropertySheet(&psh) == -1)
+ {
+ MessageBox(hParent,_T("Unable to create property
sheet"),_T("Error"),MB_ICONSTOP);
+ }
+
+ return;
+}
Modified: trunk/reactos/drivers/network/ndis/include/ndissys.h
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/network/ndis/includ…
==============================================================================
--- trunk/reactos/drivers/network/ndis/include/ndissys.h (original)
+++ trunk/reactos/drivers/network/ndis/include/ndissys.h Mon May 8 15:00:26 2006
@@ -500,6 +500,13 @@
#define MAX(value1, value2) \
((value1 > value2)? value1 : value2)
+#define ExInterlockedRemoveEntryList(_List,_Lock) \
+ { KIRQL OldIrql; \
+ KeAcquireSpinLock(_Lock, &OldIrql); \
+ RemoveEntryList(_List); \
+ KeReleaseSpinLock(_Lock, OldIrql); \
+ }
+
#endif /* __NDISSYS_H */
/* EOF */
Modified: trunk/reactos/drivers/network/ndis/ndis/miniport.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/m…
==============================================================================
--- trunk/reactos/drivers/network/ndis/ndis/miniport.c (original)
+++ trunk/reactos/drivers/network/ndis/ndis/miniport.c Mon May 8 15:00:26 2006
@@ -1331,6 +1331,7 @@
ExAllocatePool(PagedPool, ResourceListSize);
if (Adapter->NdisMiniportBlock.AllocatedResources == NULL)
{
+ ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -1340,6 +1341,7 @@
{
ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources);
Adapter->NdisMiniportBlock.AllocatedResources = NULL;
+ ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -1420,6 +1422,7 @@
SelectedMediumIndex >= MEDIA_ARRAY_SIZE)
{
NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an
adapter.\n"));
+ ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
return (NTSTATUS)NdisStatus;
}
@@ -1461,6 +1464,7 @@
NDIS_DbgPrint(MIN_TRACE, ("error: unsupported media\n"));
ASSERT(FALSE);
/* FIXME - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); */
+ ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
return STATUS_UNSUCCESSFUL;
}
@@ -1472,6 +1476,7 @@
ExFreePool(Adapter->LookaheadBuffer);
Adapter->LookaheadBuffer = NULL;
}
+ ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
return (NTSTATUS)NdisStatus;
}
Modified: trunk/reactos/drivers/network/tcpip/datalink/lan.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/network/tcpip/datal…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/datalink/lan.c (original)
+++ trunk/reactos/drivers/network/tcpip/datalink/lan.c Mon May 8 15:00:26 2006
@@ -906,7 +906,7 @@
AppendUnicodeString( OutName, &PartialRegistryKey, FALSE );
}
-VOID BindAdapter(
+BOOLEAN BindAdapter(
PLAN_ADAPTER Adapter,
PNDIS_STRING RegistryPath)
/*
@@ -937,7 +937,7 @@
sizeof(ULONG));
if (NdisStatus != NDIS_STATUS_SUCCESS) {
TI_DbgPrint(DEBUG_DATALINK, ("Could not set lookahead buffer size
(0x%X).\n", NdisStatus));
- return;
+ return FALSE;
}
/* Bind the adapter to IP layer */
@@ -953,7 +953,7 @@
if (!IF) {
TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
- return;
+ return FALSE;
}
/*
@@ -973,6 +973,9 @@
Status = FindDeviceDescForAdapter( &IF->Name, &IF->Description );
TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n",
&IF->Description));
+ } else {
+ IPDestroyInterface( IF );
+ return FALSE;
}
DefaultMask.Type = IP_ADDRESS_V4;
@@ -1010,11 +1013,12 @@
if (NdisStatus != NDIS_STATUS_SUCCESS) {
TI_DbgPrint(DEBUG_DATALINK, ("Could not set packet filter (0x%X).\n",
NdisStatus));
IPDestroyInterface(IF);
- return;
+ return FALSE;
}
Adapter->Context = IF;
Adapter->State = LAN_STATE_STARTED;
+ return TRUE;
}
@@ -1097,6 +1101,7 @@
if (NdisStatus == NDIS_STATUS_PENDING)
KeWaitForSingleObject(&IF->Event, UserRequest, KernelMode, FALSE, NULL);
else if (NdisStatus != NDIS_STATUS_SUCCESS) {
+ TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ\n", AdapterName));
exFreePool(IF);
return NdisStatus;
}
@@ -1133,6 +1138,7 @@
&IF->MTU,
sizeof(UINT));
if (NdisStatus != NDIS_STATUS_SUCCESS) {
+ TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ (NDISCall)\n",
AdapterName));
exFreePool(IF);
return NdisStatus;
}
@@ -1193,7 +1199,11 @@
&AdapterListLock);
/* Bind adapter to IP layer */
- BindAdapter(IF, RegistryPath);
+ if( !BindAdapter(IF, RegistryPath) ) {
+ TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ (BindAdapter)\n",
AdapterName));
+ exFreePool(IF);
+ return NDIS_STATUS_NOT_ACCEPTED;
+ }
TI_DbgPrint(DEBUG_DATALINK, ("Leaving.\n"));
Modified: trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/dispatch.c Mon May 8 15:00:26 2006
@@ -1505,7 +1505,12 @@
(PIP_SET_ADDRESS)Irp->AssociatedIrp.SystemBuffer;
IF_LIST_ITER(IF);
+ TI_DbgPrint(MID_TRACE,("Setting IP Address for adapter %d\n",
+ IpAddrChange->NteIndex));
+
ForEachInterface(IF) {
+ TI_DbgPrint(MID_TRACE,("Looking at adapter %d\n", IF->Index));
+
if( IF->Unicast.Address.IPv4Address == IpAddrChange->Address ) {
Status = STATUS_DUPLICATE_OBJECTID;
break;
Modified: trunk/reactos/drivers/network/tcpip/tcpip/info.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/info.c (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/info.c Mon May 8 15:00:26 2006
@@ -60,17 +60,23 @@
KIRQL OldIrql;
UINT i;
+ TI_DbgPrint(DEBUG_INFO,("Removing TDI entry 0x%x\n", Interface));
+
TcpipAcquireSpinLock( &EntityListLock, &OldIrql );
/* Remove entities that have this interface as context
* In the future, this might include AT_ENTITY types, too
*/
for( i = 0; i < EntityCount; i++ ) {
+ TI_DbgPrint(DEBUG_INFO,("--> examining TDI entry 0x%x\n",
EntityList[i].context));
if( EntityList[i].context == Interface ) {
- if( i != EntityCount-1 )
+ if( i != EntityCount-1 ) {
memcpy( &EntityList[i],
&EntityList[--EntityCount],
sizeof(EntityList[i]) );
+ } else {
+ EntityCount--;
+ }
}
}
Modified: trunk/reactos/drivers/network/tcpip/tcpip/main.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/main.c (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/main.c Mon May 8 15:00:26 2006
@@ -14,7 +14,7 @@
#ifndef NDEBUG
DWORD DebugTraceLevel = DEBUG_ULTRA & ~(DEBUG_LOCK | DEBUG_PBUFFER);
#else
-DWORD DebugTraceLevel = 0;
+DWORD DebugTraceLevel = DEBUG_DATALINK;
#endif /* NDEBUG */
PDEVICE_OBJECT TCPDeviceObject = NULL;