ReactOS 0.4.16-dev-1946-g52006dd
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;
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 RegCloseKey(hNDIKey);
345 }
346 RegCloseKey(hSubKey);
347
348 ReadBindingString(pCurrent);
349
350 if (!pLast)
351 *pHead = pCurrent;
352 else
353 pLast->pNext = pCurrent;
354
355 pLast = pCurrent;
356 }
357 }
358 else
359 break;
360
361 }while(TRUE);
362 return S_OK;
363}
364
365
366
369 const GUID *pGuid, NetCfgComponentItem ** pHead)
370{
371 HKEY hKey;
372 LPOLESTR pszGuid;
373 HRESULT hr;
374 WCHAR szName[150];
375
376 hr = StringFromCLSID(pGuid, &pszGuid);
377 if (SUCCEEDED(hr))
378 {
379 swprintf(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\%s", pszGuid);
381 {
382 hr = EnumClientServiceProtocol(hKey, pGuid, pHead);
384 }
385 CoTaskMemFree(pszGuid);
386 }
387 return hr;
388}
389
392{
393 DWORD dwSize, dwIndex;
394 HDEVINFO hInfo;
395 SP_DEVINFO_DATA DevInfo;
396 HKEY hKey;
397 WCHAR szNetCfg[50];
398 WCHAR szAdapterNetCfg[MAX_DEVICE_ID_LEN];
399 WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\";
400 WCHAR szName[130] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
401 NetCfgComponentItem * pLast = NULL, *pCurrent;
402
403 hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT );
404 if (!hInfo)
405 {
406 return E_FAIL;
407 }
408
409 dwIndex = 0;
410 do
411 {
412 ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
413 DevInfo.cbSize = sizeof(DevInfo);
414
415 /* get device info */
416 if (!SetupDiEnumDeviceInfo(hInfo, dwIndex++, &DevInfo))
417 break;
418
419 /* get device software registry path */
420 if (!SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DRIVER, NULL, (LPBYTE)&szDetail[39], sizeof(szDetail)/sizeof(WCHAR) - 40, &dwSize))
421 break;
422
423 /* open device registry key */
425 break;
426
427 /* query NetCfgInstanceId for current device */
428 dwSize = sizeof(szNetCfg);
429 if (RegQueryValueExW(hKey, L"NetCfgInstanceId", NULL, NULL, (LPBYTE)szNetCfg, &dwSize) != ERROR_SUCCESS)
430 {
432 break;
433 }
434
435 /* allocate new INetConnectionItem */
436 pCurrent = CoTaskMemAlloc(sizeof(NetCfgComponentItem));
437 if (!pCurrent)
438 break;
439
440 ZeroMemory(pCurrent, sizeof(NetCfgComponentItem));
441 CopyMemory(&pCurrent->ClassGUID, &GUID_DEVCLASS_NET, sizeof(GUID));
442 CLSIDFromString(szNetCfg, &pCurrent->InstanceId); //FIXME
443
444 /* set bind name */
445 pCurrent->szBindName = CoTaskMemAlloc((wcslen(szNetCfg)+1) *sizeof(WCHAR));
446 if (pCurrent->szBindName)
447 wcscpy(pCurrent->szBindName, szNetCfg);
448
449 /* retrieve ComponentId */
450 dwSize = sizeof(szAdapterNetCfg);
451 if (RegQueryValueExW(hKey, L"ComponentId", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
452 {
453 pCurrent->szId = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
454 if (pCurrent->szId)
455 wcscpy(pCurrent->szId, szAdapterNetCfg);
456 }
457 /* set INetCfgComponent::GetDisplayName */
458 dwSize = sizeof(szAdapterNetCfg);
459 if (RegQueryValueExW(hKey, L"DriverDesc", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
460 {
461 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
462 if (pCurrent->szDisplayName)
463 wcscpy(pCurrent->szDisplayName, szAdapterNetCfg);
464 }
465
467 /* open network connections details */
468 wcscpy(&szName[80], szNetCfg);
469 wcscpy(&szName[118], L"\\Connection");
470
472 {
473 /* retrieve pnp instance id */
474 dwSize = sizeof(szAdapterNetCfg);
475 if (RegQueryValueExW(hKey, L"PnpInstanceID", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS)
476 {
477 pCurrent->szNodeId = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR));
478 if (pCurrent->szNodeId)
479 wcscpy(pCurrent->szNodeId, szAdapterNetCfg);
480 }
482 }
483
484 if (SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szNetCfg, sizeof(szNetCfg)/sizeof(WCHAR), &dwSize))
485 {
486 szNetCfg[(sizeof(szNetCfg)/sizeof(WCHAR))-1] = L'\0';
487 pCurrent->szDisplayName = CoTaskMemAlloc((wcslen(szNetCfg)+1) * sizeof(WCHAR));
488 if (pCurrent->szDisplayName)
489 wcscpy(pCurrent->szDisplayName, szNetCfg);
490 }
491
492 if (pLast)
493 pLast->pNext = pCurrent;
494 else
495 *pHead = pCurrent;
496
497 pLast = pCurrent;
498
499 }while(TRUE);
500
502 return NOERROR;
503}
504
505
508 NetCfgComponentItem * pHead,
509 LPCWSTR pszwComponentId,
510 INetCfgComponent **pComponent,
511 INetCfg * iface)
512{
513 while(pHead)
514 {
515 if (!_wcsicmp(pHead->szId, pszwComponentId))
516 {
517 return INetCfgComponent_Constructor(NULL, &IID_INetCfgComponent, (LPVOID*)pComponent, pHead, iface);
518 }
519 pHead = pHead->pNext;
520 }
521 return S_FALSE;
522}
523
524
525
527WINAPI
529 INetCfg * iface,
530 REFIID iid,
531 LPVOID * ppvObj)
532{
533 INetCfgImpl * This = (INetCfgImpl*)iface;
534 *ppvObj = NULL;
535
536 if (IsEqualIID (iid, &IID_IUnknown) ||
537 IsEqualIID (iid, &IID_INetCfg))
538 {
539 *ppvObj = This;
540 INetCfg_AddRef(iface);
541 return S_OK;
542 }
543 else if (IsEqualIID (iid, &IID_INetCfgLock))
544 {
545 if (This->bInitialized)
547
548 *ppvObj = (LPVOID)&This->lpVtblLock;
549 This->hMutex = CreateMutexW(NULL, FALSE, L"NetCfgLock");
550
551 INetCfgLock_AddRef(iface);
552 return S_OK;
553 }
555 {
556 if (This->bInitialized)
558
559 *ppvObj = (LPVOID)&This->lpVtblPnpReconfigCallback;
561 return S_OK;
562 }
563
564 return E_NOINTERFACE;
565}
566
567ULONG
568WINAPI
570 INetCfg * iface)
571{
572 INetCfgImpl * This = (INetCfgImpl*)iface;
573 ULONG refCount = InterlockedIncrement(&This->ref);
574
575 return refCount;
576}
577
578ULONG
579WINAPI
581 INetCfg * iface)
582{
583 INetCfgImpl * This = (INetCfgImpl*)iface;
584 ULONG refCount = InterlockedDecrement(&This->ref);
585
586 if (!refCount)
587 {
589 }
590 return refCount;
591}
592
594WINAPI
596 INetCfg * iface,
598{
599 HRESULT hr;
600 INetCfgImpl *This = (INetCfgImpl *)iface;
601
602 if (This->bInitialized)
604
606 if (FAILED(hr))
607 return hr;
608
609
610 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETCLIENT, &This->pClient);
611 if (FAILED(hr))
612 return hr;
613
614 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETSERVICE, &This->pService);
615 if (FAILED(hr))
616 return hr;
617
618
619 hr = EnumerateNetworkComponent(&GUID_DEVCLASS_NETTRANS, &This->pProtocol);
620 if (FAILED(hr))
621 return hr;
622
623 This->bInitialized = TRUE;
624 return S_OK;
625}
626
627VOID
629 NetCfgComponentItem *pHead,
630 const CLSID * lpClassGUID,
631 BOOL bApply)
632{
633 HKEY hKey;
634 WCHAR szName[200];
635 LPOLESTR pszGuid;
636
637 while(pHead)
638 {
639 if (pHead->bChanged)
640 {
641 if (IsEqualGUID(lpClassGUID, &GUID_DEVCLASS_NET))
642 {
643 if (bApply)
644 {
645 if (StringFromCLSID(&pHead->InstanceId, &pszGuid) == NOERROR)
646 {
647 swprintf(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\%s", pszGuid);
648 CoTaskMemFree(pszGuid);
649
651 {
652 RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE)pHead->szDisplayName, (wcslen(pHead->szDisplayName)+1) * sizeof(WCHAR));
654 }
655 }
656 }
657 }
658 else if (pHead->pNCCC)
659 {
660 if (bApply)
661 {
663 //FIXME
664 // implement INetCfgPnpReconfigCallback and pass it to
665 //INetCfgComponentControl_ApplyPnpChanges(pHead->pNCCC, NULL);
666 }
667 else
668 {
670 }
671 }
672 }
673 pHead = pHead->pNext;
674 }
675}
676
677VOID
679{
682 CoTaskMemFree(pItem->szId);
684 CoTaskMemFree(pItem->szNodeId);
686 CoTaskMemFree(pItem);
687}
688
690WINAPI
692 INetCfg * iface)
693{
694 INetCfgImpl *This = (INetCfgImpl *)iface;
695 NetCfgComponentItem *pItem;
696
697 if (!This->bInitialized)
699
700 /* Free the services */
701 while (This->pService != NULL)
702 {
703 pItem = This->pService;
704 This->pService = pItem->pNext;
705 FreeComponentItem(pItem);
706 }
707
708 /* Free the clients */
709 while (This->pClient != NULL)
710 {
711 pItem = This->pClient;
712 This->pClient = pItem->pNext;
713 FreeComponentItem(pItem);
714 }
715
716 /* Free the protocols */
717 while (This->pProtocol != NULL)
718 {
719 pItem = This->pProtocol;
720 This->pProtocol = pItem->pNext;
721 FreeComponentItem(pItem);
722 }
723
724 /* Free the adapters */
725 while (This->pNet != NULL)
726 {
727 pItem = This->pNet;
728 This->pNet = pItem->pNext;
729 FreeComponentItem(pItem);
730 }
731
732 This->bInitialized = FALSE;
733
734 return S_OK;
735}
736
737
739WINAPI
741 INetCfg * iface)
742{
743 INetCfgImpl *This = (INetCfgImpl *)iface;
744
745 if (!This->bInitialized)
747
748 ApplyOrCancelChanges(This->pNet, &GUID_DEVCLASS_NET, TRUE);
749 ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, TRUE);
750 ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, TRUE);
751 ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, TRUE);
752
753 return S_OK;
754}
755
757WINAPI
759 INetCfg * iface)
760{
761 INetCfgImpl *This = (INetCfgImpl *)iface;
762
763 if (!This->bInitialized)
765
766 ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, FALSE);
767 ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, FALSE);
768 ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, FALSE);
769
770 return S_OK;
771}
772
774WINAPI
776 INetCfg * iface,
777 const GUID *pguidClass,
778 IEnumNetCfgComponent **ppenumComponent)
779{
780 INetCfgImpl *This = (INetCfgImpl *)iface;
781
782 if (!This->bInitialized)
784
785 if (IsEqualGUID(&GUID_DEVCLASS_NET, pguidClass))
786 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pNet, iface);
787 else if (IsEqualGUID(&GUID_DEVCLASS_NETCLIENT, pguidClass))
788 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pClient, iface);
789 else if (IsEqualGUID(&GUID_DEVCLASS_NETSERVICE, pguidClass))
790 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pService, iface);
791 else if (IsEqualGUID(&GUID_DEVCLASS_NETTRANS, pguidClass))
792 return IEnumNetCfgComponent_Constructor (NULL, &IID_IEnumNetCfgComponent, (LPVOID*)ppenumComponent, This->pProtocol, iface);
793 else
794 return E_NOINTERFACE;
795}
796
797
799WINAPI
801 INetCfg * iface,
802 LPCWSTR pszwComponentId,
803 INetCfgComponent **pComponent)
804{
805 HRESULT hr;
806 INetCfgImpl *This = (INetCfgImpl *)iface;
807
808 if (!This->bInitialized)
810
811 hr = FindNetworkComponent(This->pClient, pszwComponentId, pComponent, iface);
812 if (hr == S_OK)
813 return hr;
814
815 hr = FindNetworkComponent(This->pService, pszwComponentId, pComponent, iface);
816 if (hr == S_OK)
817 return hr;
818
819 hr = FindNetworkComponent(This->pProtocol, pszwComponentId, pComponent, iface);
820 if (hr == S_OK)
821 return hr;
822
823 return S_FALSE;
824}
825
827WINAPI
829 INetCfg * iface,
830 const GUID *pguidClass,
831 REFIID riid,
832 void **ppvObject)
833{
834 return INetCfgClass_Constructor((IUnknown *)iface, riid, ppvObject, pguidClass, iface);
835}
836
837static const INetCfgVtbl vt_NetCfg =
838{
849};
850
852{
854
855 if (!ppv)
856 return E_POINTER;
857
859 if (!This)
860 return E_OUTOFMEMORY;
861
862 This->ref = 1;
863 This->lpVtbl = (const INetCfg*)&vt_NetCfg;
864 This->lpVtblLock = (const INetCfgLock*)&vt_NetCfgLock;
865 This->lpVtblPnpReconfigCallback = (const INetCfgPnpReconfigCallback*)&vt_NetCfgPnpReconfigCallback;
866 This->hMutex = NULL;
867 This->bInitialized = FALSE;
868 This->pNet = NULL;
869 This->pClient = NULL;
870 This->pService = NULL;
871 This->pProtocol = NULL;
872
873 if (!SUCCEEDED (INetCfg_QueryInterface ((INetCfg*)This, riid, ppv)))
874 {
875 INetCfg_Release((INetCfg*)This);
876 return E_NOINTERFACE;
877 }
878
879 INetCfg_Release((INetCfg*)This);
880 return S_OK;
881}
#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
wcscat
wcscpy
#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
#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 CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR *idstr)
Definition: compobj.c:2412
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:3224
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
Definition: devinst.c:2893
#define swprintf
Definition: precomp.h:40
#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
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
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
#define ZeroMemory
Definition: minwinbase.h:31
#define CopyMemory
Definition: minwinbase.h:29
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static LPOLESTR
Definition: stg_prop.c:27
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:740
HRESULT EnumerateNetworkAdapter(NetCfgComponentItem **pHead)
Definition: netcfg_iface.c:391
static const INetCfgPnpReconfigCallbackVtbl vt_NetCfgPnpReconfigCallback
Definition: netcfg_iface.c:202
HRESULT FindNetworkComponent(NetCfgComponentItem *pHead, LPCWSTR pszwComponentId, INetCfgComponent **pComponent, INetCfg *iface)
Definition: netcfg_iface.c:507
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:758
HRESULT WINAPI INetCfg_fnEnumComponents(INetCfg *iface, const GUID *pguidClass, IEnumNetCfgComponent **ppenumComponent)
Definition: netcfg_iface.c:775
HRESULT WINAPI INetCfg_fnInitialize(INetCfg *iface, PVOID pReserved)
Definition: netcfg_iface.c:595
VOID ApplyOrCancelChanges(NetCfgComponentItem *pHead, const CLSID *lpClassGUID, BOOL bApply)
Definition: netcfg_iface.c:628
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:691
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:828
HRESULT WINAPI INetCfg_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: netcfg_iface.c:851
HRESULT EnumerateNetworkComponent(const GUID *pGuid, NetCfgComponentItem **pHead)
Definition: netcfg_iface.c:368
HRESULT WINAPI INetCfg_fnQueryInterface(INetCfg *iface, REFIID iid, LPVOID *ppvObj)
Definition: netcfg_iface.c:528
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:580
HRESULT WINAPI INetCfg_fnFindComponent(INetCfg *iface, LPCWSTR pszwComponentId, INetCfgComponent **pComponent)
Definition: netcfg_iface.c:800
static const INetCfgVtbl vt_NetCfg
Definition: netcfg_iface.c:837
VOID FreeComponentItem(NetCfgComponentItem *pItem)
Definition: netcfg_iface.c:678
static __inline INetCfgImpl * impl_from_INetCfgPnpReconfigCallback(INetCfgPnpReconfigCallback *iface)
Definition: netcfg_iface.c:8
ULONG WINAPI INetCfg_fnAddRef(INetCfg *iface)
Definition: netcfg_iface.c:569
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
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
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
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define SPDRP_DRIVER
Definition: setupapi.h:517
#define SPDRP_DEVICEDESC
Definition: setupapi.h:508
#define SetupDiGetClassDevs
Definition: setupapi.h:2594
#define DIGCF_PRESENT
Definition: setupapi.h:172
HRESULT hr
Definition: shlfolder.c:183
Definition: xml2sdb.h:124
INetCfgComponentControl * pNCCC
Definition: precomp.h:55
struct tagNetCfgComponentItem * pNext
Definition: precomp.h:54
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:576
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:618
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
unsigned char * LPBYTE
Definition: typedefs.h:53
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
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184