Author: janderwald
Date: Wed Aug 27 21:57:10 2008
New Revision: 35718
URL:
http://svn.reactos.org/svn/reactos?rev=35718&view=rev
Log:
- Use CoTaskMemAlloc / CoTaskMemFree for memory de-allocation
- Implement INetConnectionManager, IEnumNetConnection, INetConnection interface for
CLSID_ConnectionManager
- Refactor Network Connections Shell Folder enumeration code to use the now available COM
functionality
Added:
trunk/reactos/dll/win32/netshell/connectmanager.c (with props)
Modified:
trunk/reactos/dll/win32/netshell/classfactory.c
trunk/reactos/dll/win32/netshell/enumlist.c
trunk/reactos/dll/win32/netshell/netshell.c
trunk/reactos/dll/win32/netshell/netshell.rbuild
trunk/reactos/dll/win32/netshell/precomp.h
trunk/reactos/dll/win32/netshell/shfldr_netconnect.c
Modified: trunk/reactos/dll/win32/netshell/classfactory.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/classfa…
==============================================================================
--- trunk/reactos/dll/win32/netshell/classfactory.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netshell/classfactory.c [iso-8859-1] Wed Aug 27 21:57:10 2008
@@ -54,7 +54,7 @@
if (!refCount)
{
- HeapFree(GetProcessHeap(),0,This);
+ CoTaskMemFree(This);
return 0;
}
return refCount;
@@ -110,7 +110,7 @@
{
IClassFactoryImpl* lpclf;
- lpclf = HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactoryImpl));
+ lpclf = CoTaskMemAlloc(sizeof(IClassFactoryImpl));
lpclf->ref = 1;
lpclf->lpVtbl = &dclfvt;
lpclf->lpfnCI = lpfnCI;
Added: trunk/reactos/dll/win32/netshell/connectmanager.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/connect…
==============================================================================
--- trunk/reactos/dll/win32/netshell/connectmanager.c (added)
+++ trunk/reactos/dll/win32/netshell/connectmanager.c [iso-8859-1] Wed Aug 27 21:57:10
2008
@@ -1,0 +1,693 @@
+#include <precomp.h>
+
+typedef struct tagINetConnectionItem
+{
+ struct tagINetConnectionItem * Next;
+ NETCON_PROPERTIES Props;
+}INetConnectionItem, *PINetConnectionItem;
+
+typedef struct
+{
+ const INetConnectionManagerVtbl * lpVtbl;
+ const IEnumNetConnectionVtbl * lpVtblNetConnection;
+ LONG ref;
+ PINetConnectionItem pHead;
+ PINetConnectionItem pCurrent;
+
+} INetConnectionManagerImpl, *LPINetConnectionManagerImpl;
+
+typedef struct
+{
+ const INetConnectionVtbl * lpVtbl;
+ LONG ref;
+ NETCON_PROPERTIES Props;
+} INetConnectionImpl, *LPINetConnectionImpl;
+
+
+static LPINetConnectionManagerImpl __inline
impl_from_EnumNetConnection(IEnumNetConnection *iface)
+{
+ return (LPINetConnectionManagerImpl)((char *)iface -
FIELD_OFFSET(INetConnectionManagerImpl, lpVtblNetConnection));
+}
+
+
+static
+HRESULT
+WINAPI
+INetConnectionManager_fnQueryInterface(
+ INetConnectionManager * iface,
+ REFIID iid,
+ LPVOID * ppvObj)
+{
+ INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface;
+ *ppvObj = NULL;
+
+ if (IsEqualIID (iid, &IID_IUnknown) ||
+ IsEqualIID (iid, &IID_INetConnectionManager))
+ {
+ *ppvObj = This;
+ INetConnectionManager_AddRef(iface);
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static
+ULONG
+WINAPI
+INetConnectionManager_fnAddRef(
+ INetConnectionManager * iface)
+{
+ INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface;
+ ULONG refCount = InterlockedIncrement(&This->ref);
+
+ return refCount;
+}
+
+static
+ULONG
+WINAPI
+INetConnectionManager_fnRelease(
+ INetConnectionManager * iface)
+{
+ INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface;
+ ULONG refCount = InterlockedDecrement(&This->ref);
+
+ if (!refCount)
+ {
+ CoTaskMemFree (This);
+ }
+ return refCount;
+}
+
+static
+HRESULT
+WINAPI
+INetConnectionManager_fnEnumConnections(
+ INetConnectionManager * iface,
+ NETCONMGR_ENUM_FLAGS Flags,
+ IEnumNetConnection **ppEnum)
+{
+ INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface;
+
+ if (!ppEnum)
+ return E_POINTER;
+
+ if (Flags != NCME_DEFAULT)
+ return E_FAIL;
+
+ *ppEnum = (IEnumNetConnection *)&This->lpVtblNetConnection;
+ INetConnectionManager_AddRef(iface);
+ return S_OK;
+}
+
+static const INetConnectionManagerVtbl vt_NetConnectionManager =
+{
+ INetConnectionManager_fnQueryInterface,
+ INetConnectionManager_fnAddRef,
+ INetConnectionManager_fnRelease,
+ INetConnectionManager_fnEnumConnections,
+};
+
+/***************************************************************
+ * INetConnection Interface
+ */
+
+static
+HRESULT
+WINAPI
+INetConnection_fnQueryInterface(
+ INetConnection * iface,
+ REFIID iid,
+ LPVOID * ppvObj)
+{
+ INetConnectionImpl * This = (INetConnectionImpl*)iface;
+ *ppvObj = NULL;
+
+ if (IsEqualIID (iid, &IID_IUnknown) ||
+ IsEqualIID (iid, &IID_INetConnection))
+ {
+ *ppvObj = This;
+ INetConnection_AddRef(iface);
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static
+ULONG
+WINAPI
+INetConnection_fnAddRef(
+ INetConnection * iface)
+{
+ INetConnectionImpl * This = (INetConnectionImpl*)iface;
+ ULONG refCount = InterlockedIncrement(&This->ref);
+
+ return refCount;
+}
+
+static
+ULONG
+WINAPI
+INetConnection_fnRelease(
+ INetConnection * iface)
+{
+ INetConnectionImpl * This = (INetConnectionImpl*)iface;
+ ULONG refCount = InterlockedDecrement(&This->ref);
+
+ if (!refCount)
+ {
+ CoTaskMemFree(This->Props.pszwName);
+ CoTaskMemFree(This->Props.pszwDeviceName);
+ CoTaskMemFree(This);
+ }
+ return refCount;
+}
+
+static
+HRESULT
+WINAPI
+INetConnection_fnConnect(
+ INetConnection * iface)
+{
+ return E_NOTIMPL;
+}
+
+static
+HRESULT
+WINAPI
+INetConnection_fnDisconnect(
+ INetConnection * iface)
+{
+ return E_NOTIMPL;
+}
+
+
+static
+HRESULT
+WINAPI
+INetConnection_fnDelete(
+ INetConnection * iface)
+{
+ return E_NOTIMPL;
+}
+
+static
+HRESULT
+WINAPI
+INetConnection_fnDuplicate(
+ INetConnection * iface,
+ LPCWSTR pszwDuplicateName,
+ INetConnection **ppCon)
+{
+ return E_NOTIMPL;
+}
+
+static
+HRESULT
+WINAPI
+INetConnection_fnGetProperties(
+ INetConnection * iface,
+ NETCON_PROPERTIES **ppProps)
+{
+#if 0
+ NETCON_PROPERTIES * pProperties;
+#endif
+ INetConnectionImpl * This = (INetConnectionImpl*)iface;
+
+ if (!ppProps)
+ return E_POINTER;
+
+#if 1
+ *ppProps = &This->Props;
+#else
+ pProperties = CoTaskMemAlloc(sizeof(NETCON_PROPERTIES));
+ if (!pProperties)
+ return E_OUTOFMEMORY;
+
+ CopyMemory(pProperties, &This->Props, sizeof(NETCON_PROPERTIES));
+ if (This->Props.pszwName)
+ {
+ pProperties->pszwName =
CoTaskMemAlloc((wcslen(This->Props.pszwName)+1)*sizeof(WCHAR));
+ if (pProperties->pszwName)
+ wcscpy(pProperties->pszwName, This->Props.pszwName);
+ }
+ if (This->Props.pszwDeviceName)
+ {
+ pProperties->pszwDeviceName =
CoTaskMemAlloc((wcslen(This->Props.pszwDeviceName)+1)*sizeof(WCHAR));
+ if (pProperties->pszwDeviceName)
+ wcscpy(pProperties->pszwDeviceName, This->Props.pszwDeviceName);
+ }
+
+ *ppProps = pProperties;
+#endif
+ return NOERROR;
+}
+
+static
+HRESULT
+WINAPI
+INetConnection_fnGetUiObjectClassId(
+ INetConnection * iface,
+ CLSID *pclsid)
+{
+ return E_NOTIMPL;
+}
+
+static
+HRESULT
+WINAPI
+INetConnection_fnRename(
+ INetConnection * iface,
+ LPCWSTR pszwDuplicateName)
+{
+ return E_NOTIMPL;
+}
+
+
+static const INetConnectionVtbl vt_NetConnection =
+{
+ INetConnection_fnQueryInterface,
+ INetConnection_fnAddRef,
+ INetConnection_fnRelease,
+ INetConnection_fnConnect,
+ INetConnection_fnDisconnect,
+ INetConnection_fnDelete,
+ INetConnection_fnDuplicate,
+ INetConnection_fnGetProperties,
+ INetConnection_fnGetUiObjectClassId,
+ INetConnection_fnRename
+};
+
+HRESULT WINAPI IConnection_Constructor (INetConnection **ppv, PINetConnectionItem pItem)
+{
+ INetConnectionImpl *This;
+
+ if (!ppv)
+ return E_POINTER;
+
+ This = (INetConnectionImpl *) CoTaskMemAlloc(sizeof (INetConnectionImpl));
+ if (!This)
+ return E_OUTOFMEMORY;
+
+ This->ref = 1;
+ This->lpVtbl = &vt_NetConnection;
+
+ CopyMemory(&This->Props, &pItem->Props, sizeof(NETCON_PROPERTIES));
+
+ This->Props.pszwName =
CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR));
+ if (This->Props.pszwName)
+ wcscpy(This->Props.pszwName, pItem->Props.pszwName);
+
+ This->Props.pszwDeviceName =
CoTaskMemAlloc((wcslen(pItem->Props.pszwDeviceName)+1)*sizeof(WCHAR));
+ if (This->Props.pszwDeviceName)
+ wcscpy(This->Props.pszwDeviceName, pItem->Props.pszwDeviceName);
+
+ *ppv = (INetConnection *)This;
+
+
+ return S_OK;
+}
+
+
+/***************************************************************
+ * IEnumNetConnection Interface
+ */
+
+static
+HRESULT
+WINAPI
+IEnumNetConnection_fnQueryInterface(
+ IEnumNetConnection * iface,
+ REFIID iid,
+ LPVOID * ppvObj)
+{
+ INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface);
+ *ppvObj = NULL;
+
+ if (IsEqualIID (iid, &IID_IUnknown) ||
+ IsEqualIID (iid, &IID_INetConnectionManager))
+ {
+ *ppvObj = This;
+ INetConnectionManager_AddRef(iface);
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static
+ULONG
+WINAPI
+IEnumNetConnection_fnAddRef(
+ IEnumNetConnection * iface)
+{
+ INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface);
+ ULONG refCount = InterlockedIncrement(&This->ref);
+
+ return refCount;
+}
+
+static
+ULONG
+WINAPI
+IEnumNetConnection_fnRelease(
+ IEnumNetConnection * iface)
+{
+ INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface);
+ ULONG refCount = InterlockedDecrement(&This->ref);
+
+ if (!refCount)
+ {
+ CoTaskMemFree (This);
+ }
+ return refCount;
+}
+
+static
+HRESULT
+WINAPI
+IEnumNetConnection_fnNext(
+ IEnumNetConnection * iface,
+ ULONG celt,
+ INetConnection **rgelt,
+ ULONG *pceltFetched)
+{
+ INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface);
+ HRESULT hr;
+
+ if (!pceltFetched || !rgelt)
+ return E_POINTER;
+
+ if (celt != 1)
+ return E_FAIL;
+
+ if (!This->pCurrent)
+ return S_FALSE;
+
+ hr = IConnection_Constructor(rgelt, This->pCurrent);
+ This->pCurrent = This->pCurrent->Next;
+
+ return hr;
+}
+
+static
+HRESULT
+WINAPI
+IEnumNetConnection_fnSkip(
+ IEnumNetConnection * iface,
+ ULONG celt)
+{
+ INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface);
+
+ while(This->pCurrent && celt-- > 0)
+ This->pCurrent = This->pCurrent->Next;
+
+ if (celt)
+ return S_FALSE;
+ else
+ return NOERROR;
+
+}
+
+static
+HRESULT
+WINAPI
+IEnumNetConnection_fnReset(
+ IEnumNetConnection * iface)
+{
+ INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface);
+
+ This->pCurrent = This->pHead;
+ return NOERROR;
+}
+
+static
+HRESULT
+WINAPI
+IEnumNetConnection_fnClone(
+ IEnumNetConnection * iface,
+ IEnumNetConnection **ppenum)
+{
+ return E_NOTIMPL;
+}
+
+static const IEnumNetConnectionVtbl vt_EnumNetConnection =
+{
+ IEnumNetConnection_fnQueryInterface,
+ IEnumNetConnection_fnAddRef,
+ IEnumNetConnection_fnRelease,
+ IEnumNetConnection_fnNext,
+ IEnumNetConnection_fnSkip,
+ IEnumNetConnection_fnReset,
+ IEnumNetConnection_fnClone
+};
+
+static
+BOOL
+GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg,
PDWORD pIndex)
+{
+ WCHAR szBuffer[50];
+ IP_ADAPTER_INFO * pCurrentAdapter;
+
+ pCurrentAdapter = pAdapterInfo;
+ while(pCurrentAdapter)
+ {
+ szBuffer[0] = L'\0';
+ if (MultiByteToWideChar(CP_ACP, 0, pCurrentAdapter->AdapterName, -1, szBuffer,
sizeof(szBuffer)/sizeof(szBuffer[0])))
+ {
+ szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
+ }
+ if (!wcsicmp(szBuffer, szNetCfg))
+ {
+ *pIndex = pCurrentAdapter->Index;
+ return TRUE;
+ }
+ pCurrentAdapter = pCurrentAdapter->Next;
+ }
+ return FALSE;
+}
+
+
+static
+BOOL
+EnumerateINetConnections(INetConnectionManagerImpl *This)
+{
+ DWORD dwSize, dwResult, dwIndex, dwAdapterIndex, dwShowIcon;
+ MIB_IFTABLE *pIfTable;
+ MIB_IFROW IfEntry;
+ IP_ADAPTER_INFO * pAdapterInfo;
+ HDEVINFO hInfo;
+ SP_DEVINFO_DATA DevInfo;
+ HKEY hSubKey;
+ WCHAR szNetCfg[50];
+ WCHAR szAdapterNetCfg[50];
+ WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\";
+ WCHAR szName[130] =
L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
+ PINetConnectionItem pNew;
+ PINetConnectionItem pCurrent = NULL;
+
+ /* get the IfTable */
+ dwSize = 0;
+ if (GetIfTable(NULL, &dwSize, TRUE) != ERROR_INSUFFICIENT_BUFFER)
+ return FALSE;
+
+ pIfTable = (PMIB_IFTABLE)CoTaskMemAlloc(dwSize);
+ if (!pIfTable)
+ return FALSE;
+
+ dwResult = GetIfTable(pIfTable, &dwSize, TRUE);
+ if (dwResult != NO_ERROR)
+ {
+ CoTaskMemFree(pIfTable);
+ return FALSE;
+ }
+
+ dwSize = 0;
+ dwResult = GetAdaptersInfo(NULL, &dwSize);
+ if (dwResult!= ERROR_BUFFER_OVERFLOW)
+ {
+ CoTaskMemFree(pIfTable);
+ return FALSE;
+ }
+
+ pAdapterInfo = (PIP_ADAPTER_INFO)CoTaskMemAlloc(dwSize);
+ if (!pAdapterInfo)
+ {
+ CoTaskMemFree(pIfTable);
+ return FALSE;
+ }
+
+ if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR)
+ {
+ CoTaskMemFree(pIfTable);
+ CoTaskMemFree(pAdapterInfo);
+ return FALSE;
+ }
+
+
+ hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
+ if (!hInfo)
+ {
+ CoTaskMemFree(pIfTable);
+ CoTaskMemFree(pAdapterInfo);
+ return FALSE;
+ }
+
+ dwIndex = 0;
+ do
+ {
+ ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
+ DevInfo.cbSize = sizeof(DevInfo);
+
+ /* get device info */
+ if (!SetupDiEnumDeviceInfo(hInfo, dwIndex++, &DevInfo))
+ break;
+
+ /* get device software registry path */
+ if (!SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DRIVER, NULL,
(LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize))
+ break;
+
+ /* open device registry key */
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szDetail, 0, KEY_READ, &hSubKey) !=
ERROR_SUCCESS)
+ break;
+
+ /* query NetCfgInstanceId for current device */
+ dwSize = sizeof(szNetCfg);
+ if (RegQueryValueExW(hSubKey, L"NetCfgInstanceId", NULL, NULL,
(LPBYTE)szNetCfg, &dwSize) != ERROR_SUCCESS)
+ {
+ RegCloseKey(hSubKey);
+ break;
+ }
+ RegCloseKey(hSubKey);
+ /* get the current adapter index from NetCfgInstanceId */
+ if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo, szNetCfg,
&dwAdapterIndex))
+ break;
+
+ /* get detailed adapter info */
+ ZeroMemory(&IfEntry, sizeof(IfEntry));
+ IfEntry.dwIndex = dwAdapterIndex;
+ if(GetIfEntry(&IfEntry) != NO_ERROR)
+ break;
+
+ /* allocate new INetConnectionItem */
+ pNew = CoTaskMemAlloc(sizeof(INetConnectionItem));
+ if (!pNew)
+ break;
+
+ ZeroMemory(pNew, sizeof(INetConnectionItem));
+
+ /* store NetCfgInstanceId */
+ CLSIDFromString(szNetCfg, &pNew->Props.guidId);
+ switch(IfEntry.dwOperStatus)
+ {
+ case MIB_IF_OPER_STATUS_NON_OPERATIONAL:
+ pNew->Props.Status = NCS_HARDWARE_DISABLED;
+ break;
+ case MIB_IF_OPER_STATUS_UNREACHABLE:
+ pNew->Props.Status = NCS_DISCONNECTED;
+ break;
+ case MIB_IF_OPER_STATUS_DISCONNECTED:
+ pNew->Props.Status = NCS_MEDIA_DISCONNECTED;
+ break;
+ case MIB_IF_OPER_STATUS_CONNECTING:
+ pNew->Props.Status = NCS_CONNECTING;
+ break;
+ case MIB_IF_OPER_STATUS_CONNECTED:
+ pNew->Props.Status = NCS_CONNECTED;
+ break;
+ case MIB_IF_OPER_STATUS_OPERATIONAL:
+ pNew->Props.Status = NCS_CONNECTED;
+ break;
+ default:
+ break;
+ }
+
+ switch(IfEntry.dwType)
+ {
+ case IF_TYPE_ETHERNET_CSMACD:
+ pNew->Props.MediaType = NCM_LAN;
+ break;
+ case IF_TYPE_IEEE80211:
+ pNew->Props.MediaType = NCM_SHAREDACCESSHOST_RAS;
+ break;
+ default:
+ break;
+ }
+ /* open network connections details */
+ wcscpy(&szName[80], szNetCfg);
+ wcscpy(&szName[118], L"\\Connection");
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szName, 0, KEY_READ, &hSubKey) ==
ERROR_SUCCESS)
+ {
+ /* retrieve name of connection */
+ dwSize = sizeof(szAdapterNetCfg);
+ if (RegQueryValueExW(hSubKey, L"Name", NULL, NULL,
(LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
+ {
+ pNew->Props.pszwName = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) *
sizeof(WCHAR));
+ if (pNew->Props.pszwName)
+ wcscpy(pNew->Props.pszwName, szAdapterNetCfg);
+ }
+ dwSize = sizeof(dwShowIcon);
+ if (RegQueryValueExW(hSubKey, L"ShowIcon", NULL, NULL,
(LPBYTE)&dwShowIcon, &dwSize) == ERROR_SUCCESS)
+ {
+ if (dwShowIcon)
+ pNew->Props.dwCharacter |= NCCF_SHOW_ICON;
+ }
+ RegCloseKey(hSubKey);
+ }
+ if (SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DEVICEDESC,
NULL, (PBYTE)szNetCfg, sizeof(szNetCfg)/sizeof(WCHAR), &dwSize))
+ {
+ szNetCfg[(sizeof(szNetCfg)/sizeof(WCHAR))-1] = L'\0';
+ pNew->Props.pszwDeviceName = CoTaskMemAlloc((wcslen(szNetCfg)+1) *
sizeof(WCHAR));
+ if (pNew->Props.pszwDeviceName)
+ wcscpy(pNew->Props.pszwDeviceName, szNetCfg);
+ }
+
+ if (pCurrent)
+ pCurrent->Next = pNew;
+ else
+ This->pHead = pNew;
+
+ pCurrent = pNew;
+ }while(TRUE);
+
+ CoTaskMemFree(pIfTable);
+ CoTaskMemFree(pAdapterInfo);
+ SetupDiDestroyDeviceInfoList(hInfo);
+
+ This->pCurrent = This->pHead;
+ return TRUE;
+}
+
+HRESULT WINAPI INetConnectionManager_Constructor (IUnknown * pUnkOuter, REFIID riid,
LPVOID * ppv)
+{
+ INetConnectionManagerImpl *sf;
+
+ if (!ppv)
+ return E_POINTER;
+ if (pUnkOuter)
+ return CLASS_E_NOAGGREGATION;
+
+ sf = (INetConnectionManagerImpl *) CoTaskMemAlloc(sizeof
(INetConnectionManagerImpl));
+ if (!sf)
+ return E_OUTOFMEMORY;
+
+ sf->ref = 1;
+ sf->lpVtbl = &vt_NetConnectionManager;
+ sf->lpVtblNetConnection = &vt_EnumNetConnection;
+
+
+ if (!SUCCEEDED (INetConnectionManager_QueryInterface ((INetConnectionManager*)sf,
riid, ppv)))
+ {
+ INetConnectionManager_Release((INetConnectionManager*)sf);
+ return E_NOINTERFACE;
+ }
+
+ INetConnectionManager_Release((INetConnectionManager*)sf);
+ EnumerateINetConnections(sf);
+ return S_OK;
+}
+
+
Propchange: trunk/reactos/dll/win32/netshell/connectmanager.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/dll/win32/netshell/enumlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/enumlis…
==============================================================================
--- trunk/reactos/dll/win32/netshell/enumlist.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netshell/enumlist.c [iso-8859-1] Wed Aug 27 21:57:10 2008
@@ -129,7 +129,7 @@
SHFree(pDelete->pidl);
SHFree(pDelete);
}
- HeapFree(GetProcessHeap(),0,This);
+ CoTaskMemFree(This);
}
return refCount;
}
@@ -242,13 +242,15 @@
IEnumIDList * IEnumIDList_Constructor(void)
{
- IEnumIDListImpl *lpeidl = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl));
+ IEnumIDListImpl *lpeidl = CoTaskMemAlloc(sizeof(IEnumIDListImpl));
if (lpeidl)
{
lpeidl->ref = 1;
lpeidl->lpVtbl = &eidlvt;
+ lpeidl->mpCurrent = NULL;
+ lpeidl->mpLast = NULL;
+ lpeidl->mpFirst = NULL;
}
return (IEnumIDList*)lpeidl;
@@ -322,34 +324,24 @@
return FALSE;
}
-LPITEMIDLIST ILCreateNetConnectItem(MIB_IFROW * pRow, LPWSTR szName, LPWSTR
szAdapterName)
-{
- PIDLDATA tmp;
+LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem)
+{
LPITEMIDLIST pidl;
- VALUEStruct * p;
- int size = sizeof(struct tagVALUEStruct);
-
- tmp.type = 0x00;
- tmp.u.value.dummy = 0xFF;
-
- tmp.u.value.dwOperStatus = pRow->dwOperStatus;
- tmp.u.value.dwType = pRow->dwType;
- tmp.u.value.dwNameLength = wcslen(szName) + 1;
-
- size += (tmp.u.value.dwNameLength + wcslen(szAdapterName)) * sizeof(WCHAR);
-
- pidl = (LPITEMIDLIST)SHAlloc(size + 4);
+ LPPIDLDATA pdata;
+ int size = sizeof(PIDLDATA);
+
+ pidl = (LPITEMIDLIST)SHAlloc(size + 2 * sizeof(SHITEMID));
if (!pidl)
return pidl;
-
- pidl->mkid.cb = size+2;
- memcpy(pidl->mkid.abID, &tmp, 2+sizeof(struct tagVALUEStruct));
-
- p = &((PIDLDATA*)pidl->mkid.abID)->u.value;
- wcscpy(&p->szName[0], szName);
- wcscpy(p->szName + tmp.u.value.dwNameLength, szAdapterName);
-
- *(WORD*)((char*)pidl+(size+2)) = 0;
+ ZeroMemory(pidl, size + 2 * sizeof(SHITEMID));
+
+ pidl->mkid.cb = size + sizeof(SHITEMID);
+
+ pdata = _ILGetDataPointer(pidl);
+ pdata->type = 0x99;
+ pdata->u.value.dummy = 0xFF;
+ pdata->u.value.pItem = (PVOID)pItem;
+
return pidl;
}
@@ -357,7 +349,7 @@
{
LPPIDLDATA pdata = _ILGetDataPointer(pidl);
- if (pdata && pdata->type==0x00)
+ if (pdata && pdata->type==0x99)
return (VALUEStruct*)&(pdata->u.value);
return NULL;
Modified: trunk/reactos/dll/win32/netshell/netshell.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/netshel…
==============================================================================
--- trunk/reactos/dll/win32/netshell/netshell.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netshell/netshell.c [iso-8859-1] Wed Aug 27 21:57:10 2008
@@ -11,6 +11,10 @@
{
&CLSID_NetworkConnections,
ISF_NetConnect_Constructor
+ },
+ {
+ &CLSID_ConnectionManager,
+ INetConnectionManager_Constructor
},
{
NULL,
Modified: trunk/reactos/dll/win32/netshell/netshell.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/netshel…
==============================================================================
--- trunk/reactos/dll/win32/netshell/netshell.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netshell/netshell.rbuild [iso-8859-1] Wed Aug 27 21:57:10
2008
@@ -23,5 +23,6 @@
<file>enumlist.c</file>
<file>netshell.rc</file>
<file>classfactory.c</file>
+ <file>connectmanager.c</file>
<file>netshell.spec</file>
</module>
Modified: trunk/reactos/dll/win32/netshell/precomp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/precomp…
==============================================================================
--- trunk/reactos/dll/win32/netshell/precomp.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netshell/precomp.h [iso-8859-1] Wed Aug 27 21:57:10 2008
@@ -32,6 +32,7 @@
#include <shtypes.h>
#include <setupapi.h>
#include <devguid.h>
+#include <netcon.h>
#include "wine/debug.h"
#include "wine/unicode.h"
@@ -53,10 +54,7 @@
typedef struct tagVALUEStruct
{
BYTE dummy;
- DWORD dwType;
- DWORD dwOperStatus;
- DWORD dwNameLength;
- WCHAR szName[1];
+ INetConnection * pItem;
}VALUEStruct;
/* globals */
@@ -71,7 +69,7 @@
/* enumlist.c */
IEnumIDList * IEnumIDList_Constructor(void);
LPITEMIDLIST _ILCreateNetConnect();
-LPITEMIDLIST ILCreateNetConnectItem(MIB_IFROW * pRow, LPWSTR szName, LPWSTR
szAdapterName);
+LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem);
BOOL _ILIsNetConnect (LPCITEMIDLIST pidl);
BOOL AddToEnumList(IEnumIDList * iface, LPITEMIDLIST pidl);
VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl);
@@ -79,4 +77,7 @@
/* classfactory.c */
IClassFactory * IClassFactory_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll,
REFIID riidInst);
+/* connectmanager.c */
+HRESULT WINAPI INetConnectionManager_Constructor (IUnknown * pUnkOuter, REFIID riid,
LPVOID * ppv);
+
#endif
Modified: trunk/reactos/dll/win32/netshell/shfldr_netconnect.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/shfldr_…
==============================================================================
--- trunk/reactos/dll/win32/netshell/shfldr_netconnect.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netshell/shfldr_netconnect.c [iso-8859-1] Wed Aug 27 21:57:10
2008
@@ -117,7 +117,7 @@
if (!refCount)
{
SHFree (This->pidlRoot);
- HeapFree (GetProcessHeap(), 0, This);
+ CoTaskMemFree(This);
}
return refCount;
}
@@ -145,140 +145,46 @@
*/
static BOOL CreateNetConnectEnumList(IEnumIDList *list, DWORD dwFlags)
{
- DWORD dwSize, dwResult, dwIndex;
- MIB_IFTABLE *pIfTable;
- MIB_IFROW IfEntry;
- IP_ADAPTER_INFO * pAdapterInfo, *pCurrentAdapter;
- HDEVINFO hInfo;
- SP_DEVINFO_DATA DevInfo;
- HKEY hSubKey;
- WCHAR szNetCfg[50];
- WCHAR szAdapterNetCfg[50];
+ HRESULT hr;
+ INetConnectionManager * INetConMan;
+ IEnumNetConnection * IEnumCon;
+ INetConnection * INetCon;
+ ULONG Count;
LPITEMIDLIST pidl;
- WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\";
- WCHAR szName[130] =
L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
-
- /* get the IfTable */
- dwSize = 0;
- if (GetIfTable(NULL, &dwSize, TRUE) != ERROR_INSUFFICIENT_BUFFER)
+
+ /* get an instance to of IConnectionManager */
+ hr = INetConnectionManager_Constructor(NULL, &IID_INetConnectionManager,
(LPVOID*)&INetConMan);
+ if (FAILED(hr))
return FALSE;
- pIfTable = (PMIB_IFTABLE)HeapAlloc(GetProcessHeap(), 0, dwSize);
- if (!pIfTable)
+ hr = INetConnectionManager_EnumConnections(INetConMan, NCME_DEFAULT, &IEnumCon);
+ if (FAILED(hr))
+ {
+ INetConnectionManager_Release(INetConMan);
return FALSE;
-
- dwResult = GetIfTable(pIfTable, &dwSize, TRUE);
- if (dwResult != NO_ERROR)
- {
- HeapFree(GetProcessHeap(), 0, pIfTable);
- return FALSE;
- }
-
- dwSize = 0;
- dwResult = GetAdaptersInfo(NULL, &dwSize);
- if (dwResult!= ERROR_BUFFER_OVERFLOW)
- {
- HeapFree(GetProcessHeap(), 0, pIfTable);
- return FALSE;
- }
-
- pAdapterInfo = (PIP_ADAPTER_INFO)HeapAlloc(GetProcessHeap(), 0, dwSize);
- if (!pAdapterInfo)
- {
- HeapFree(GetProcessHeap(), 0, pIfTable);
- return FALSE;
- }
-
- if (GetAdaptersInfo(pAdapterInfo, &dwSize) != NO_ERROR)
- {
- HeapFree(GetProcessHeap(), 0, pIfTable);
- HeapFree(GetProcessHeap(), 0, pAdapterInfo);
- return FALSE;
- }
-
-
- hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
- if (!hInfo)
- {
- HeapFree(GetProcessHeap(), 0, pIfTable);
- HeapFree(GetProcessHeap(), 0, pAdapterInfo);
- return FALSE;
- }
-
- dwIndex = 0;
+ }
+
do
{
- ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
- DevInfo.cbSize = sizeof(DevInfo);
- if (SetupDiEnumDeviceInfo(hInfo, dwIndex++, &DevInfo))
+ hr = IEnumNetConnection_Next(IEnumCon, 1, &INetCon, &Count);
+ if (hr == S_OK)
{
- if (SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DRIVER,
NULL, (LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize))
+ pidl = ILCreateNetConnectItem(INetCon);
+ if (pidl)
{
- if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szDetail, 0, KEY_READ,
&hSubKey) == ERROR_SUCCESS)
- {
- dwSize = sizeof(szNetCfg);
- dwResult = RegQueryValueExW(hSubKey, L"NetCfgInstanceId",
NULL, NULL, (LPBYTE)szNetCfg, &dwSize);
- if (dwResult == ERROR_SUCCESS)
- {
- pCurrentAdapter = pAdapterInfo;
- while(pCurrentAdapter)
- {
- szAdapterNetCfg[0] = L'\0';
- if (MultiByteToWideChar(CP_ACP, 0,
pCurrentAdapter->AdapterName, -1, szAdapterNetCfg,
sizeof(szAdapterNetCfg)/sizeof(szAdapterNetCfg[0])))
- {
-
szAdapterNetCfg[(sizeof(szAdapterNetCfg)/sizeof(WCHAR))-1] = L'\0';
- }
- if (!wcsicmp(szAdapterNetCfg, szNetCfg))
- {
- ZeroMemory(&IfEntry, sizeof(IfEntry));
- IfEntry.dwIndex = pCurrentAdapter->Index;
- dwResult = GetIfEntry(&IfEntry);
- if (dwResult == NO_ERROR)
- {
- if (IfEntry.dwType == IF_TYPE_ETHERNET_CSMACD ||
IfEntry.dwType == IF_TYPE_IEEE80211)
- {
- wcscpy(&szName[80], szNetCfg);
- wcscpy(&szName[118],
L"\\Connection");
- if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szName, 0,
KEY_READ, &hSubKey) == ERROR_SUCCESS)
- {
- dwSize = sizeof(szAdapterNetCfg);
- if (RegQueryValueExW(hSubKey,
L"Name", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) != ERROR_SUCCESS)
- {
- if
(!SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_FRIENDLYNAME, NULL,
(PBYTE)szAdapterNetCfg, sizeof(szAdapterNetCfg)/sizeof(WCHAR), &dwSize))
- {
- szDetail[0] = 0;
- }
- }
- RegCloseKey(hSubKey);
- }
- szNetCfg[0] = 0;
- SetupDiGetDeviceRegistryPropertyW(hInfo,
&DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szNetCfg, sizeof(szNetCfg)/sizeof(WCHAR),
&dwSize);
- pidl = ILCreateNetConnectItem(&IfEntry,
szAdapterNetCfg, szNetCfg);
- if (pidl)
- {
- AddToEnumList(list, pidl);
- }
- }
- }
- break;
- }
- pCurrentAdapter = pCurrentAdapter->Next;
- }
- }
- }
+ AddToEnumList(list, pidl);
}
- }else if (GetLastError() == ERROR_NO_MORE_ITEMS)
+ }
+ else
{
break;
}
}while(TRUE);
- HeapFree(GetProcessHeap(), 0, pAdapterInfo);
- HeapFree(GetProcessHeap(), 0, pIfTable);
- SetupDiDestroyDeviceInfoList(hInfo);
-
- return FALSE;
-
+ IEnumNetConnection_Release(IEnumCon);
+ INetConnectionManager_Release(INetConMan);
+
+ return TRUE;
}
/**************************************************************************
@@ -450,6 +356,8 @@
{
LPWSTR pszName;
HRESULT hr = E_FAIL;
+ NETCON_PROPERTIES * pProperties;
+ VALUEStruct * val;
//IGenericSFImpl *This = (IGenericSFImpl *)iface;
if (!strRet)
@@ -469,11 +377,18 @@
}
else
{
- VALUEStruct * val = _ILGetValueStruct(pidl);
+ val = _ILGetValueStruct(pidl);
if (val)
{
- wcscpy(pszName, val->szName);
- hr = S_OK;
+ if (INetConnection_GetProperties((INetConnection*)val->pItem,
&pProperties) == NOERROR)
+ {
+ if (pProperties->pszwName)
+ {
+ wcscpy(pszName, pProperties->pszwName);
+ hr = S_OK;
+ }
+ //NcFreeNetconProperties(pProperties);
+ }
}
}
@@ -567,6 +482,7 @@
WCHAR buffer[MAX_PATH] = {0};
HRESULT hr = E_FAIL;
VALUEStruct * val;
+ NETCON_PROPERTIES * pProperties;
if (iColumn >= NETCONNECTSHELLVIEWCOLUMNS)
return E_FAIL;
@@ -592,10 +508,14 @@
if (!val)
return E_FAIL;
+ if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) !=
NOERROR)
+ return E_FAIL;
+
+
switch(iColumn)
{
case COLUMN_TYPE:
- if (val->dwType == IF_TYPE_ETHERNET_CSMACD || val->dwType ==
IF_TYPE_IEEE80211)
+ if (pProperties->MediaType == NCM_LAN || pProperties->MediaType ==
NCM_SHAREDACCESSHOST_RAS)
{
if (LoadStringW(netshell_hInstance, IDS_TYPE_ETHERNET, buffer,
MAX_PATH))
{
@@ -606,18 +526,16 @@
break;
case COLUMN_STATUS:
buffer[0] = L'\0';
- if (val->dwOperStatus == MIB_IF_OPER_STATUS_NON_OPERATIONAL)
+ if (pProperties->Status == NCS_HARDWARE_DISABLED)
LoadStringW(netshell_hInstance, IDS_STATUS_NON_OPERATIONAL, buffer,
MAX_PATH);
- else if (val->dwOperStatus == MIB_IF_OPER_STATUS_UNREACHABLE)
+ else if (pProperties->Status == NCS_DISCONNECTED)
LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, buffer,
MAX_PATH);
- else if (val->dwOperStatus == MIB_IF_OPER_STATUS_DISCONNECTED)
+ else if (pProperties->Status == NCS_MEDIA_DISCONNECTED)
LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, buffer,
MAX_PATH);
- else if (val->dwOperStatus == MIB_IF_OPER_STATUS_CONNECTING)
+ else if (pProperties->Status == NCS_CONNECTING)
LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, buffer,
MAX_PATH);
- else if (val->dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED)
+ else if (pProperties->Status == NCS_CONNECTED)
LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, buffer, MAX_PATH);
- else if (val->dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL)
- LoadStringW(netshell_hInstance, IDS_STATUS_OPERATIONAL, buffer,
MAX_PATH);
if (buffer[0])
{
@@ -627,7 +545,7 @@
}
break;
case COLUMN_DEVNAME:
- wcscpy(buffer, val->szName + val->dwNameLength);
+ wcscpy(buffer, pProperties->pszwDeviceName);
buffer[MAX_PATH-1] = L'\0';
psd->str.uType = STRRET_WSTR;
hr = SHStrDupW(buffer, &psd->str.u.pOleStr);
@@ -638,7 +556,9 @@
psd->str.uType = STRRET_CSTR;
break;
}
-
+#if 0
+ NcFreeNetconProperties(pProperties);
+#endif
return hr;
}
@@ -885,7 +805,7 @@
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
- sf = (IGenericSFImpl *) HeapAlloc ( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof
(IGenericSFImpl));
+ sf = (IGenericSFImpl *) CoTaskMemAlloc(sizeof (IGenericSFImpl));
if (!sf)
return E_OUTOFMEMORY;