ReactOS 0.4.17-dev-243-g1369312
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 TRACE("INetCfgPnpReconfigCallback_fnSendPnpReconfig(%lu %S %S %p %lu)\n",
199 Layer, pszwUpper, pszwLower, pvData, dwSizeOfData);
200
201 /* FIXME */
202 return E_NOTIMPL;
203}
204
205static const INetCfgPnpReconfigCallbackVtbl vt_NetCfgPnpReconfigCallback =
206{
211};
212
213
214/***************************************************************
215 * INetCfg
216 */
217
221{
222 WCHAR szBuffer[200];
223 HKEY hKey;
224 DWORD dwType, dwSize;
225
226 if (Item == NULL || Item->szBindName == NULL)
227 return S_OK;
228
229 wcscpy(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\");
230 wcscat(szBuffer, Item->szBindName);
231 wcscat(szBuffer, L"\\Linkage");
232
234 {
235 dwSize = 0;
236 RegQueryValueExW(hKey, L"Bind", NULL, &dwType, NULL, &dwSize);
237
238 if (dwSize != 0)
239 {
240 Item->pszBinding = CoTaskMemAlloc(dwSize);
241 if (Item->pszBinding == NULL)
242 return E_OUTOFMEMORY;
243
244 RegQueryValueExW(hKey, L"Bind", NULL, &dwType, (LPBYTE)Item->pszBinding, &dwSize);
245 }
246
248 }
249
250 return S_OK;
251}
252
255{
256 DWORD dwIndex = 0;
258 DWORD dwType;
259 WCHAR szName[100];
260 WCHAR szText[100];
261 HKEY hSubKey, hNDIKey, hInterfacesKey;
262 NetCfgComponentItem * pLast = NULL, *pCurrent;
263
264 *pHead = NULL;
265 do
266 {
267 szText[0] = L'\0';
268
269 dwSize = sizeof(szName)/sizeof(WCHAR);
270 if (RegEnumKeyExW(hKey, dwIndex++, szName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
271 {
272 pCurrent = CoTaskMemAlloc(sizeof(NetCfgComponentItem));
273 if (!pCurrent)
274 return E_OUTOFMEMORY;
275
276 ZeroMemory(pCurrent, sizeof(NetCfgComponentItem));
277 CopyMemory(&pCurrent->ClassGUID, pGuid, sizeof(GUID));
278
279 if (FAILED(CLSIDFromString(szName, &pCurrent->InstanceId)))
280 {
282 //CoTaskMemFree(pCurrent);
283 //return E_FAIL;
284 }
285 if (RegOpenKeyExW(hKey, szName, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
286 {
287 /* retrieve Characteristics */
288 dwSize = sizeof(DWORD);
289
290 RegQueryValueExW(hSubKey, L"Characteristics", NULL, &dwType, (LPBYTE)&pCurrent->dwCharacteristics, &dwSize);
291 if (dwType != REG_DWORD)
292 pCurrent->dwCharacteristics = 0;
293
294 /* retrieve ComponentId */
295 dwSize = sizeof(szText);
296 if (RegQueryValueExW(hSubKey, L"ComponentId", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
297 {
298 if (dwType == REG_SZ)
299 {
300 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
301 pCurrent->szId = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
302 if (pCurrent->szId)
303 wcscpy(pCurrent->szId, szText);
304 }
305 }
306
307 /* retrieve Description */
308 dwSize = sizeof(szText);
309 if (RegQueryValueExW(hSubKey, L"Description", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
310 {
311 if (dwType == REG_SZ)
312 {
313 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
314 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
315 if (pCurrent->szDisplayName)
316 wcscpy(pCurrent->szDisplayName, szText);
317 }
318 }
319
320 if (RegOpenKeyExW(hSubKey, L"NDI", 0, KEY_READ, &hNDIKey) == ERROR_SUCCESS)
321 {
322 /* retrieve HelpText */
323 dwSize = sizeof(szText);
324 if (RegQueryValueExW(hNDIKey, L"HelpText", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
325 {
326 if (dwType == REG_SZ)
327 {
328 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
329 pCurrent->szHelpText = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
330 if (pCurrent->szHelpText)
331 wcscpy(pCurrent->szHelpText, szText);
332 }
333 }
334
335 /* retrieve Service */
336 dwSize = sizeof(szText);
337 if (RegQueryValueExW(hNDIKey, L"Service", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
338 {
339 if (dwType == REG_SZ)
340 {
341 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
342 pCurrent->szBindName = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
343 if (pCurrent->szBindName)
344 wcscpy(pCurrent->szBindName, szText);
345 }
346 }
347
348 if (RegOpenKeyExW(hNDIKey, L"Interfaces", 0, KEY_READ, &hInterfacesKey) == ERROR_SUCCESS)
349 {
350 /* retrieve LowerRange */
351 dwSize = sizeof(szText);
352 if (RegQueryValueExW(hInterfacesKey, L"LowerRange", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
353 {
354 if (dwType == REG_SZ)
355 {
356 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
357 pCurrent->pszLowerRange = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
358 if (pCurrent->pszLowerRange)
359 {
360 wcscpy(pCurrent->pszLowerRange, szText);
361 TRACE("LowerRange: %S\n", pCurrent->pszLowerRange);
362 }
363 }
364 }
365
366 /* retrieve UpperRange */
367 dwSize = sizeof(szText);
368 if (RegQueryValueExW(hInterfacesKey, L"UpperRange", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS)
369 {
370 if (dwType == REG_SZ)
371 {
372 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
373 pCurrent->pszUpperRange = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR));
374 if (pCurrent->pszUpperRange)
375 {
376 wcscpy(pCurrent->pszUpperRange, szText);
377 TRACE("UpperRange: %S\n", pCurrent->pszUpperRange);
378 }
379 }
380 }
381
382 RegCloseKey(hInterfacesKey);
383 }
384
385 RegCloseKey(hNDIKey);
386 }
387 RegCloseKey(hSubKey);
388
389 ReadBindingString(pCurrent);
390
391 if (!pLast)
392 *pHead = pCurrent;
393 else
394 pLast->pNext = pCurrent;
395
396 pLast = pCurrent;
397 }
398 }
399 else
400 break;
401
402 }while(TRUE);
403 return S_OK;
404}
405
406
407
410 const GUID *pGuid, NetCfgComponentItem ** pHead)
411{
412 HKEY hKey;
413 LPOLESTR pszGuid;
414 HRESULT hr;
415 WCHAR szName[150];
416
417 hr = StringFromCLSID(pGuid, &pszGuid);
418 if (SUCCEEDED(hr))
419 {
420 _swprintf(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\%s", pszGuid);
422 {
423 hr = EnumClientServiceProtocol(hKey, pGuid, pHead);
425 }
426 CoTaskMemFree(pszGuid);
427 }
428 return hr;
429}
430
433{
434 DWORD dwSize, dwIndex;
435 HDEVINFO hInfo;
436 SP_DEVINFO_DATA DevInfo;
437 HKEY hKey, hInterfacesKey;
438 WCHAR szNetCfg[50];
439 WCHAR szAdapterNetCfg[MAX_DEVICE_ID_LEN];
440 WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\";
441 WCHAR szName[130] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
442 NetCfgComponentItem * pLast = NULL, *pCurrent;
443
444 hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
445 if (!hInfo)
446 {
447 return E_FAIL;
448 }
449
450 dwIndex = 0;
451 do
452 {
453 ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
454 DevInfo.cbSize = sizeof(DevInfo);
455
456 /* get device info */
457 if (!SetupDiEnumDeviceInfo(hInfo, dwIndex++, &DevInfo))
458 break;
459
460 /* get device software registry path */
461 if (!SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DRIVER, NULL, (LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize))
462 break;
463
464 /* open device registry key */
466 break;
467
468 /* query NetCfgInstanceId for current device */
469 dwSize = sizeof(szNetCfg);
470 if (RegQueryValueExW(hKey, L"NetCfgInstanceId", NULL, NULL, (LPBYTE)szNetCfg, &dwSize) != ERROR_SUCCESS)
471 {
473 break;
474 }
475
476 /* allocate new INetConnectionItem */
477 pCurrent = CoTaskMemAlloc(sizeof(NetCfgComponentItem));
478 if (!pCurrent)
479 break;
480
481 ZeroMemory(pCurrent, sizeof(NetCfgComponentItem));
482 CopyMemory(&pCurrent->ClassGUID, &GUID_DEVCLASS_NET, sizeof(GUID));
483 CLSIDFromString(szNetCfg, &pCurrent->InstanceId); //FIXME
484
485 /* set bind name */
486 pCurrent->szBindName = CoTaskMemAlloc((wcslen(szNetCfg)+1) *sizeof(WCHAR));
487 if (pCurrent->szBindName)
488 wcscpy(pCurrent->szBindName, szNetCfg);
489
490 /* retrieve ComponentId */
491 dwSize = sizeof(szAdapterNetCfg);
492 if (RegQueryValueExW(hKey, L"ComponentId", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
493 {
494 pCurrent->szId = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
495 if (pCurrent->szId)
496 wcscpy(pCurrent->szId, szAdapterNetCfg);
497 }
498 /* set INetCfgComponent::GetDisplayName */
499 dwSize = sizeof(szAdapterNetCfg);
500 if (RegQueryValueExW(hKey, L"DriverDesc", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
501 {
502 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
503 if (pCurrent->szDisplayName)
504 wcscpy(pCurrent->szDisplayName, szAdapterNetCfg);
505 }
506
507 if (RegOpenKeyExW(hKey, L"NDI\\Interfaces", 0, KEY_READ, &hInterfacesKey) == ERROR_SUCCESS)
508 {
509 /* retrieve LowerRange */
510 dwSize = sizeof(szAdapterNetCfg);
511 if (RegQueryValueExW(hInterfacesKey, L"LowerRange", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
512 {
513 pCurrent->pszLowerRange = CoTaskMemAlloc((wcslen(szAdapterNetCfg) + 1) * sizeof(WCHAR));
514 if (pCurrent->pszLowerRange)
515 {
516 wcscpy(pCurrent->pszLowerRange, szAdapterNetCfg);
517 TRACE("LowerRange: %S\n", pCurrent->pszLowerRange);
518 }
519 }
520
521 /* retrieve UpperRange */
522 dwSize = sizeof(szAdapterNetCfg);
523 if (RegQueryValueExW(hInterfacesKey, L"UpperRange", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
524 {
525 pCurrent->pszUpperRange = CoTaskMemAlloc((wcslen(szAdapterNetCfg) + 1) * sizeof(WCHAR));
526 if (pCurrent->pszUpperRange)
527 {
528 wcscpy(pCurrent->pszUpperRange, szAdapterNetCfg);
529 TRACE("UpperRange: %S\n", pCurrent->pszUpperRange);
530 }
531 }
532
533 RegCloseKey(hInterfacesKey);
534 }
535
537 /* open network connections details */
538 wcscpy(&szName[80], szNetCfg);
539 wcscpy(&szName[118], L"\\Connection");
540
542 {
543 /* retrieve pnp instance id */
544 dwSize = sizeof(szAdapterNetCfg);
545 if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
546 {
547 pCurrent->szNodeId = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
548 if (pCurrent->szNodeId)
549 wcscpy(pCurrent->szNodeId, szAdapterNetCfg);
550 }
552 }
553
554 if (SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szNetCfg, sizeof(szNetCfg)/sizeof(WCHAR), &dwSize))
555 {
556 szNetCfg[(sizeof(szNetCfg)/sizeof(WCHAR))-1] = L'\0';
557 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szNetCfg)+1) * sizeof(WCHAR));
558 if (pCurrent->szDisplayName)
559 wcscpy(pCurrent->szDisplayName, szNetCfg);
560 }
561
562 if (pLast)
563 pLast->pNext = pCurrent;
564 else
565 *pHead = pCurrent;
566
567 pLast = pCurrent;
568
569 }while(TRUE);
570
572 return NOERROR;
573}
574
575
578 NetCfgComponentItem * pHead,
579 LPCWSTR pszwComponentId,
580 INetCfgComponent **pComponent,
581 INetCfg * iface)
582{
583 while(pHead)
584 {
585 if (!_wcsicmp(pHead->szId, pszwComponentId))
586 {
587 return INetCfgComponent_Constructor(NULL, &IID_INetCfgComponent, (LPVOID*)pComponent, pHead, iface);
588 }
589 pHead = pHead->pNext;
590 }
591 return S_FALSE;
592}
593
594
595
597WINAPI
599 INetCfg * iface,
600 REFIID iid,
601 LPVOID * ppvObj)
602{
603 INetCfgImpl * This = (INetCfgImpl*)iface;
604 *ppvObj = NULL;
605
606 if (IsEqualIID (iid, &IID_IUnknown) ||
607 IsEqualIID (iid, &IID_INetCfg))
608 {
609 *ppvObj = This;
610 INetCfg_AddRef(iface);
611 return S_OK;
612 }
613 else if (IsEqualIID (iid, &IID_INetCfgLock))
614 {
615 if (This->bInitialized)
617
618 *ppvObj = (LPVOID)&This->lpVtblLock;
619 This->hMutex = CreateMutexW(NULL, FALSE, L"NetCfgLock");
620
621 INetCfgLock_AddRef(iface);
622 return S_OK;
623 }
625 {
626 if (This->bInitialized)
628
629 *ppvObj = (LPVOID)&This->lpVtblPnpReconfigCallback;
631 return S_OK;
632 }
633
634 return E_NOINTERFACE;
635}
636
637ULONG
638WINAPI
640 INetCfg * iface)
641{
642 INetCfgImpl * This = (INetCfgImpl*)iface;
643 ULONG refCount = InterlockedIncrement(&This->ref);
644
645 return refCount;
646}
647
648ULONG
649WINAPI
651 INetCfg * iface)
652{
653 INetCfgImpl * This = (INetCfgImpl*)iface;
654 ULONG refCount = InterlockedDecrement(&This->ref);
655
656 if (!refCount)
657 {
659 }
660 return refCount;
661}
662
664WINAPI
666 INetCfg * iface,
668{
669 HRESULT hr;
670 INetCfgImpl *This = (INetCfgImpl *)iface;
671
672 if (This->bInitialized)
674
676 if (FAILED(hr))
677 return hr;
678
679
680 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETCLIENT, &This->pClient);
681 if (FAILED(hr))
682 return hr;
683
684 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETSERVICE, &This->pService);
685 if (FAILED(hr))
686 return hr;
687
688
689 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETTRANS, &This->pProtocol);
690 if (FAILED(hr))
691 return hr;
692
693 This->bInitialized = TRUE;
694 return S_OK;
695}
696
697VOID
699 NetCfgComponentItem *pHead,
700 const CLSID * lpClassGUID,
701 BOOL bApply,
702 INetCfgPnpReconfigCallback *pCallback)
703{
704 HKEY hKey;
705 WCHAR szName[200];
706 LPOLESTR pszGuid;
707
708 while(pHead)
709 {
710 if (pHead->bChanged)
711 {
712 if (IsEqualGUID(lpClassGUID, &GUID_DEVCLASS_NET))
713 {
714 if (bApply)
715 {
716 if (StringFromCLSID(&pHead->InstanceId, &pszGuid) == NOERROR)
717 {
718 _swprintf(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\%s", pszGuid);
719 CoTaskMemFree(pszGuid);
720
722 {
723 RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE)pHead->szDisplayName, (wcslen(pHead->szDisplayName)+1) * sizeof(WCHAR));
725 }
726 }
727 }
728 }
729 else if (pHead->pControl)
730 {
731 if (bApply)
732 {
735 }
736 else
737 {
739 }
740 }
741 }
742 pHead = pHead->pNext;
743 }
744}
745
746VOID
748{
751 CoTaskMemFree(pItem->szId);
753 CoTaskMemFree(pItem->szNodeId);
757 CoTaskMemFree(pItem);
758}
759
761WINAPI
763 INetCfg * iface)
764{
765 INetCfgImpl *This = (INetCfgImpl *)iface;
766 NetCfgComponentItem *pItem;
767
768 if (!This->bInitialized)
770
771 /* Free the services */
772 while (This->pService != NULL)
773 {
774 pItem = This->pService;
775 This->pService = pItem->pNext;
776 FreeComponentItem(pItem);
777 }
778
779 /* Free the clients */
780 while (This->pClient != NULL)
781 {
782 pItem = This->pClient;
783 This->pClient = pItem->pNext;
784 FreeComponentItem(pItem);
785 }
786
787 /* Free the protocols */
788 while (This->pProtocol != NULL)
789 {
790 pItem = This->pProtocol;
791 This->pProtocol = pItem->pNext;
792 FreeComponentItem(pItem);
793 }
794
795 /* Free the adapters */
796 while (This->pNet != NULL)
797 {
798 pItem = This->pNet;
799 This->pNet = pItem->pNext;
800 FreeComponentItem(pItem);
801 }
802
803 This->bInitialized = FALSE;
804
805 return S_OK;
806}
807
808
810WINAPI
812 INetCfg * iface)
813{
814 INetCfgImpl *This = (INetCfgImpl *)iface;
815
816 if (!This->bInitialized)
818
819 ApplyOrCancelChanges(This->pNet, &GUID_DEVCLASS_NET, TRUE, (INetCfgPnpReconfigCallback *)&This->lpVtblPnpReconfigCallback);
820 ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, TRUE, (INetCfgPnpReconfigCallback *)&This->lpVtblPnpReconfigCallback);
821 ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, TRUE, (INetCfgPnpReconfigCallback *)&This->lpVtblPnpReconfigCallback);
822 ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, TRUE, (INetCfgPnpReconfigCallback *)&This->lpVtblPnpReconfigCallback);
823
824 return S_OK;
825}
826
828WINAPI
830 INetCfg * iface)
831{
832 INetCfgImpl *This = (INetCfgImpl *)iface;
833
834 if (!This->bInitialized)
836
837 ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, FALSE, NULL);
838 ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, FALSE, NULL);
839 ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, FALSE, NULL);
840
841 return S_OK;
842}
843
845WINAPI
847 INetCfg * iface,
848 const GUID *pguidClass,
849 IEnumNetCfgComponent **ppenumComponent)
850{
851 INetCfgImpl *This = (INetCfgImpl *)iface;
852
853 if (!This->bInitialized)
855
856 if (IsEqualGUID(&GUID_DEVCLASS_NET, pguidClass))
857 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pNet, iface);
858 else if (IsEqualGUID(&GUID_DEVCLASS_NETCLIENT, pguidClass))
859 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pClient, iface);
860 else if (IsEqualGUID(&GUID_DEVCLASS_NETSERVICE, pguidClass))
861 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pService, iface);
862 else if (IsEqualGUID(&GUID_DEVCLASS_NETTRANS, pguidClass))
863 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pProtocol, iface);
864 else
865 return E_NOINTERFACE;
866}
867
868
870WINAPI
872 INetCfg * iface,
873 LPCWSTR pszwComponentId,
874 INetCfgComponent **pComponent)
875{
876 HRESULT hr;
877 INetCfgImpl *This = (INetCfgImpl *)iface;
878
879 if (!This->bInitialized)
881
882 hr = FindNetworkComponent(This->pClient, pszwComponentId, pComponent, iface);
883 if (hr == S_OK)
884 return hr;
885
886 hr = FindNetworkComponent(This->pService, pszwComponentId, pComponent, iface);
887 if (hr == S_OK)
888 return hr;
889
890 hr = FindNetworkComponent(This->pProtocol, pszwComponentId, pComponent, iface);
891 if (hr == S_OK)
892 return hr;
893
894 return S_FALSE;
895}
896
898WINAPI
900 INetCfg * iface,
901 const GUID *pguidClass,
902 REFIID riid,
903 void **ppvObject)
904{
905 return INetCfgClass_Constructor((IUnknown *)iface, riid, ppvObject, pguidClass, iface);
906}
907
908static const INetCfgVtbl vt_NetCfg =
909{
920};
921
923{
925
926 if (!ppv)
927 return E_POINTER;
928
930 if (!This)
931 return E_OUTOFMEMORY;
932
933 This->ref = 1;
934 This->lpVtbl = (const INetCfg*)&vt_NetCfg;
935 This->lpVtblLock = (const INetCfgLock*)&vt_NetCfgLock;
936 This->lpVtblPnpReconfigCallback = (const INetCfgPnpReconfigCallback*)&vt_NetCfgPnpReconfigCallback;
937 This->hMutex = NULL;
938 This->bInitialized = FALSE;
939 This->pNet = NULL;
940 This->pClient = NULL;
941 This->pService = NULL;
942 This->pProtocol = NULL;
943
944 if (!SUCCEEDED (INetCfg_QueryInterface ((INetCfg*)This, riid, ppv)))
945 {
946 INetCfg_Release((INetCfg*)This);
947 return E_NOINTERFACE;
948 }
949
950 INetCfg_Release((INetCfg*)This);
951 return S_OK;
952}
#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:582
#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
FxPnpStateCallbackInfo * pCallback
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:811
HRESULT EnumerateNetworkAdapter(NetCfgComponentItem **pHead)
Definition: netcfg_iface.c:432
static const INetCfgPnpReconfigCallbackVtbl vt_NetCfgPnpReconfigCallback
Definition: netcfg_iface.c:205
HRESULT FindNetworkComponent(NetCfgComponentItem *pHead, LPCWSTR pszwComponentId, INetCfgComponent **pComponent, INetCfg *iface)
Definition: netcfg_iface.c:577
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:829
HRESULT WINAPI INetCfg_fnEnumComponents(INetCfg *iface, const GUID *pguidClass, IEnumNetCfgComponent **ppenumComponent)
Definition: netcfg_iface.c:846
HRESULT WINAPI INetCfg_fnInitialize(INetCfg *iface, PVOID pReserved)
Definition: netcfg_iface.c:665
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:762
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:254
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:899
HRESULT WINAPI INetCfg_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: netcfg_iface.c:922
HRESULT EnumerateNetworkComponent(const GUID *pGuid, NetCfgComponentItem **pHead)
Definition: netcfg_iface.c:409
HRESULT WINAPI INetCfg_fnQueryInterface(INetCfg *iface, REFIID iid, LPVOID *ppvObj)
Definition: netcfg_iface.c:598
HRESULT ReadBindingString(NetCfgComponentItem *Item)
Definition: netcfg_iface.c:219
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:650
HRESULT WINAPI INetCfg_fnFindComponent(INetCfg *iface, LPCWSTR pszwComponentId, INetCfgComponent **pComponent)
Definition: netcfg_iface.c:871
static const INetCfgVtbl vt_NetCfg
Definition: netcfg_iface.c:908
VOID ApplyOrCancelChanges(NetCfgComponentItem *pHead, const CLSID *lpClassGUID, BOOL bApply, INetCfgPnpReconfigCallback *pCallback)
Definition: netcfg_iface.c:698
VOID FreeComponentItem(NetCfgComponentItem *pItem)
Definition: netcfg_iface.c:747
static __inline INetCfgImpl * impl_from_INetCfgPnpReconfigCallback(INetCfgPnpReconfigCallback *iface)
Definition: netcfg_iface.c:8
ULONG WINAPI INetCfg_fnAddRef(INetCfg *iface)
Definition: netcfg_iface.c:639
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