Author: janderwald Date: Tue Sep 9 19:13:39 2008 New Revision: 36099
URL: http://svn.reactos.org/svn/reactos?rev=36099&view=rev Log: - Free INetCfgComponent when reference count is zero - HACK: use {RandomProtocolGUID_TCPIP} for all network notification objects (As soon GUIDs are automatically generated for network components like TCPIP, this hack can be removed) - Start implementing TCP/IP Notification Object - Import TCP/IP Properties dialog from ncpa.cpl
Added: trunk/reactos/dll/win32/netcfgx/lang/ (with props) trunk/reactos/dll/win32/netcfgx/lang/de-DE.rc (with props) trunk/reactos/dll/win32/netcfgx/netcfgx.rc (with props) trunk/reactos/dll/win32/netcfgx/resource.h (with props) trunk/reactos/dll/win32/netcfgx/tcpipconf_notify.c (with props) Modified: trunk/reactos/dll/win32/netcfgx/inetcfgcomp_iface.c trunk/reactos/dll/win32/netcfgx/netcfgx.c trunk/reactos/dll/win32/netcfgx/netcfgx.rbuild trunk/reactos/dll/win32/netcfgx/precomp.h
Modified: trunk/reactos/dll/win32/netcfgx/inetcfgcomp_iface.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/inetcfgco... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/inetcfgcomp_iface.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/netcfgx/inetcfgcomp_iface.c [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -62,6 +62,10 @@ INetCfgComponentImpl * This = (INetCfgComponentImpl*)iface; ULONG refCount = InterlockedDecrement(&This->ref);
+ if (!refCount) + { + CoTaskMemFree(This); + } return refCount; }
@@ -332,7 +336,8 @@ INetCfgComponentControl * pNCCC; HRESULT hr; LONG lRet; - CLSID ClassGUID, InstanceGUID; + CLSID ClassGUID; + //CLSID InstanceGUID;
wcscpy(szName,L"SYSTEM\CurrentControlSet\Control\Network\");
@@ -349,7 +354,8 @@ CoTaskMemFree(pStr); wcscat(szName, L"\");
- /* get the Class GUID */ + /* get the Instance GUID */ +#if 0 hr = INetCfgComponent_GetInstanceGuid(iface, &InstanceGUID); if (FAILED(hr)) return hr; @@ -360,6 +366,11 @@
wcscat(szName, pStr); CoTaskMemFree(pStr); +#else + // HACK HACK HACK HACK HACK + wcscat(szName, L"{RandomProtocolGUID_TCPIP}"); +#endif + wcscat(szName, L"\NDI");
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szName, 0, KEY_READ, &hKey) != ERROR_SUCCESS) @@ -433,11 +444,14 @@ hr = CreateNotificationObject(This,iface, pUnk, &This->pProperty); if (FAILED(hr)) return hr; - } - - dwDefPages = 1; + if (dwFlags == NCRP_QUERY_PROPERTY_UI) + return S_OK; + } + + dwDefPages = 0; + Pages = 0; hr = INetCfgComponentPropertyUi_MergePropPages(This->pProperty, &dwDefPages, (BYTE**)&hppages, &Pages, hwndParent, NULL); - if (FAILED(hr)) + if (FAILED(hr) || !Pages) { return hr; } @@ -446,6 +460,7 @@ pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; pinfo.u3.phpage = hppages; pinfo.hwndParent = hwndParent; + pinfo.nPages = Pages; pinfo.pszCaption = This->pItem->szDisplayName;
iResult = PropertySheetW(&pinfo); @@ -669,9 +684,6 @@
IEnumNetCfgComponent_Release((IEnumNetCfgComponent*)This); return S_OK; - - - return S_OK; -} - - +} + +
Propchange: trunk/reactos/dll/win32/netcfgx/lang/ ------------------------------------------------------------------------------ --- bugtraq:logregex (added) +++ bugtraq:logregex Tue Sep 9 19:13:39 2008 @@ -1,0 +1,2 @@ +([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))? +(\d+)
Propchange: trunk/reactos/dll/win32/netcfgx/lang/ ------------------------------------------------------------------------------ bugtraq:message = See issue #%BUGID% for more details.
Propchange: trunk/reactos/dll/win32/netcfgx/lang/ ------------------------------------------------------------------------------ bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%
Propchange: trunk/reactos/dll/win32/netcfgx/lang/ ------------------------------------------------------------------------------ tsvn:logminsize = 10
Added: trunk/reactos/dll/win32/netcfgx/lang/de-DE.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/lang/de-D... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/lang/de-DE.rc (added) +++ trunk/reactos/dll/win32/netcfgx/lang/de-DE.rc [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -1,0 +1,26 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +IDD_TCPIP_BASIC_DLG DIALOGEX DISCARDABLE 0, 0, 246, 228 +STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION +CAPTION "Allgemein" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "IP-Einstellungen können automatisch zugewiesen werden, wenn das Netzwerk diese Funktion unterstützt. Wenden Sie sich andernfalls an den Netzwerkadministrator, um die geeigneten IP-Einstellungen zu beziehen.", -1, 9, 9, 235, 27 + CONTROL "I&P-Adresse automatisch beziehen", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 43, 210, 12 + GROUPBOX "", -1, 9, 61, 228, 70, BS_GROUPBOX + CONTROL "Folgende IP-&Adresse verwenden:", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON, 14, 59, 120, 12 + LTEXT "&IP-Adresse:", -1, 14, 75, 135, 8 + CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP,150,75-2,80,12 + LTEXT "S&ubnetzmaske:", -1, 14, 90, 135, 8 + CONTROL "",IDC_SUBNETMASK,"SysIPAddress32",WS_TABSTOP,150,90-2,80,12 + LTEXT "&Standardgateway:", -1, 14, 105, 135, 8 + CONTROL "",IDC_DEFGATEWAY,"SysIPAddress32",WS_TABSTOP,150,105-2,80,12 + CONTROL "D&NS-Serveradresse automatisch beziehen", IDC_AUTODNS, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 139, 210, 12 + GROUPBOX "", -1, 9, 157, 228, 47, BS_GROUPBOX + CONTROL "Folgende DNS-Serveradressen &verwenden:", IDC_FIXEDDNS, "BUTTON", BS_AUTORADIOBUTTON, 14, 155, 152, 12 + LTEXT "&Bevorzugter DNS-Server:", -1, 14, 171, 135, 8 + CONTROL "",IDC_DNS1,"SysIPAddress32",WS_TABSTOP,150,171-2,80,12 + LTEXT "A<ernativer DNS-Server:", -1, 14, 186, 135, 8 + CONTROL "",IDC_DNS2,"SysIPAddress32",WS_TABSTOP,150,186-2,80,12 + PUSHBUTTON "&Erweitert...", IDC_ADVANCED, 186, 209, 50, 14, WS_DISABLED | WS_TABSTOP +END
Propchange: trunk/reactos/dll/win32/netcfgx/lang/de-DE.rc ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/reactos/dll/win32/netcfgx/netcfgx.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/netcfgx.c... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/netcfgx.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/netcfgx/netcfgx.c [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -15,12 +15,20 @@ #include <debug.h>
HINSTANCE netcfgx_hInstance; +const GUID CLSID_TcpipConfigNotifyObject = {0xA907657F, 0x6FDF, 0x11D0, {0x8E, 0xFB, 0x00, 0xC0, 0x4F, 0xD9, 0x12, 0xB2}}; + + +
static INTERFACE_TABLE InterfaceTable[] = { { &CLSID_CNetCfg, INetCfg_Constructor + }, + { + &CLSID_TcpipConfigNotifyObject, + TcpipConfigNotify_Constructor }, { NULL,
Modified: trunk/reactos/dll/win32/netcfgx/netcfgx.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/netcfgx.r... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/netcfgx.rbuild [iso-8859-1] (original) +++ trunk/reactos/dll/win32/netcfgx/netcfgx.rbuild [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -19,4 +19,6 @@ <file>classfactory.c</file> <file>netcfg_iface.c</file> <file>inetcfgcomp_iface.c</file> + <file>tcpipconf_notify.c</file> + <file>netcfgx.rc</file> </module>
Added: trunk/reactos/dll/win32/netcfgx/netcfgx.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/netcfgx.r... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/netcfgx.rc (added) +++ trunk/reactos/dll/win32/netcfgx/netcfgx.rc [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -1,0 +1,18 @@ +#include <windows.h> +#include "shlobj.h" +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Network Configuration API\0" +#define REACTOS_STR_INTERNAL_NAME "netcfgx.dll\0" +#define REACTOS_STR_ORIGINAL_FILENAME "netcfgx.dll\0" +#define REACTOS_STR_PRODUCT_VERSION "5.1.2600.3264\0" +#define REACTOS_STR_FILE_VERSION "5.1.2600.3264\0" + +#include <reactos/version.rc> + + +#include "lang/de-DE.rc"
Propchange: trunk/reactos/dll/win32/netcfgx/netcfgx.rc ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/reactos/dll/win32/netcfgx/precomp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/precomp.h... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/precomp.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/netcfgx/precomp.h [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -12,6 +12,7 @@ #include <iphlpapi.h> #include <olectl.h> #include <netcfgn.h> +#include "resource.h"
typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); typedef struct { @@ -47,4 +48,9 @@ HRESULT STDCALL INetCfgComponent_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv, NetCfgComponentItem * pItem,INetCfg * iface); HRESULT STDCALL IEnumNetCfgComponent_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv, NetCfgComponentItem * pItem, INetCfg * iface);
+/* tcpipconf_notify.c */ +HRESULT WINAPI TcpipConfigNotify_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); + +extern const GUID CLSID_TcpipConfigNotifyObject; + #endif
Added: trunk/reactos/dll/win32/netcfgx/resource.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/resource.... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/resource.h (added) +++ trunk/reactos/dll/win32/netcfgx/resource.h [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -1,0 +1,21 @@ +#ifndef _RESOURCE_H__ +#define _RESOURCE_H__ + +/* dialogs */ +#define IDD_TCPIP_BASIC_DLG 100 + +/* controls */ +#define IDC_USEDHCP 1000 +#define IDC_NODHCP 1001 +#define IDC_IPADDR 1002 +#define IDC_SUBNETMASK 1003 +#define IDC_DEFGATEWAY 1004 +#define IDC_AUTODNS 1005 +#define IDC_FIXEDDNS 1006 +#define IDC_DNS1 1007 +#define IDC_DNS2 1008 +#define IDC_ADVANCED 1009 + + + +#endif
Propchange: trunk/reactos/dll/win32/netcfgx/resource.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/netcfgx/tcpipconf_notify.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/tcpipconf... ============================================================================== --- trunk/reactos/dll/win32/netcfgx/tcpipconf_notify.c (added) +++ trunk/reactos/dll/win32/netcfgx/tcpipconf_notify.c [iso-8859-1] Tue Sep 9 19:13:39 2008 @@ -1,0 +1,339 @@ +#include "precomp.h" + +typedef struct +{ + const INetCfgComponentPropertyUi * lpVtbl; + const INetCfgComponentControl * lpVtblCompControl; + LONG ref; + IUnknown * pUnknown; + INetCfg * pNCfg; + INetCfgComponent * pNComp; +}TcpipConfNotifyImpl, *LPTcpipConfNotifyImpl; + +static LPTcpipConfNotifyImpl __inline impl_from_INetCfgComponentControl(INetCfgComponentControl *iface) +{ + return (TcpipConfNotifyImpl*)((char *)iface - FIELD_OFFSET(TcpipConfNotifyImpl, lpVtblCompControl)); +} + + +HPROPSHEETPAGE +InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle) +{ + PROPSHEETPAGEW ppage; + + memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW)); + ppage.dwSize = sizeof(PROPSHEETPAGEW); + ppage.dwFlags = PSP_DEFAULT; + ppage.u.pszTemplate = resname; + ppage.pfnDlgProc = dlgproc; + ppage.lParam = lParam; + ppage.hInstance = netcfgx_hInstance; + if (szTitle) + { + ppage.dwFlags |= PSP_USETITLE; + ppage.pszTitle = szTitle; + } + return CreatePropertySheetPageW(&ppage); +} + +INT_PTR +CALLBACK +TcpipBasicDlg( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam +) +{ + switch(uMsg) + { + case WM_INITDIALOG: + return TRUE; + default: + break; + } + return FALSE; +} + +/*************************************************************** + * INetCfgComponentPropertyUi interface + */ + +HRESULT +STDCALL +INetCfgComponentPropertyUi_fnQueryInterface( + INetCfgComponentPropertyUi * iface, + REFIID iid, + LPVOID * ppvObj) +{ + //LPOLESTR pStr; + TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; + + *ppvObj = NULL; + + + if (IsEqualIID (iid, &IID_IUnknown) || + IsEqualIID (iid, &IID_INetCfgComponentPropertyUi)) + { + *ppvObj = This; + INetCfgComponentPropertyUi_AddRef(iface); + return S_OK; + } + else if (IsEqualIID(iid, &IID_INetCfgComponentControl)) + { + *ppvObj = (LPVOID*)&This->lpVtblCompControl; + INetCfgComponentPropertyUi_AddRef(iface); + return S_OK; + } + + //StringFromCLSID(iid, &pStr); + //MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK); + //CoTaskMemFree(pStr); + + return E_NOINTERFACE; +} + + +ULONG +STDCALL +INetCfgComponentPropertyUi_fnAddRef( + INetCfgComponentPropertyUi * iface) +{ + TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + return refCount; +} + +ULONG +STDCALL +INetCfgComponentPropertyUi_fnRelease( + INetCfgComponentPropertyUi * iface) +{ + TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; + ULONG refCount = InterlockedDecrement(&This->ref); + + if (!refCount) + { + CoTaskMemFree(This); + } + return refCount; +} + +HRESULT +STDCALL +INetCfgComponentPropertyUi_fnQueryPropertyUi( + INetCfgComponentPropertyUi * iface, + IUnknown *pUnkReserved) +{ + INetLanConnectionUiInfo * pLanInfo; + HRESULT hr; + + hr = IUnknown_QueryInterface(pUnkReserved, &IID_INetLanConnectionUiInfo, (LPVOID*)&pLanInfo); + if (FAILED(hr)) + return hr; + + //FIXME + // check if tcpip is enabled on that binding */ + IUnknown_Release(pUnkReserved); + return S_OK; +} + +HRESULT +STDCALL +INetCfgComponentPropertyUi_fnSetContext( + INetCfgComponentPropertyUi * iface, + IUnknown *pUnkReserved) +{ + TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; + + if (!iface || !pUnkReserved) + return E_POINTER; + + This->pUnknown = pUnkReserved; + return S_OK; +} + +HRESULT +STDCALL +INetCfgComponentPropertyUi_fnMergePropPages( + INetCfgComponentPropertyUi * iface, + DWORD *pdwDefPages, + BYTE **pahpspPrivate, + UINT *pcPages, + HWND hwndParent, + LPCWSTR *pszStartPage) +{ + HPROPSHEETPAGE * hppages; + TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; + + hppages = (HPROPSHEETPAGE*) CoTaskMemAlloc(sizeof(HPROPSHEETPAGE)); + if (!hppages) + return E_FAIL; + + hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_BASIC_DLG), TcpipBasicDlg, (LPARAM)This, NULL); + if (!hppages[0]) + { + CoTaskMemFree(hppages); + return E_FAIL; + } + + *pahpspPrivate = (BYTE*)hppages; + *pcPages = 1; + + return S_OK; +} + +HRESULT +STDCALL +INetCfgComponentPropertyUi_fnValidateProperties( + INetCfgComponentPropertyUi * iface, + HWND hwndSheet) +{ + return E_NOTIMPL; +} + +HRESULT +STDCALL +INetCfgComponentPropertyUi_fnApplyProperties( + INetCfgComponentPropertyUi * iface) +{ + return E_NOTIMPL; +} + + +HRESULT +STDCALL +INetCfgComponentPropertyUi_fnCancelProperties( + INetCfgComponentPropertyUi * iface) +{ + return E_NOTIMPL; +} + +static const INetCfgComponentPropertyUiVtbl vt_NetCfgComponentPropertyUi = +{ + INetCfgComponentPropertyUi_fnQueryInterface, + INetCfgComponentPropertyUi_fnAddRef, + INetCfgComponentPropertyUi_fnRelease, + INetCfgComponentPropertyUi_fnQueryPropertyUi, + INetCfgComponentPropertyUi_fnSetContext, + INetCfgComponentPropertyUi_fnMergePropPages, + INetCfgComponentPropertyUi_fnValidateProperties, + INetCfgComponentPropertyUi_fnApplyProperties, + INetCfgComponentPropertyUi_fnCancelProperties +}; + +/*************************************************************** + * INetCfgComponentControl interface + */ + +HRESULT +STDCALL +INetCfgComponentControl_fnQueryInterface( + INetCfgComponentControl * iface, + REFIID iid, + LPVOID * ppvObj) +{ + TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); + return INetCfgComponentPropertyUi_QueryInterface((INetCfgComponentPropertyUi*)This, iid, ppvObj); +} + +ULONG +STDCALL +INetCfgComponentControl_fnAddRef( + INetCfgComponentControl * iface) +{ + TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); + return INetCfgComponentPropertyUi_AddRef((INetCfgComponentPropertyUi*)This); +} + +ULONG +STDCALL +INetCfgComponentControl_fnRelease( + INetCfgComponentControl * iface) +{ + TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); + return INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This); +} + +HRESULT +STDCALL +INetCfgComponentControl_fnInitialize( + INetCfgComponentControl * iface, + INetCfgComponent *pIComp, + INetCfg *pINetCfg, + BOOL fInstalling) +{ + TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); + + This->pNCfg = pINetCfg; + This->pNComp = pIComp; + + return S_OK; +} + +HRESULT +STDCALL +INetCfgComponentControl_fnApplyRegistryChanges( + INetCfgComponentControl * iface) +{ + return S_OK; +} + +HRESULT +STDCALL +INetCfgComponentControl_fnApplyPnpChanges( + INetCfgComponentControl * iface, + INetCfgPnpReconfigCallback *pICallback) +{ + return S_OK; +} + +HRESULT +STDCALL +INetCfgComponentControl_fnCancelChanges( + INetCfgComponentControl * iface) +{ + return S_OK; +} + +static const INetCfgComponentControlVtbl vt_NetCfgComponentControl = +{ + INetCfgComponentControl_fnQueryInterface, + INetCfgComponentControl_fnAddRef, + INetCfgComponentControl_fnRelease, + INetCfgComponentControl_fnInitialize, + INetCfgComponentControl_fnApplyRegistryChanges, + INetCfgComponentControl_fnApplyPnpChanges, + INetCfgComponentControl_fnCancelChanges +}; + +HRESULT +STDCALL +TcpipConfigNotify_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + TcpipConfNotifyImpl *This; + + if (!ppv) + return E_POINTER; + + This = (TcpipConfNotifyImpl *) CoTaskMemAlloc(sizeof (TcpipConfNotifyImpl)); + if (!This) + return E_OUTOFMEMORY; + + This->ref = 1; + This->lpVtbl = (const INetCfgComponentPropertyUi*)&vt_NetCfgComponentPropertyUi; + This->lpVtblCompControl = (const INetCfgComponentControl*)&vt_NetCfgComponentControl; + This->pNCfg = NULL; + This->pUnknown = NULL; + This->pNComp = NULL; + + if (!SUCCEEDED (INetCfgComponentPropertyUi_QueryInterface ((INetCfgComponentPropertyUi*)This, riid, ppv))) + { + INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This); + return E_NOINTERFACE; + } + + INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This); + return S_OK; +}
Propchange: trunk/reactos/dll/win32/netcfgx/tcpipconf_notify.c ------------------------------------------------------------------------------ svn:eol-style = native