2 * PROJECT: ReactOS system libraries
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Network property page provider
5 * COPYRIGHT: Copyright 2018 Eric Kohl (eric.kohl@reactos.org)
10 typedef enum _PARAM_TYPE
19 } PARAM_TYPE
, *PPARAM_TYPE
;
21 typedef struct _ENUM_OPTION
25 } ENUM_OPTION
, *PENUM_OPTION
;
27 typedef struct _PARAMETER
39 PENUM_OPTION pEnumOptions
;
60 } PARAMETER
, *PPARAMETER
;
62 typedef struct _PARAMETER_ARRAY
64 HDEVINFO DeviceInfoSet
;
65 PSP_DEVINFO_DATA DeviceInfoData
;
66 PPARAMETER pCurrentParam
;
69 } PARAMETER_ARRAY
, *PPARAMETER_ARRAY
;
75 _In_ PPARAMETER_ARRAY ParamArray
)
79 if (ParamArray
== NULL
)
82 for (i
= 0; i
< ParamArray
->dwCount
; i
++)
84 if (ParamArray
->Array
[i
].pszName
!= NULL
)
85 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszName
);
87 if (ParamArray
->Array
[i
].pszDescription
!= NULL
)
88 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszDescription
);
90 if (ParamArray
->Array
[i
].pszDefault
!= NULL
)
91 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszDefault
);
94 if (ParamArray
->Array
[i
].pEnumOptions
!= NULL
)
96 for (j
= 0; j
< ParamArray
->Array
[i
].dwEnumOptions
; j
++)
98 if (ParamArray
->Array
[i
].pEnumOptions
[j
].pszValue
!= NULL
)
99 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pEnumOptions
[j
].pszValue
);
101 if (ParamArray
->Array
[i
].pEnumOptions
[j
].pszName
!= NULL
)
102 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pEnumOptions
[j
].pszName
);
105 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pEnumOptions
);
109 HeapFree(GetProcessHeap(), 0, ParamArray
);
116 _In_ PWSTR pValueName
,
117 _Out_ PWSTR
*pString
,
118 _Out_opt_ PDWORD pdwStringLength
)
127 RegQueryValueExW(hKey
, pValueName
, NULL
, &dwRegType
, NULL
, &dwLength
);
129 if (dwLength
== 0 || dwRegType
!= REG_SZ
)
130 return ERROR_FILE_NOT_FOUND
;
132 pBuffer
= HeapAlloc(GetProcessHeap(), 0, dwLength
+ sizeof(WCHAR
));
134 return ERROR_NOT_ENOUGH_MEMORY
;
136 dwError
= RegQueryValueExW(hKey
, pValueName
, NULL
, NULL
, (LPBYTE
)pBuffer
, &dwLength
);
137 if (dwError
!= ERROR_SUCCESS
)
139 HeapFree(GetProcessHeap(), 0, pBuffer
);
143 pBuffer
[dwLength
/ sizeof(WCHAR
)] = UNICODE_NULL
;
147 *pdwStringLength
= dwLength
;
149 return ERROR_SUCCESS
;
156 _In_ PWSTR pValueName
,
166 dwLength
= sizeof(szBuffer
);
167 RegQueryValueExW(hKey
,
174 if (dwRegType
== REG_SZ
&& dwLength
>= sizeof(WCHAR
))
176 if (szBuffer
[0] == L
'0')
182 return ERROR_SUCCESS
;
189 _In_ PWSTR pValueName
,
199 dwLength
= sizeof(szBuffer
);
200 RegQueryValueExW(hKey
,
207 if (dwRegType
== REG_SZ
&& dwLength
>= sizeof(WCHAR
))
209 *pValue
= _wtoi(szBuffer
);
212 return ERROR_SUCCESS
;
219 _In_ PWSTR pValueName
,
228 dwLength
= sizeof(szBuffer
);
229 RegQueryValueExW(hKey
,
236 if (dwRegType
== REG_SZ
&& dwLength
>= sizeof(WCHAR
))
238 *pValue
= wcstol(szBuffer
, &ptr
, 10);
239 if (*pValue
== 0 && ptr
!= NULL
)
247 return ERROR_SUCCESS
;
254 _In_ PWSTR pValueName
,
255 _In_ DWORD dwDefault
,
263 dwLength
= sizeof(szBuffer
);
264 RegQueryValueExW(hKey
,
271 if (dwRegType
== REG_SZ
&& dwLength
>= sizeof(WCHAR
))
273 *pValue
= wcstoul(szBuffer
, &ptr
, 10);
274 if (*pValue
== 0 && ptr
!= NULL
)
282 return ERROR_SUCCESS
;
290 _In_ PPARAMETER pParameter
)
292 HKEY hEnumKey
= NULL
;
293 PENUM_OPTION pOptions
= NULL
;
294 DWORD dwValues
, dwMaxValueNameLen
, dwMaxValueLen
;
295 DWORD dwValueNameLength
, dwValueLength
;
299 dwError
= RegOpenKeyExW(hKey
,
304 if (dwError
!= ERROR_SUCCESS
)
307 dwError
= RegQueryInfoKeyW(hEnumKey
,
319 if (dwError
!= ERROR_SUCCESS
)
321 ERR("RegQueryInfoKeyW failed (Error %lu)\n", dwError
);
325 pOptions
= HeapAlloc(GetProcessHeap(),
327 dwValues
* sizeof(ENUM_OPTION
));
328 if (pOptions
== NULL
)
330 dwError
= ERROR_OUTOFMEMORY
;
334 for (i
= 0; i
< dwValues
; i
++)
336 dwValueNameLength
= dwMaxValueNameLen
+ sizeof(WCHAR
);
337 pOptions
[i
].pszValue
= HeapAlloc(GetProcessHeap(),
339 dwValueNameLength
* sizeof(WCHAR
));
340 if (pOptions
[i
].pszValue
== NULL
)
342 dwError
= ERROR_OUTOFMEMORY
;
346 dwValueLength
= dwMaxValueLen
;
347 pOptions
[i
].pszName
= HeapAlloc(GetProcessHeap(),
350 if (pOptions
[i
].pszName
== NULL
)
352 dwError
= ERROR_OUTOFMEMORY
;
356 dwError
= RegEnumValueW(hEnumKey
,
358 pOptions
[i
].pszValue
,
362 (PBYTE
)pOptions
[i
].pszName
,
364 if (dwError
== ERROR_NO_MORE_ITEMS
)
366 dwError
= ERROR_SUCCESS
;
369 else if (dwError
!= ERROR_SUCCESS
)
375 pParameter
->pEnumOptions
= pOptions
;
376 pParameter
->dwEnumOptions
= dwValues
;
380 if (pOptions
!= NULL
)
382 for (i
= 0; i
< dwValues
; i
++)
384 if (pOptions
[i
].pszValue
!= NULL
)
385 HeapFree(GetProcessHeap(), 0, pOptions
[i
].pszValue
);
387 if (pOptions
[i
].pszName
!= NULL
)
388 HeapFree(GetProcessHeap(), 0, pOptions
[i
].pszName
);
391 HeapFree(GetProcessHeap(), 0, pOptions
);
394 if (hEnumKey
!= NULL
)
395 RegCloseKey(hEnumKey
);
404 _In_ PPARAMETER pParameter
,
409 if ((pParameter
->pEnumOptions
== NULL
) ||
410 (pParameter
->dwEnumOptions
== 0))
413 for (i
= 0; i
< pParameter
->dwEnumOptions
; i
++)
415 if (_wcsicmp(pParameter
->pEnumOptions
[i
].pszValue
, pszValue
) == 0)
426 _In_ HDEVINFO DeviceInfoSet
,
427 _In_ PSP_DEVINFO_DATA DeviceInfoData
,
428 _Out_ PPARAMETER_ARRAY
*ParameterArray
)
430 HKEY hDriverKey
= INVALID_HANDLE_VALUE
;
431 HKEY hParamsKey
= INVALID_HANDLE_VALUE
;
433 PPARAMETER_ARRAY ParamArray
= NULL
;
434 DWORD dwSubKeys
, dwMaxSubKeyLen
, dwKeyLen
, dwIndex
;
435 PWSTR pszType
= NULL
;
437 LONG lDefaultMin
, lDefaultMax
;
438 DWORD dwDefaultMin
, dwDefaultMax
;
441 hDriverKey
= SetupDiOpenDevRegKey(DeviceInfoSet
,
447 if (hDriverKey
== INVALID_HANDLE_VALUE
)
449 ERR("SetupDiOpenDevRegKey() failed\n");
453 lError
= RegOpenKeyExW(hDriverKey
,
458 if (lError
!= ERROR_SUCCESS
)
460 ERR("RegOpenKeyExW failed (Error %lu)\n", lError
);
464 lError
= RegQueryInfoKeyW(hParamsKey
,
476 if (lError
!= ERROR_SUCCESS
)
478 ERR("RegOpenKeyExW failed (Error %lu)\n", lError
);
482 TRACE("Sub keys: %lu\n", dwSubKeys
);
486 TRACE("No sub keys. Done!\n");
490 ParamArray
= HeapAlloc(GetProcessHeap(),
492 sizeof(PARAMETER_ARRAY
) + (dwSubKeys
* sizeof(PARAMETER
)));
493 if (ParamArray
== NULL
)
495 ERR("Parameter array allocation failed!\n");
499 ParamArray
->DeviceInfoSet
= DeviceInfoSet
;
500 ParamArray
->DeviceInfoData
= DeviceInfoData
;
501 ParamArray
->dwCount
= dwSubKeys
;
505 for (dwIndex
= 0; dwIndex
< dwSubKeys
; dwIndex
++)
507 ParamArray
->Array
[dwIndex
].pszName
= HeapAlloc(GetProcessHeap(),
509 dwMaxSubKeyLen
* sizeof(WCHAR
));
510 if (ParamArray
->Array
[dwIndex
].pszName
== NULL
)
512 ERR("Parameter array allocation failed!\n");
516 dwKeyLen
= dwMaxSubKeyLen
;
517 lError
= RegEnumKeyExW(hParamsKey
,
519 ParamArray
->Array
[dwIndex
].pszName
,
525 if (lError
!= ERROR_SUCCESS
)
528 TRACE("Sub key '%S'\n", ParamArray
->Array
[dwIndex
].pszName
);
530 lError
= RegOpenKeyExW(hParamsKey
,
531 ParamArray
->Array
[dwIndex
].pszName
,
535 if (lError
== ERROR_SUCCESS
)
537 GetStringValue(hParamKey
,
539 &ParamArray
->Array
[dwIndex
].pszDescription
,
542 GetStringValue(hParamKey
,
548 if (_wcsicmp(pszType
, L
"int") == 0)
549 ParamArray
->Array
[dwIndex
].Type
= INT_TYPE
;
550 else if (_wcsicmp(pszType
, L
"long") == 0)
551 ParamArray
->Array
[dwIndex
].Type
= LONG_TYPE
;
552 else if (_wcsicmp(pszType
, L
"word") == 0)
553 ParamArray
->Array
[dwIndex
].Type
= WORD_TYPE
;
554 else if (_wcsicmp(pszType
, L
"dword") == 0)
555 ParamArray
->Array
[dwIndex
].Type
= DWORD_TYPE
;
556 else if (_wcsicmp(pszType
, L
"edit") == 0)
557 ParamArray
->Array
[dwIndex
].Type
= EDIT_TYPE
;
558 else if (_wcsicmp(pszType
, L
"enum") == 0)
559 ParamArray
->Array
[dwIndex
].Type
= ENUM_TYPE
;
561 ParamArray
->Array
[dwIndex
].Type
= NO_TYPE
;
563 HeapFree(GetProcessHeap(), 0, pszType
);
567 GetStringValue(hParamKey
,
569 &ParamArray
->Array
[dwIndex
].pszDefault
,
572 GetBooleanValue(hParamKey
,
575 &ParamArray
->Array
[dwIndex
].bOptional
);
577 if (ParamArray
->Array
[dwIndex
].Type
== INT_TYPE
||
578 ParamArray
->Array
[dwIndex
].Type
== LONG_TYPE
||
579 ParamArray
->Array
[dwIndex
].Type
== WORD_TYPE
||
580 ParamArray
->Array
[dwIndex
].Type
== DWORD_TYPE
)
582 if (ParamArray
->Array
[dwIndex
].Type
== INT_TYPE
)
584 lDefaultMin
= -32768L; //MIN_SHORT;
585 lDefaultMax
= 32767L; //MAX_SHORT;
587 else if (ParamArray
->Array
[dwIndex
].Type
== LONG_TYPE
)
589 lDefaultMin
= (-2147483647L - 1); // MIN_LONG;
590 lDefaultMax
= 2147483647L; // MAX_LONG;
592 else if (ParamArray
->Array
[dwIndex
].Type
== WORD_TYPE
)
595 dwDefaultMax
= 65535UL; // MAX_WORD;
598 else if (ParamArray
->Array
[dwIndex
].Type
== DWORD_TYPE
)
601 dwDefaultMax
= 4294967295UL; //MAX_DWORD;
605 if (ParamArray
->Array
[dwIndex
].Type
== INT_TYPE
||
606 ParamArray
->Array
[dwIndex
].Type
== LONG_TYPE
)
608 GetLongValue(hParamKey
,
611 &ParamArray
->Array
[dwIndex
].u
.l
.lMin
);
613 GetLongValue(hParamKey
,
616 &ParamArray
->Array
[dwIndex
].u
.l
.lMax
);
618 else if (ParamArray
->Array
[dwIndex
].Type
== WORD_TYPE
||
619 ParamArray
->Array
[dwIndex
].Type
== DWORD_TYPE
)
621 GetDWordValue(hParamKey
,
624 &ParamArray
->Array
[dwIndex
].u
.dw
.dwMin
);
626 GetDWordValue(hParamKey
,
629 &ParamArray
->Array
[dwIndex
].u
.dw
.dwMax
);
632 GetIntValue(hParamKey
,
635 &ParamArray
->Array
[dwIndex
].iBase
);
637 GetIntValue(hParamKey
,
640 &ParamArray
->Array
[dwIndex
].iStep
);
642 else if (ParamArray
->Array
[dwIndex
].Type
== EDIT_TYPE
)
644 GetBooleanValue(hParamKey
,
647 &ParamArray
->Array
[dwIndex
].bUpperCase
);
649 GetIntValue(hParamKey
,
652 &ParamArray
->Array
[dwIndex
].iTextLimit
);
654 else if (ParamArray
->Array
[dwIndex
].Type
== ENUM_TYPE
)
656 GetEnumOptions(hParamKey
,
657 &ParamArray
->Array
[dwIndex
]);
660 RegCloseKey(hParamKey
);
663 lError
= GetStringValue(hDriverKey
,
664 ParamArray
->Array
[dwIndex
].pszName
,
665 &ParamArray
->Array
[dwIndex
].pszValue
,
666 &ParamArray
->Array
[dwIndex
].cchValueLength
);
667 if ((lError
== ERROR_SUCCESS
) ||
668 (ParamArray
->Array
[dwIndex
].pszDefault
!= NULL
))
670 ParamArray
->Array
[dwIndex
].bPresent
= TRUE
;
674 *ParameterArray
= ParamArray
;
678 if (ret
== FALSE
&& ParamArray
!= NULL
)
679 FreeParameterArray(ParamArray
);
681 if (hParamsKey
!= INVALID_HANDLE_VALUE
)
682 RegCloseKey(hParamsKey
);
684 if (hDriverKey
!= INVALID_HANDLE_VALUE
)
685 RegCloseKey(hDriverKey
);
699 if (pParam
->Type
== ENUM_TYPE
)
701 iIndex
= ComboBox_GetCurSel(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
));
702 if (iIndex
!= CB_ERR
&& iIndex
< pParam
->dwEnumOptions
)
704 iLength
= wcslen(pParam
->pEnumOptions
[iIndex
].pszValue
);
705 if (iLength
> pParam
->cchValueLength
)
707 if (pParam
->pszValue
!= NULL
)
708 HeapFree(GetProcessHeap(), 0, pParam
->pszValue
);
710 pParam
->pszValue
= HeapAlloc(GetProcessHeap(), 0, (iLength
+ 1) * sizeof(WCHAR
));
713 if (pParam
->pszValue
!= NULL
)
715 wcscpy(pParam
->pszValue
,
716 pParam
->pEnumOptions
[iIndex
].pszValue
);
717 pParam
->cchValueLength
= iLength
;
723 iLength
= Edit_GetTextLength(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
));
724 if (iLength
> pParam
->cchValueLength
)
726 if (pParam
->pszValue
!= NULL
)
727 HeapFree(GetProcessHeap(), 0, pParam
->pszValue
);
729 pParam
->pszValue
= HeapAlloc(GetProcessHeap(), 0, (iLength
+ 1) * sizeof(WCHAR
));
732 if (pParam
->pszValue
!= NULL
)
734 Edit_GetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
),
737 pParam
->cchValueLength
= iLength
;
747 _In_ PPARAMETER_ARRAY ParamArray
)
753 if (ParamArray
== NULL
)
756 hDriverKey
= SetupDiOpenDevRegKey(ParamArray
->DeviceInfoSet
,
757 ParamArray
->DeviceInfoData
,
762 if (hDriverKey
== INVALID_HANDLE_VALUE
)
764 ERR("SetupDiOpenDevRegKey() failed\n");
768 for (i
= 0; i
< ParamArray
->dwCount
; i
++)
770 Param
= &ParamArray
->Array
[i
];
772 if (Param
== ParamArray
->pCurrentParam
)
774 ReadParameterValue(hwnd
, Param
);
779 TRACE("Set '%S' --> '%S'\n", Param
->pszName
, Param
->pszValue
);
780 RegSetValueExW(hDriverKey
,
784 (LPBYTE
)Param
->pszValue
,
785 (wcslen(Param
->pszValue
) + 1) * sizeof(WCHAR
));
789 TRACE("Delete '%S'\n", Param
->pszName
);
790 RegDeleteValueW(hDriverKey
,
795 RegCloseKey(hDriverKey
);
803 _In_ PPARAMETER Parameter
)
810 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_PRESENT
), (Parameter
->bOptional
) ? SW_SHOW
: SW_HIDE
);
811 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_NOT_PRESENT
), (Parameter
->bOptional
) ? SW_SHOW
: SW_HIDE
);
812 if (Parameter
->bOptional
)
814 if (Parameter
->bPresent
)
815 Button_SetCheck(GetDlgItem(hwnd
, IDC_PROPERTY_PRESENT
), BST_CHECKED
);
817 Button_SetCheck(GetDlgItem(hwnd
, IDC_PROPERTY_NOT_PRESENT
), BST_CHECKED
);
820 switch (Parameter
->Type
)
826 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), SW_HIDE
);
828 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
);
830 if (Parameter
->Type
!= DWORD_TYPE
)
832 EnableWindow(hwndControl
, Parameter
->bPresent
);
833 ShowWindow(hwndControl
, SW_SHOW
);
836 if (Parameter
->Type
== WORD_TYPE
|| Parameter
->Type
== DWORD_TYPE
)
837 SendMessage(hwndControl
, UDM_SETBASE
, Parameter
->iBase
, 0);
839 SendMessage(hwndControl
, UDM_SETBASE
, 10, 0);
841 if (Parameter
->Type
== INT_TYPE
|| Parameter
->Type
== LONG_TYPE
)
843 TRACE("SetMin %ld SetMax %ld\n", Parameter
->u
.l
.lMin
, Parameter
->u
.l
.lMax
);
844 SendMessage(hwndControl
, UDM_SETRANGE32
, Parameter
->u
.l
.lMin
, Parameter
->u
.l
.lMax
);
846 else if (Parameter
->Type
== WORD_TYPE
)
848 TRACE("SetMin %lu SetMax %lu\n", Parameter
->u
.dw
.dwMin
, Parameter
->u
.dw
.dwMax
);
849 SendMessage(hwndControl
, UDM_SETRANGE32
, (INT
)Parameter
->u
.dw
.dwMin
, (INT
)Parameter
->u
.dw
.dwMax
);
852 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
);
853 EnableWindow(hwndControl
, Parameter
->bPresent
);
854 ShowWindow(hwndControl
, SW_SHOW
);
856 Style
= GetWindowLongPtr(hwndControl
, GWL_STYLE
);
858 SetWindowLongPtr(hwndControl
, GWL_STYLE
, Style
);
860 Edit_LimitText(hwndControl
, 0);
862 if (Parameter
->pszValue
)
863 Edit_SetText(hwndControl
, Parameter
->pszValue
);
864 else if (Parameter
->pszDefault
)
865 Edit_SetText(hwndControl
, Parameter
->pszDefault
);
869 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), SW_HIDE
);
870 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), SW_HIDE
);
872 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
);
873 EnableWindow(hwndControl
, Parameter
->bPresent
);
874 ShowWindow(hwndControl
, SW_SHOW
);
876 Style
= GetWindowLongPtr(hwndControl
, GWL_STYLE
);
878 if (Parameter
->bUpperCase
)
879 Style
|= ES_UPPERCASE
;
881 Style
&= ~ES_UPPERCASE
;
882 SetWindowLongPtr(hwndControl
, GWL_STYLE
, Style
);
884 Edit_LimitText(hwndControl
, Parameter
->iTextLimit
);
886 if (Parameter
->pszValue
)
887 Edit_SetText(hwndControl
, Parameter
->pszValue
);
888 else if (Parameter
->pszDefault
)
889 Edit_SetText(hwndControl
, Parameter
->pszDefault
);
893 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), SW_HIDE
);
894 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), SW_HIDE
);
896 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
);
897 EnableWindow(hwndControl
, Parameter
->bPresent
);
898 ShowWindow(hwndControl
, SW_SHOW
);
900 ComboBox_ResetContent(hwndControl
);
902 if (Parameter
->pEnumOptions
!= NULL
&& Parameter
->dwEnumOptions
!= 0)
904 for (i
= 0; i
< Parameter
->dwEnumOptions
; i
++)
906 ComboBox_AddString(hwndControl
, Parameter
->pEnumOptions
[i
].pszName
);
910 if (Parameter
->pszValue
)
912 idx
= FindEnumOption(Parameter
, Parameter
->pszValue
);
914 ComboBox_SetCurSel(hwndControl
, idx
);
916 else if (Parameter
->pszDefault
)
918 idx
= FindEnumOption(Parameter
, Parameter
->pszDefault
);
920 ComboBox_SetCurSel(hwndControl
, idx
);
937 PPARAMETER_ARRAY pParamArray
;
943 TRACE("OnInitDialog()\n");
945 pParamArray
= (PPARAMETER_ARRAY
)((LPPROPSHEETPAGEW
)lParam
)->lParam
;
946 if (pParamArray
== NULL
)
948 ERR("pParamArray is NULL\n");
952 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)pParamArray
);
954 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_NAME
);
957 for (i
= 0; i
< pParamArray
->dwCount
; i
++)
959 if (pParamArray
->Array
[i
].pszDescription
!= NULL
)
960 pszText
= pParamArray
->Array
[i
].pszDescription
;
962 pszText
= pParamArray
->Array
[i
].pszName
;
964 idx
= ListBox_AddString(hwndControl
, pszText
);
966 ListBox_SetItemData(hwndControl
, idx
, (LPARAM
)&pParamArray
->Array
[i
]);
969 if (pParamArray
->dwCount
> 0)
971 ListBox_SetCurSel(hwndControl
, 0);
972 pParamArray
->pCurrentParam
= (PPARAMETER
)ListBox_GetItemData(hwndControl
, 0);
973 DisplayParameter(hwnd
, pParamArray
->pCurrentParam
);
988 PPARAMETER_ARRAY pParamArray
;
991 TRACE("OnCommand()\n");
993 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
994 if (pParamArray
== NULL
)
996 ERR("pParamArray is NULL\n");
1000 if ((LOWORD(wParam
) == IDC_PROPERTY_NAME
) && (HIWORD(wParam
) == LBN_SELCHANGE
))
1002 if (pParamArray
->pCurrentParam
!= NULL
)
1004 ReadParameterValue(hwnd
, pParamArray
->pCurrentParam
);
1007 iIndex
= ListBox_GetCurSel((HWND
)lParam
);
1008 if (iIndex
!= LB_ERR
&& iIndex
< pParamArray
->dwCount
)
1010 pParamArray
->pCurrentParam
= (PPARAMETER
)ListBox_GetItemData((HWND
)lParam
, iIndex
);
1011 DisplayParameter(hwnd
, pParamArray
->pCurrentParam
);
1014 else if ((LOWORD(wParam
) == IDC_PROPERTY_PRESENT
) && (HIWORD(wParam
) == BN_CLICKED
))
1016 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), TRUE
);
1017 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), TRUE
);
1018 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), TRUE
);
1019 pParamArray
->pCurrentParam
->bPresent
= TRUE
;
1021 else if ((LOWORD(wParam
) == IDC_PROPERTY_NOT_PRESENT
) && (HIWORD(wParam
) == BN_CLICKED
))
1023 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), FALSE
);
1024 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), FALSE
);
1025 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), FALSE
);
1026 pParamArray
->pCurrentParam
->bPresent
= FALSE
;
1038 PPARAMETER_ARRAY pParamArray
;
1040 TRACE("OnNotify()\n");
1042 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
1043 if (pParamArray
== NULL
)
1045 ERR("pParamArray is NULL\n");
1049 if (((LPNMHDR
)lParam
)->code
== (UINT
)PSN_APPLY
)
1051 TRACE("PSN_APPLY!\n");
1052 WriteParameterArray(hwnd
, pParamArray
);
1054 else if (((LPNMHDR
)lParam
)->code
== (UINT
)UDN_DELTAPOS
)
1056 LPNMUPDOWN pUpDown
= (LPNMUPDOWN
)lParam
;
1057 pUpDown
->iDelta
*= pParamArray
->pCurrentParam
->iStep
;
1067 PPARAMETER_ARRAY pParamArray
;
1069 TRACE("OnDestroy()\n");
1071 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
1072 if (pParamArray
== NULL
)
1074 ERR("pParamArray is NULL\n");
1078 FreeParameterArray(pParamArray
);
1079 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)NULL
);
1086 NetPropertyPageDlgProc(
1095 return OnInitDialog(hwnd
, wParam
, lParam
);
1098 OnCommand(hwnd
, wParam
, lParam
);
1102 OnNotify(hwnd
, wParam
, lParam
);
1119 NetPropPageProvider(
1120 PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
1121 LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
1124 PROPSHEETPAGEW PropSheetPage
;
1125 HPROPSHEETPAGE hPropSheetPage
;
1126 PPARAMETER_ARRAY ParameterArray
= NULL
;
1128 TRACE("NetPropPageProvider(%p %p %lx)\n",
1129 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
1131 if (!BuildParameterArray(lpPropSheetPageRequest
->DeviceInfoSet
,
1132 lpPropSheetPageRequest
->DeviceInfoData
,
1136 if (lpPropSheetPageRequest
->PageRequested
== SPPSR_ENUM_ADV_DEVICE_PROPERTIES
)
1138 TRACE("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
1140 PropSheetPage
.dwSize
= sizeof(PROPSHEETPAGEW
);
1141 PropSheetPage
.dwFlags
= 0;
1142 PropSheetPage
.hInstance
= netcfgx_hInstance
;
1143 PropSheetPage
.u
.pszTemplate
= MAKEINTRESOURCE(IDD_NET_PROPERTY_DLG
);
1144 PropSheetPage
.pfnDlgProc
= NetPropertyPageDlgProc
;
1145 PropSheetPage
.lParam
= (LPARAM
)ParameterArray
;
1146 PropSheetPage
.pfnCallback
= NULL
;
1148 hPropSheetPage
= CreatePropertySheetPageW(&PropSheetPage
);
1149 if (hPropSheetPage
== NULL
)
1151 ERR("CreatePropertySheetPageW() failed!\n");
1155 if (!(*lpfnAddPropSheetPageProc
)(hPropSheetPage
, lParam
))
1157 ERR("lpfnAddPropSheetPageProc() failed!\n");
1158 DestroyPropertySheetPage(hPropSheetPage
);