ReactOS 0.4.17-dev-116-ga4b6fe9
netcfg_iface.c
Go to the documentation of this file.
1#include "precomp.h"
2
3static __inline INetCfgImpl* impl_from_INetCfgLock(INetCfgLock *iface)
4{
5 return (INetCfgImpl*)((char *)iface - FIELD_OFFSET(INetCfgImpl, lpVtblLock));
6}
7
8static __inline INetCfgImpl* impl_from_INetCfgPnpReconfigCallback(INetCfgPnpReconfigCallback *iface)
9{
10 return (INetCfgImpl*)((char *)iface - FIELD_OFFSET(INetCfgImpl, lpVtblPnpReconfigCallback));
11}
12
13
17 INetCfgLock * iface,
18 REFIID iid,
19 LPVOID * ppvObj)
20{
22 return INetCfg_QueryInterface((INetCfg*)This, iid, ppvObj);
23}
24
25
29 INetCfgLock * iface)
30{
32
33 return INetCfg_AddRef((INetCfg*)This);
34}
35
39 INetCfgLock * iface)
40{
42 return INetCfg_Release((INetCfg*)This);
43}
44
48 INetCfgLock * iface,
49 DWORD cmsTimeout,
50 LPCWSTR pszwClientDescription,
51 LPWSTR *ppszwClientDescription)
52{
53 DWORD dwResult;
54 HKEY hKey;
55 WCHAR szValue[100];
57
58 if (This->bInitialized)
60
61 dwResult = WaitForSingleObject(This->hMutex, cmsTimeout);
62 if (dwResult == WAIT_TIMEOUT)
63 {
64 if (ppszwClientDescription)
65 {
66 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Network\\NetCfgLockHolder", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
67 {
68 dwResult = sizeof(szValue);
69 if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szValue, &dwResult) == ERROR_SUCCESS)
70 {
71 szValue[(sizeof(szValue)/sizeof(WCHAR))-1] = L'\0';
72 *ppszwClientDescription = CoTaskMemAlloc((wcslen(szValue)+1) * sizeof(WCHAR));
73 if (*ppszwClientDescription)
74 wcscpy(*ppszwClientDescription, szValue);
75 }
77 }
78 }
79 return S_FALSE;
80 }
81 else if (dwResult == WAIT_OBJECT_0)
82 {
83 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Network\\NetCfgLockHolder", 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
84 {
85 RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE)pszwClientDescription, (wcslen(pszwClientDescription)+1) * sizeof(WCHAR));
87 }
88 return S_OK;
89 }
90
91 return E_FAIL;
92}
93
97 INetCfgLock * iface)
98{
100
101 if (This->bInitialized)
103
104
105 if (ReleaseMutex(This->hMutex))
106 return S_OK;
107 else
108 return S_FALSE;
109}
110
112WINAPI
114 INetCfgLock * iface,
115 LPWSTR *ppszwClientDescription)
116{
117 HKEY hKey;
118 WCHAR szValue[100];
119 DWORD dwSize, dwType;
120 HRESULT hr;
121
122 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Network\\NetCfgLockHolder", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
123 return S_FALSE;
124
125 dwSize = sizeof(szValue);
126 if (RegQueryValueExW(hKey, NULL, NULL, &dwType, (LPBYTE)szValue, &dwSize) == ERROR_SUCCESS && dwType == REG_SZ)
127 {
128 hr = S_OK;
129 szValue[(sizeof(szValue)/sizeof(WCHAR))-1] = L'\0';
130 *ppszwClientDescription = CoTaskMemAlloc((wcslen(szValue)+1) * sizeof(WCHAR));
131 if (*ppszwClientDescription)
132 wcscpy(*ppszwClientDescription, szValue);
133 else
135 }
136 else
137 {
138 hr = E_FAIL;
139 }
141 return hr;
142}
143
144static const INetCfgLockVtbl vt_NetCfgLock =
145{
152};
153
154/***************************************************************
155 * INetCfgPnpReconfigCallback
156 */
157
159WINAPI
161 INetCfgPnpReconfigCallback * iface,
162 REFIID iid,
163 LPVOID * ppvObj)
164{
166 return INetCfg_QueryInterface((INetCfg*)This, iid, ppvObj);
167}
168
169ULONG
170WINAPI
172 INetCfgPnpReconfigCallback * iface)
173{
175
176 return INetCfg_AddRef((INetCfg*)This);
177}
178
179ULONG
180WINAPI
182 INetCfgPnpReconfigCallback * iface)
183{
185 return INetCfg_Release((INetCfg*)This);
186}
187
189WINAPI
191 INetCfgPnpReconfigCallback * iface,
193 LPCWSTR pszwUpper,
194 LPCWSTR pszwLower,
196 DWORD dwSizeOfData)
197{
198 /* FIXME */
199 return E_NOTIMPL;
200}
201
202static const INetCfgPnpReconfigCallbackVtbl vt_NetCfgPnpReconfigCallback =
203{
208};
209
210
211/***************************************************************
212 * INetCfg
213 */
214
218{
219 WCHAR szBuffer[200];
220 HKEY hKey;
221 DWORD dwType, dwSize;
222
223 if (Item == NULL || Item->szBindName == NULL)
224 return S_OK;
225
226 wcscpy(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\");
227 wcscat(szBuffer, Item->szBindName);
228 wcscat(szBuffer, L"\\Linkage");
229
231 {
232 dwSize = 0;
233 RegQueryValueExW(hKey, L"Bind", NULL, &dwType, NULL, &dwSize);
234
235 if (dwSize != 0)
236 {
237 Item->pszBinding = CoTaskMemAlloc(dwSize);
238 if (Item->pszBinding == NULL)
239 return E_OUTOFMEMORY;
240
241 RegQueryValueExW(hKey, L"Bind", NULL, &dwType, (LPBYTE)Item->pszBinding, &dwSize);
242 }
243
245 }
246
247 return S_OK;
248}
249
252{
253 DWORD dwIndex = 0;
255 DWORD dwType;
256 WCHAR szName[100];
257 WCHAR szText[100];
258 HKEY hSubKey, hNDIKey, hInterfacesKey;
259 NetCfgComponentItem * pLast = NULL, *pCurrent;
260
261 *pHead = NULL;
262 do
263 {
264 szText[0] = L'\0';
265
266 dwSize = sizeof(szName)/sizeof(WCHAR);
267 if (RegEnumKeyExW(hKey, dwIndex++, szName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
268 {
269 pCurrent = CoTaskMemAlloc(sizeof(NetCfgComponentItem));
270 if (!pCurrent)
271 return E_OUTOFMEMORY;
272
273 ZeroMemory(pCurrent, sizeof(NetCfgComponentItem));
274 CopyMemory(&pCurrent->ClassGUID, pGuid, sizeof(GUID));
275
276 if (FAILED(CLSIDFromString(szName, &pCurrent->InstanceId)))
277 {
279 //CoTaskMemFree(pCurrent);
280 //return E_FAIL;
281 }
282 if (RegOpenKeyExW(hKey, szName, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
283 {
284 /* retrieve Characteristics */
285 dwSize = sizeof(DWORD);
286
287 RegQueryValueExW(hSubKey, L"Characteristics", NULL, &dwType, (LPBYTE)&pCurrent->dwCharacteristics, &dwSize);
288 if (dwType != REG_DWORD)
289 pCurrent->dwCharacteristics = 0;
290
291 /* retrieve ComponentId */
292 dwSize = sizeof(szText);
293 if (RegQueryValueExW(hSubKey, L"ComponentId", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
294 {
295 if (dwType == REG_SZ)
296 {
297 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
298 pCurrent->szId = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
299 if (pCurrent->szId)
300 wcscpy(pCurrent->szId, szText);
301 }
302 }
303
304 /* retrieve Description */
305 dwSize = sizeof(szText);
306 if (RegQueryValueExW(hSubKey, L"Description", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
307 {
308 if (dwType == REG_SZ)
309 {
310 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
311 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
312 if (pCurrent->szDisplayName)
313 wcscpy(pCurrent->szDisplayName, szText);
314 }
315 }
316
317 if (RegOpenKeyExW(hSubKey, L"NDI", 0, KEY_READ, &hNDIKey) == ERROR_SUCCESS)
318 {
319 /* retrieve HelpText */
320 dwSize = sizeof(szText);
321 if (RegQueryValueExW(hNDIKey, L"HelpText", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
322 {
323 if (dwType == REG_SZ)
324 {
325 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
326 pCurrent->szHelpText = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
327 if (pCurrent->szHelpText)
328 wcscpy(pCurrent->szHelpText, szText);
329 }
330 }
331
332 /* retrieve Service */
333 dwSize = sizeof(szText);
334 if (RegQueryValueExW(hNDIKey, L"Service", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
335 {
336 if (dwType == REG_SZ)
337 {
338 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
339 pCurrent->szBindName = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
340 if (pCurrent->szBindName)
341 wcscpy(pCurrent->szBindName, szText);
342 }
343 }
344
345 if (RegOpenKeyExW(hNDIKey, L"Interfaces", 0, KEY_READ, &hInterfacesKey) == ERROR_SUCCESS)
346 {
347 /* retrieve LowerRange */
348 dwSize = sizeof(szText);
349 if (RegQueryValueExW(hInterfacesKey, L"LowerRange", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
350 {
351 if (dwType == REG_SZ)
352 {
353 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
354 pCurrent->pszLowerRange = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
355 if (pCurrent->pszLowerRange)
356 {
357 wcscpy(pCurrent->pszLowerRange, szText);
358 TRACE("LowerRange: %S\n", pCurrent->pszLowerRange);
359 }
360 }
361 }
362
363 /* retrieve UpperRange */
364 dwSize = sizeof(szText);
365 if (RegQueryValueExW(hInterfacesKey, L"UpperRange", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
366 {
367 if (dwType == REG_SZ)
368 {
369 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
370 pCurrent->pszUpperRange = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
371 if (pCurrent->pszUpperRange)
372 {
373 wcscpy(pCurrent->pszUpperRange, szText);
374 TRACE("UpperRange: %S\n", pCurrent->pszUpperRange);
375 }
376 }
377 }
378
379 RegCloseKey(hInterfacesKey);
380 }
381
382 RegCloseKey(hNDIKey);
383 }
384 RegCloseKey(hSubKey);
385
386 ReadBindingString(pCurrent);
387
388 if (!pLast)
389 *pHead = pCurrent;
390 else
391 pLast->pNext = pCurrent;
392
393 pLast = pCurrent;
394 }
395 }
396 else
397 break;
398
399 }while(TRUE);
400 return S_OK;
401}
402
403
404
407 const GUID *pGuid, NetCfgComponentItem ** pHead)
408{
409 HKEY hKey;
410 LPOLESTR pszGuid;
411 HRESULT hr;
412 WCHAR szName[150];
413
414 hr = StringFromCLSID(pGuid, &pszGuid);
415 if (SUCCEEDED(hr))
416 {
417 _swprintf(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\%s", pszGuid);
419 {
420 hr = EnumClientServiceProtocol(hKey, pGuid, pHead);
422 }
423 CoTaskMemFree(pszGuid);
424 }
425 return hr;
426}
427
430{
431 DWORD dwSize, dwIndex;
432 HDEVINFO hInfo;
433 SP_DEVINFO_DATA DevInfo;
434 HKEY hKey, hInterfacesKey;
435 WCHAR szNetCfg[50];
436 WCHAR szAdapterNetCfg[MAX_DEVICE_ID_LEN];
437 WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\";
438 WCHAR szName[130] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
439 NetCfgComponentItem * pLast = NULL, *pCurrent;
440
441 hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
442 if (!hInfo)
443 {
444 return E_FAIL;
445 }
446
447 dwIndex = 0;
448 do
449 {
450 ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
451 DevInfo.cbSize = sizeof(DevInfo);
452
453 /* get device info */
454 if (!SetupDiEnumDeviceInfo(hInfo, dwIndex++, &DevInfo))
455 break;
456
457 /* get device software registry path */
458 if (!SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DRIVER, NULL, (LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize))
459 break;
460
461 /* open device registry key */
463 break;
464
465 /* query NetCfgInstanceId for current device */
466 dwSize = sizeof(szNetCfg);
467 if (RegQueryValueExW(hKey, L"NetCfgInstanceId", NULL, NULL, (LPBYTE)szNetCfg, &dwSize) != ERROR_SUCCESS)
468 {
470 break;
471 }
472
473 /* allocate new INetConnectionItem */
474 pCurrent = CoTaskMemAlloc(sizeof(NetCfgComponentItem));
475 if (!pCurrent)
476 break;
477
478 ZeroMemory(pCurrent, sizeof(NetCfgComponentItem));
479 CopyMemory(&pCurrent->ClassGUID, &GUID_DEVCLASS_NET, sizeof(GUID));
480 CLSIDFromString(szNetCfg, &pCurrent->InstanceId); //FIXME
481
482 /* set bind name */
483 pCurrent->szBindName = CoTaskMemAlloc((wcslen(szNetCfg)+1) *sizeof(WCHAR));
484 if (pCurrent->szBindName)
485 wcscpy(pCurrent->szBindName, szNetCfg);
486
487 /* retrieve ComponentId */
488 dwSize = sizeof(szAdapterNetCfg);
489 if (RegQueryValueExW(hKey, L"ComponentId", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
490 {
491 pCurrent->szId = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
492 if (pCurrent->szId)
493 wcscpy(pCurrent->szId, szAdapterNetCfg);
494 }
495 /* set INetCfgComponent::GetDisplayName */
496 dwSize = sizeof(szAdapterNetCfg);
497 if (RegQueryValueExW(hKey, L"DriverDesc", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
498 {
499 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
500 if (pCurrent->szDisplayName)
501 wcscpy(pCurrent->szDisplayName, szAdapterNetCfg);
502 }
503
504 if (RegOpenKeyExW(hKey, L"NDI\\Interfaces", 0, KEY_READ, &hInterfacesKey) == ERROR_SUCCESS)
505 {
506 /* retrieve LowerRange */
507 dwSize = sizeof(szAdapterNetCfg);
508 if (RegQueryValueExW(hInterfacesKey, L"LowerRange", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
509 {
510 pCurrent->pszLowerRange = CoTaskMemAlloc((wcslen(szAdapterNetCfg) + 1) * sizeof(WCHAR));
511 if (pCurrent->pszLowerRange)
512 {
513 wcscpy(pCurrent->pszLowerRange, szAdapterNetCfg);
514 TRACE("LowerRange: %S\n", pCurrent->pszLowerRange);
515 }
516 }
517
518 /* retrieve UpperRange */
519 dwSize = sizeof(szAdapterNetCfg);
520 if (RegQueryValueExW(hInterfacesKey, L"UpperRange", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
521 {
522 pCurrent->pszUpperRange = CoTaskMemAlloc((wcslen(szAdapterNetCfg) + 1) * sizeof(WCHAR));
523 if (pCurrent->pszUpperRange)
524 {
525 wcscpy(pCurrent->pszUpperRange, szAdapterNetCfg);
526 TRACE("UpperRange: %S\n", pCurrent->pszUpperRange);
527 }
528 }
529
530 RegCloseKey(hInterfacesKey);
531 }
532
534 /* open network connections details */
535 wcscpy(&szName[80], szNetCfg);
536 wcscpy(&szName[118], L"\\Connection");
537
539 {
540 /* retrieve pnp instance id */
541 dwSize = sizeof(szAdapterNetCfg);
542 if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
543 {
544 pCurrent->szNodeId = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
545 if (pCurrent->szNodeId)
546 wcscpy(pCurrent->szNodeId, szAdapterNetCfg);
547 }
549 }
550
551 if (SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szNetCfg, sizeof(szNetCfg)/sizeof(WCHAR), &dwSize))
552 {
553 szNetCfg[(sizeof(szNetCfg)/sizeof(WCHAR))-1] = L'\0';
554 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szNetCfg)+1) * sizeof(WCHAR));
555 if (pCurrent->szDisplayName)
556 wcscpy(pCurrent->szDisplayName, szNetCfg);
557 }
558
559 if (pLast)
560 pLast->pNext = pCurrent;
561 else
562 *pHead = pCurrent;
563
564 pLast = pCurrent;
565
566 }while(TRUE);
567
569 return NOERROR;
570}
571
572
575 NetCfgComponentItem * pHead,
576 LPCWSTR pszwComponentId,
577 INetCfgComponent **pComponent,
578 INetCfg * iface)
579{
580 while(pHead)
581 {
582 if (!_wcsicmp(pHead->szId, pszwComponentId))
583 {
584 return INetCfgComponent_Constructor(NULL, &IID_INetCfgComponent, (LPVOID*)pComponent, pHead, iface);
585 }
586 pHead = pHead->pNext;
587 }
588 return S_FALSE;
589}
590
591
592
594WINAPI
596 INetCfg * iface,
597 REFIID iid,
598 LPVOID * ppvObj)
599{
600 INetCfgImpl * This = (INetCfgImpl*)iface;
601 *ppvObj = NULL;
602
603 if (IsEqualIID (iid, &IID_IUnknown) ||
604 IsEqualIID (iid, &IID_INetCfg))
605 {
606 *ppvObj = This;
607 INetCfg_AddRef(iface);
608 return S_OK;
609 }
610 else if (IsEqualIID (iid, &IID_INetCfgLock))
611 {
612 if (This->bInitialized)
614
615 *ppvObj = (LPVOID)&This->lpVtblLock;
616 This->hMutex = CreateMutexW(NULL, FALSE, L"NetCfgLock");
617
618 INetCfgLock_AddRef(iface);
619 return S_OK;
620 }
622 {
623 if (This->bInitialized)
625
626 *ppvObj = (LPVOID)&This->lpVtblPnpReconfigCallback;
628 return S_OK;
629 }
630
631 return E_NOINTERFACE;
632}
633
634ULONG
635WINAPI
637 INetCfg * iface)
638{
639 INetCfgImpl * This = (INetCfgImpl*)iface;
640 ULONG refCount = InterlockedIncrement(&This->ref);
641
642 return refCount;
643}
644
645ULONG
646WINAPI
648 INetCfg * iface)
649{
650 INetCfgImpl * This = (INetCfgImpl*)iface;
651 ULONG refCount = InterlockedDecrement(&This->ref);
652
653 if (!refCount)
654 {
656 }
657 return refCount;
658}
659
661WINAPI
663 INetCfg * iface,
665{
666 HRESULT hr;
667 INetCfgImpl *This = (INetCfgImpl *)iface;
668
669 if (This->bInitialized)
671
673 if (FAILED(hr))
674 return hr;
675
676
677 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETCLIENT, &This->pClient);
678 if (FAILED(hr))
679 return hr;
680
681 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETSERVICE, &This->pService);
682 if (FAILED(hr))
683 return hr;
684
685
686 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETTRANS, &This->pProtocol);
687 if (FAILED(hr))
688 return hr;
689
690 This->bInitialized = TRUE;
691 return S_OK;
692}
693
694VOID
696 NetCfgComponentItem *pHead,
697 const CLSID * lpClassGUID,
698 BOOL bApply)
699{
700 HKEY hKey;
701 WCHAR szName[200];
702 LPOLESTR pszGuid;
703
704 while(pHead)
705 {
706 if (pHead->bChanged)
707 {
708 if (IsEqualGUID(lpClassGUID, &GUID_DEVCLASS_NET))
709 {
710 if (bApply)
711 {
712 if (StringFromCLSID(&pHead->InstanceId, &pszGuid) == NOERROR)
713 {
714 _swprintf(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\%s", pszGuid);
715 CoTaskMemFree(pszGuid);
716
718 {
719 RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE)pHead->szDisplayName, (wcslen(pHead->szDisplayName)+1) * sizeof(WCHAR));
721 }
722 }
723 }
724 }
725 else if (pHead->pControl)
726 {
727 if (bApply)
728 {
730 //FIXME
731 // implement INetCfgPnpReconfigCallback and pass it to
733 }
734 else
735 {
737 }
738 }
739 }
740 pHead = pHead->pNext;
741 }
742}
743
744VOID
746{
749 CoTaskMemFree(pItem->szId);
751 CoTaskMemFree(pItem->szNodeId);
755 CoTaskMemFree(pItem);
756}
757
759WINAPI
761 INetCfg * iface)
762{
763 INetCfgImpl *This = (INetCfgImpl *)iface;
764 NetCfgComponentItem *pItem;
765
766 if (!This->bInitialized)
768
769 /* Free the services */
770 while (This->pService != NULL)
771 {
772 pItem = This->pService;
773 This->pService = pItem->pNext;
774 FreeComponentItem(pItem);
775 }
776
777 /* Free the clients */
778 while (This->pClient != NULL)
779 {
780 pItem = This->pClient;
781 This->pClient = pItem->pNext;
782 FreeComponentItem(pItem);
783 }
784
785 /* Free the protocols */
786 while (This->pProtocol != NULL)
787 {
788 pItem = This->pProtocol;
789 This->pProtocol = pItem->pNext;
790 FreeComponentItem(pItem);
791 }
792
793 /* Free the adapters */
794 while (This->pNet != NULL)
795 {
796 pItem = This->pNet;
797 This->pNet = pItem->pNext;
798 FreeComponentItem(pItem);
799 }
800
801 This->bInitialized = FALSE;
802
803 return S_OK;
804}
805
806
808WINAPI
810 INetCfg * iface)
811{
812 INetCfgImpl *This = (INetCfgImpl *)iface;
813
814 if (!This->bInitialized)
816
817 ApplyOrCancelChanges(This->pNet, &GUID_DEVCLASS_NET, TRUE);
818 ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, TRUE);
819 ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, TRUE);
820 ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, TRUE);
821
822 return S_OK;
823}
824
826WINAPI
828 INetCfg * iface)
829{
830 INetCfgImpl *This = (INetCfgImpl *)iface;
831
832 if (!This->bInitialized)
834
835 ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, FALSE);
836 ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, FALSE);
837 ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, FALSE);
838
839 return S_OK;
840}
841
843WINAPI
845 INetCfg * iface,
846 const GUID *pguidClass,
847 IEnumNetCfgComponent **ppenumComponent)
848{
849 INetCfgImpl *This = (INetCfgImpl *)iface;
850
851 if (!This->bInitialized)
853
854 if (IsEqualGUID(&GUID_DEVCLASS_NET, pguidClass))
855 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pNet, iface);
856 else if (IsEqualGUID(&GUID_DEVCLASS_NETCLIENT, pguidClass))
857 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pClient, iface);
858 else if (IsEqualGUID(&GUID_DEVCLASS_NETSERVICE, pguidClass))
859 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pService, iface);
860 else if (IsEqualGUID(&GUID_DEVCLASS_NETTRANS, pguidClass))
861 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pProtocol, iface);
862 else
863 return E_NOINTERFACE;
864}
865
866
868WINAPI
870 INetCfg * iface,
871 LPCWSTR pszwComponentId,
872 INetCfgComponent **pComponent)
873{
874 HRESULT hr;
875 INetCfgImpl *This = (INetCfgImpl *)iface;
876
877 if (!This->bInitialized)
879
880 hr = FindNetworkComponent(This->pClient, pszwComponentId, pComponent, iface);
881 if (hr == S_OK)
882 return hr;
883
884 hr = FindNetworkComponent(This->pService, pszwComponentId, pComponent, iface);
885 if (hr == S_OK)
886 return hr;
887
888 hr = FindNetworkComponent(This->pProtocol, pszwComponentId, pComponent, iface);
889 if (hr == S_OK)
890 return hr;
891
892 return S_FALSE;
893}
894
896WINAPI
898 INetCfg * iface,
899 const GUID *pguidClass,
900 REFIID riid,
901 void **ppvObject)
902{
903 return INetCfgClass_Constructor((IUnknown *)iface, riid, ppvObject, pguidClass, iface);
904}
905
906static const INetCfgVtbl vt_NetCfg =
907{
918};
919
921{
923
924 if (!ppv)
925 return E_POINTER;
926
928 if (!This)
929 return E_OUTOFMEMORY;
930
931 This->ref = 1;
932 This->lpVtbl = (const INetCfg*)&vt_NetCfg;
933 This->lpVtblLock = (const INetCfgLock*)&vt_NetCfgLock;
934 This->lpVtblPnpReconfigCallback = (const INetCfgPnpReconfigCallback*)&vt_NetCfgPnpReconfigCallback;
935 This->hMutex = NULL;
936 This->bInitialized = FALSE;
937 This->pNet = NULL;
938 This->pClient = NULL;
939 This->pService = NULL;
940 This->pProtocol = NULL;
941
942 if (!SUCCEEDED (INetCfg_QueryInterface ((INetCfg*)This, riid, ppv)))
943 {
944 INetCfg_Release((INetCfg*)This);
945 return E_NOINTERFACE;
946 }
947
948 INetCfg_Release((INetCfg*)This);
949 return S_OK;
950}
#define __inline
Definition: _wctype.cpp:15
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
const GUID IID_IUnknown
#define RegCloseKey(hKey)
Definition: registry.h:49
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:573
#define ERROR_SUCCESS
Definition: deptool.c:10
#define MAX_DEVICE_ID_LEN
Definition: devaction.c:40
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
HRESULT WINAPI StringFromCLSID(REFCLSID clsid, LPOLESTR *str)
Definition: combase.c:1515
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:159
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, PSP_DEVINFO_DATA info)
Definition: devinst.c:1787
BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize)
Definition: devinst.c:3268
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
Definition: devinst.c:2937
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT WINAPI INetCfgComponent_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv, NetCfgComponentItem *pItem, INetCfg *pNCfg)
HRESULT WINAPI IEnumNetCfgComponent_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv, NetCfgComponentItem *pItem, INetCfg *pNCfg)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define REG_SZ
Definition: layer.c:22
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
#define ZeroMemory
Definition: minwinbase.h:31
#define CopyMemory
Definition: minwinbase.h:29
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
static BSTR *static LPOLESTR
Definition: varformat.c:44
ULONG WINAPI INetCfgLock_fnAddRef(INetCfgLock *iface)
Definition: netcfg_iface.c:28
HRESULT WINAPI INetCfgPnpReconfigCallback_fnSendPnpReconfig(INetCfgPnpReconfigCallback *iface, NCPNP_RECONFIG_LAYER Layer, LPCWSTR pszwUpper, LPCWSTR pszwLower, PVOID pvData, DWORD dwSizeOfData)
Definition: netcfg_iface.c:190
HRESULT WINAPI INetCfg_fnApply(INetCfg *iface)
Definition: netcfg_iface.c:809
HRESULT EnumerateNetworkAdapter(NetCfgComponentItem **pHead)
Definition: netcfg_iface.c:429
static const INetCfgPnpReconfigCallbackVtbl vt_NetCfgPnpReconfigCallback
Definition: netcfg_iface.c:202
HRESULT FindNetworkComponent(NetCfgComponentItem *pHead, LPCWSTR pszwComponentId, INetCfgComponent **pComponent, INetCfg *iface)
Definition: netcfg_iface.c:574
static __inline INetCfgImpl * impl_from_INetCfgLock(INetCfgLock *iface)
Definition: netcfg_iface.c:3
ULONG WINAPI INetCfgPnpReconfigCallback_fnAddRef(INetCfgPnpReconfigCallback *iface)
Definition: netcfg_iface.c:171
HRESULT WINAPI INetCfg_fnCancel(INetCfg *iface)
Definition: netcfg_iface.c:827
HRESULT WINAPI INetCfg_fnEnumComponents(INetCfg *iface, const GUID *pguidClass, IEnumNetCfgComponent **ppenumComponent)
Definition: netcfg_iface.c:844
HRESULT WINAPI INetCfg_fnInitialize(INetCfg *iface, PVOID pReserved)
Definition: netcfg_iface.c:662
VOID ApplyOrCancelChanges(NetCfgComponentItem *pHead, const CLSID *lpClassGUID, BOOL bApply)
Definition: netcfg_iface.c:695
HRESULT WINAPI INetCfgLock_fnAcquireWriteLock(INetCfgLock *iface, DWORD cmsTimeout, LPCWSTR pszwClientDescription, LPWSTR *ppszwClientDescription)
Definition: netcfg_iface.c:47
static const INetCfgLockVtbl vt_NetCfgLock
Definition: netcfg_iface.c:144
HRESULT WINAPI INetCfgPnpReconfigCallback_fnQueryInterface(INetCfgPnpReconfigCallback *iface, REFIID iid, LPVOID *ppvObj)
Definition: netcfg_iface.c:160
HRESULT WINAPI INetCfg_fnUninitialize(INetCfg *iface)
Definition: netcfg_iface.c:760
HRESULT WINAPI INetCfgLock_fnReleaseWriteLock(INetCfgLock *iface)
Definition: netcfg_iface.c:96
ULONG WINAPI INetCfgLock_fnRelease(INetCfgLock *iface)
Definition: netcfg_iface.c:38
HRESULT EnumClientServiceProtocol(HKEY hKey, const GUID *pGuid, NetCfgComponentItem **pHead)
Definition: netcfg_iface.c:251
ULONG WINAPI INetCfgPnpReconfigCallback_fnRelease(INetCfgPnpReconfigCallback *iface)
Definition: netcfg_iface.c:181
HRESULT WINAPI INetCfgLock_fnIsWriteLocked(INetCfgLock *iface, LPWSTR *ppszwClientDescription)
Definition: netcfg_iface.c:113
HRESULT WINAPI INetCfg_fnQueryNetCfgClass(INetCfg *iface, const GUID *pguidClass, REFIID riid, void **ppvObject)
Definition: netcfg_iface.c:897
HRESULT WINAPI INetCfg_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: netcfg_iface.c:920
HRESULT EnumerateNetworkComponent(const GUID *pGuid, NetCfgComponentItem **pHead)
Definition: netcfg_iface.c:406
HRESULT WINAPI INetCfg_fnQueryInterface(INetCfg *iface, REFIID iid, LPVOID *ppvObj)
Definition: netcfg_iface.c:595
HRESULT ReadBindingString(NetCfgComponentItem *Item)
Definition: netcfg_iface.c:216
HRESULT WINAPI INetCfgLock_fnQueryInterface(INetCfgLock *iface, REFIID iid, LPVOID *ppvObj)
Definition: netcfg_iface.c:16
ULONG WINAPI INetCfg_fnRelease(INetCfg *iface)
Definition: netcfg_iface.c:647
HRESULT WINAPI INetCfg_fnFindComponent(INetCfg *iface, LPCWSTR pszwComponentId, INetCfgComponent **pComponent)
Definition: netcfg_iface.c:869
static const INetCfgVtbl vt_NetCfg
Definition: netcfg_iface.c:906
VOID FreeComponentItem(NetCfgComponentItem *pItem)
Definition: netcfg_iface.c:745
static __inline INetCfgImpl * impl_from_INetCfgPnpReconfigCallback(INetCfgPnpReconfigCallback *iface)
Definition: netcfg_iface.c:8
ULONG WINAPI INetCfg_fnAddRef(INetCfg *iface)
Definition: netcfg_iface.c:636
HRESULT WINAPI INetCfgClass_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv, const GUID *pguidClass, INetCfg *pNetCfg)
#define INetCfgComponentControl_ApplyRegistryChanges(p)
Definition: netcfgn.h:52
#define INetCfgComponentControl_CancelChanges(p)
Definition: netcfgn.h:54
#define INetCfgComponentControl_ApplyPnpChanges(p, a)
Definition: netcfgn.h:53
EXTERN_C const IID IID_INetCfgPnpReconfigCallback
Definition: netcfgn.h:29
#define INetCfgPnpReconfigCallback_AddRef(p)
Definition: netcfgn.h:24
NCPNP_RECONFIG_LAYER
Definition: netcfgn.h:5
#define INetCfg_Release(p)
Definition: netcfgx.h:289
#define INetCfg_QueryInterface(p, a, b)
Definition: netcfgx.h:287
EXTERN_C const IID IID_INetCfgLock
Definition: netcfgx.h:17
EXTERN_C const IID IID_INetCfgComponent
Definition: netcfgx.h:77
#define INetCfgLock_AddRef(p)
Definition: netcfgx.h:22
#define INetCfg_AddRef(p)
Definition: netcfgx.h:288
#define NETCFG_E_NOT_INITIALIZED
Definition: netcfgx.h:303
EXTERN_C const IID IID_IEnumNetCfgComponent
Definition: netcfgx.h:266
EXTERN_C const IID IID_INetCfg
Definition: netcfgx.h:300
#define NETCFG_E_ALREADY_INITIALIZED
Definition: netcfgx.h:302
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
_Out_ PVOID pReserved
Definition: netsh.h:77
#define KEY_READ
Definition: nt_native.h:1026
#define LPVOID
Definition: nt_native.h:45
#define KEY_WRITE
Definition: nt_native.h:1034
#define DWORD
Definition: nt_native.h:44
BYTE * PBYTE
Definition: pedump.c:66
short WCHAR
Definition: pedump.c:58
static const WCHAR szName[]
Definition: powrprof.c:45
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REG_DWORD
Definition: sdbapi.c:615
wcscat
wcscpy
#define SPDRP_DRIVER
Definition: setupapi.h:519
#define SPDRP_DEVICEDESC
Definition: setupapi.h:510
#define SetupDiGetClassDevs
Definition: setupapi.h:2614
#define DIGCF_PRESENT
Definition: setupapi.h:174
#define TRACE(s)
Definition: solgame.cpp:4
Definition: xml2sdb.h:124
INetCfgComponentControl * pControl
Definition: precomp.h:58
struct tagNetCfgComponentItem * pNext
Definition: precomp.h:64
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexW(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:525
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:554
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
#define WAIT_OBJECT_0
Definition: winbase.h:383
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define NOERROR
Definition: winerror.h:3448
#define E_POINTER
Definition: winerror.h:3480
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12