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
;
48 } PARAMETER
, *PPARAMETER
;
50 typedef struct _PARAMETER_ARRAY
52 HDEVINFO DeviceInfoSet
;
53 PSP_DEVINFO_DATA DeviceInfoData
;
54 PPARAMETER pCurrentParam
;
57 } PARAMETER_ARRAY
, *PPARAMETER_ARRAY
;
63 _In_ PPARAMETER_ARRAY ParamArray
)
67 if (ParamArray
== NULL
)
70 for (i
= 0; i
< ParamArray
->dwCount
; i
++)
72 if (ParamArray
->Array
[i
].pszName
!= NULL
)
73 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszName
);
75 if (ParamArray
->Array
[i
].pszDescription
!= NULL
)
76 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszDescription
);
78 if (ParamArray
->Array
[i
].pszDefault
!= NULL
)
79 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszDefault
);
82 if (ParamArray
->Array
[i
].pEnumOptions
!= NULL
)
84 for (j
= 0; j
< ParamArray
->Array
[i
].dwEnumOptions
; j
++)
86 if (ParamArray
->Array
[i
].pEnumOptions
[j
].pszValue
!= NULL
)
87 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pEnumOptions
[j
].pszValue
);
89 if (ParamArray
->Array
[i
].pEnumOptions
[j
].pszName
!= NULL
)
90 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pEnumOptions
[j
].pszName
);
93 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pEnumOptions
);
97 HeapFree(GetProcessHeap(), 0, ParamArray
);
104 _In_ PWSTR pValueName
,
105 _Out_ PWSTR
*pString
,
106 _Out_opt_ PDWORD pdwStringLength
)
115 RegQueryValueExW(hKey
, pValueName
, NULL
, &dwRegType
, NULL
, &dwLength
);
117 if (dwLength
== 0 || dwRegType
!= REG_SZ
)
118 return ERROR_FILE_NOT_FOUND
;
120 pBuffer
= HeapAlloc(GetProcessHeap(), 0, dwLength
+ sizeof(WCHAR
));
122 return ERROR_NOT_ENOUGH_MEMORY
;
124 dwError
= RegQueryValueExW(hKey
, pValueName
, NULL
, NULL
, (LPBYTE
)pBuffer
, &dwLength
);
125 if (dwError
!= ERROR_SUCCESS
)
127 HeapFree(GetProcessHeap(), 0, pBuffer
);
131 pBuffer
[dwLength
/ sizeof(WCHAR
)] = UNICODE_NULL
;
135 *pdwStringLength
= dwLength
;
137 return ERROR_SUCCESS
;
144 _In_ PWSTR pValueName
,
154 dwLength
= sizeof(szBuffer
);
155 RegQueryValueExW(hKey
,
162 if (dwRegType
== REG_SZ
&& dwLength
>= sizeof(WCHAR
))
164 if (szBuffer
[0] == L
'0')
170 return ERROR_SUCCESS
;
177 _In_ PWSTR pValueName
,
187 dwLength
= sizeof(szBuffer
);
188 RegQueryValueExW(hKey
,
195 if (dwRegType
== REG_SZ
&& dwLength
>= sizeof(WCHAR
))
197 *pValue
= _wtoi(szBuffer
);
200 return ERROR_SUCCESS
;
207 _In_ PWSTR pValueName
,
216 dwLength
= sizeof(szBuffer
);
217 RegQueryValueExW(hKey
,
224 if (dwRegType
== REG_SZ
&& dwLength
>= sizeof(WCHAR
))
226 *pValue
= wcstol(szBuffer
, &ptr
, 10);
227 if (*pValue
== 0 && ptr
!= NULL
)
235 return ERROR_SUCCESS
;
243 _In_ PPARAMETER pParameter
)
245 HKEY hEnumKey
= NULL
;
246 PENUM_OPTION pOptions
= NULL
;
247 DWORD dwValues
, dwMaxValueNameLen
, dwMaxValueLen
;
248 DWORD dwValueNameLength
, dwValueLength
;
252 dwError
= RegOpenKeyExW(hKey
,
257 if (dwError
!= ERROR_SUCCESS
)
260 dwError
= RegQueryInfoKeyW(hEnumKey
,
272 if (dwError
!= ERROR_SUCCESS
)
274 ERR("RegQueryInfoKeyW failed (Error %lu)\n", dwError
);
278 pOptions
= HeapAlloc(GetProcessHeap(),
280 dwValues
* sizeof(ENUM_OPTION
));
281 if (pOptions
== NULL
)
283 dwError
= ERROR_OUTOFMEMORY
;
287 for (i
= 0; i
< dwValues
; i
++)
289 dwValueNameLength
= dwMaxValueNameLen
+ sizeof(WCHAR
);
290 pOptions
[i
].pszValue
= HeapAlloc(GetProcessHeap(),
292 dwValueNameLength
* sizeof(WCHAR
));
293 if (pOptions
[i
].pszValue
== NULL
)
295 dwError
= ERROR_OUTOFMEMORY
;
299 dwValueLength
= dwMaxValueLen
;
300 pOptions
[i
].pszName
= HeapAlloc(GetProcessHeap(),
303 if (pOptions
[i
].pszName
== NULL
)
305 dwError
= ERROR_OUTOFMEMORY
;
309 dwError
= RegEnumValueW(hEnumKey
,
311 pOptions
[i
].pszValue
,
315 (PBYTE
)pOptions
[i
].pszName
,
317 if (dwError
== ERROR_NO_MORE_ITEMS
)
319 dwError
= ERROR_SUCCESS
;
322 else if (dwError
!= ERROR_SUCCESS
)
328 pParameter
->pEnumOptions
= pOptions
;
329 pParameter
->dwEnumOptions
= dwValues
;
333 if (pOptions
!= NULL
)
335 for (i
= 0; i
< dwValues
; i
++)
337 if (pOptions
[i
].pszValue
!= NULL
)
338 HeapFree(GetProcessHeap(), 0, pOptions
[i
].pszValue
);
340 if (pOptions
[i
].pszName
!= NULL
)
341 HeapFree(GetProcessHeap(), 0, pOptions
[i
].pszName
);
344 HeapFree(GetProcessHeap(), 0, pOptions
);
347 if (hEnumKey
!= NULL
)
348 RegCloseKey(hEnumKey
);
357 _In_ PPARAMETER pParameter
,
362 if ((pParameter
->pEnumOptions
== NULL
) ||
363 (pParameter
->dwEnumOptions
== 0))
366 for (i
= 0; i
< pParameter
->dwEnumOptions
; i
++)
368 if (_wcsicmp(pParameter
->pEnumOptions
[i
].pszValue
, pszValue
) == 0)
379 _In_ HDEVINFO DeviceInfoSet
,
380 _In_ PSP_DEVINFO_DATA DeviceInfoData
,
381 _Out_ PPARAMETER_ARRAY
*ParameterArray
)
383 HKEY hDriverKey
= INVALID_HANDLE_VALUE
;
384 HKEY hParamsKey
= INVALID_HANDLE_VALUE
;
386 PPARAMETER_ARRAY ParamArray
= NULL
;
387 DWORD dwSubKeys
, dwMaxSubKeyLen
, dwKeyLen
, dwIndex
;
388 PWSTR pszType
= NULL
;
390 LONG lDefaultMin
, lDefaultMax
;
393 hDriverKey
= SetupDiOpenDevRegKey(DeviceInfoSet
,
399 if (hDriverKey
== INVALID_HANDLE_VALUE
)
401 ERR("SetupDiOpenDevRegKey() failed\n");
405 lError
= RegOpenKeyExW(hDriverKey
,
410 if (lError
!= ERROR_SUCCESS
)
412 ERR("RegOpenKeyExW failed (Error %lu)\n", lError
);
416 lError
= RegQueryInfoKeyW(hParamsKey
,
428 if (lError
!= ERROR_SUCCESS
)
430 ERR("RegOpenKeyExW failed (Error %lu)\n", lError
);
434 TRACE("Sub keys: %lu\n", dwSubKeys
);
438 TRACE("No sub keys. Done!\n");
442 ParamArray
= HeapAlloc(GetProcessHeap(),
444 sizeof(PARAMETER_ARRAY
) + (dwSubKeys
* sizeof(PARAMETER
)));
445 if (ParamArray
== NULL
)
447 ERR("Parameter array allocation failed!\n");
451 ParamArray
->DeviceInfoSet
= DeviceInfoSet
;
452 ParamArray
->DeviceInfoData
= DeviceInfoData
;
453 ParamArray
->dwCount
= dwSubKeys
;
457 for (dwIndex
= 0; dwIndex
< dwSubKeys
; dwIndex
++)
459 ParamArray
->Array
[dwIndex
].pszName
= HeapAlloc(GetProcessHeap(),
461 dwMaxSubKeyLen
* sizeof(WCHAR
));
462 if (ParamArray
->Array
[dwIndex
].pszName
== NULL
)
464 ERR("Parameter array allocation failed!\n");
468 dwKeyLen
= dwMaxSubKeyLen
;
469 lError
= RegEnumKeyExW(hParamsKey
,
471 ParamArray
->Array
[dwIndex
].pszName
,
477 if (lError
!= ERROR_SUCCESS
)
480 TRACE("Sub key '%S'\n", ParamArray
->Array
[dwIndex
].pszName
);
482 lError
= RegOpenKeyExW(hParamsKey
,
483 ParamArray
->Array
[dwIndex
].pszName
,
487 if (lError
== ERROR_SUCCESS
)
489 GetStringValue(hParamKey
,
491 &ParamArray
->Array
[dwIndex
].pszDescription
,
494 GetStringValue(hParamKey
,
500 if (_wcsicmp(pszType
, L
"int") == 0)
501 ParamArray
->Array
[dwIndex
].Type
= INT_TYPE
;
502 else if (_wcsicmp(pszType
, L
"long") == 0)
503 ParamArray
->Array
[dwIndex
].Type
= LONG_TYPE
;
504 else if (_wcsicmp(pszType
, L
"word") == 0)
505 ParamArray
->Array
[dwIndex
].Type
= WORD_TYPE
;
506 else if (_wcsicmp(pszType
, L
"dword") == 0)
507 ParamArray
->Array
[dwIndex
].Type
= DWORD_TYPE
;
508 else if (_wcsicmp(pszType
, L
"edit") == 0)
509 ParamArray
->Array
[dwIndex
].Type
= EDIT_TYPE
;
510 else if (_wcsicmp(pszType
, L
"enum") == 0)
511 ParamArray
->Array
[dwIndex
].Type
= ENUM_TYPE
;
513 ParamArray
->Array
[dwIndex
].Type
= NO_TYPE
;
515 HeapFree(GetProcessHeap(), 0, pszType
);
519 GetStringValue(hParamKey
,
521 &ParamArray
->Array
[dwIndex
].pszDefault
,
524 GetBooleanValue(hParamKey
,
527 &ParamArray
->Array
[dwIndex
].bOptional
);
529 if (ParamArray
->Array
[dwIndex
].Type
== INT_TYPE
||
530 ParamArray
->Array
[dwIndex
].Type
== LONG_TYPE
||
531 ParamArray
->Array
[dwIndex
].Type
== WORD_TYPE
||
532 ParamArray
->Array
[dwIndex
].Type
== DWORD_TYPE
)
534 if (ParamArray
->Array
[dwIndex
].Type
== INT_TYPE
)
536 lDefaultMin
= -32768L; //MIN_SHORT;
537 lDefaultMax
= 32767L; //MAX_SHORT;
539 else if (ParamArray
->Array
[dwIndex
].Type
== LONG_TYPE
)
541 lDefaultMin
= (-2147483647L - 1); // MIN_LONG;
542 lDefaultMax
= 2147483647L; // MAX_LONG;
544 else if (ParamArray
->Array
[dwIndex
].Type
== WORD_TYPE
)
547 lDefaultMax
= 65535L; // MAX_WORD;
550 else if (ParamArray
->Array
[dwIndex
].Type
== DWORD_TYPE
)
553 lDefaultMax
= 4294967295; //MAX_DWORD;
557 GetLongValue(hParamKey
,
560 &ParamArray
->Array
[dwIndex
].lMin
);
562 GetLongValue(hParamKey
,
565 &ParamArray
->Array
[dwIndex
].lMax
);
567 GetIntValue(hParamKey
,
570 &ParamArray
->Array
[dwIndex
].iBase
);
572 GetIntValue(hParamKey
,
575 &ParamArray
->Array
[dwIndex
].iStep
);
577 else if (ParamArray
->Array
[dwIndex
].Type
== EDIT_TYPE
)
579 GetBooleanValue(hParamKey
,
582 &ParamArray
->Array
[dwIndex
].bUpperCase
);
584 GetIntValue(hParamKey
,
587 &ParamArray
->Array
[dwIndex
].iTextLimit
);
589 else if (ParamArray
->Array
[dwIndex
].Type
== ENUM_TYPE
)
591 GetEnumOptions(hParamKey
,
592 &ParamArray
->Array
[dwIndex
]);
595 RegCloseKey(hParamKey
);
598 lError
= GetStringValue(hDriverKey
,
599 ParamArray
->Array
[dwIndex
].pszName
,
600 &ParamArray
->Array
[dwIndex
].pszValue
,
601 &ParamArray
->Array
[dwIndex
].cchValueLength
);
602 if ((lError
== ERROR_SUCCESS
) ||
603 (ParamArray
->Array
[dwIndex
].pszDefault
!= NULL
))
605 ParamArray
->Array
[dwIndex
].bPresent
= TRUE
;
609 *ParameterArray
= ParamArray
;
613 if (ret
== FALSE
&& ParamArray
!= NULL
)
614 FreeParameterArray(ParamArray
);
616 if (hParamsKey
!= INVALID_HANDLE_VALUE
)
617 RegCloseKey(hParamsKey
);
619 if (hDriverKey
!= INVALID_HANDLE_VALUE
)
620 RegCloseKey(hDriverKey
);
634 if (pParam
->Type
== ENUM_TYPE
)
636 iIndex
= ComboBox_GetCurSel(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
));
637 if (iIndex
!= CB_ERR
&& iIndex
< pParam
->dwEnumOptions
)
639 iLength
= wcslen(pParam
->pEnumOptions
[iIndex
].pszValue
);
640 if (iLength
> pParam
->cchValueLength
)
642 if (pParam
->pszValue
!= NULL
)
643 HeapFree(GetProcessHeap(), 0, pParam
->pszValue
);
645 pParam
->pszValue
= HeapAlloc(GetProcessHeap(), 0, (iLength
+ 1) * sizeof(WCHAR
));
648 if (pParam
->pszValue
!= NULL
)
650 wcscpy(pParam
->pszValue
,
651 pParam
->pEnumOptions
[iIndex
].pszValue
);
652 pParam
->cchValueLength
= iLength
;
658 iLength
= Edit_GetTextLength(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
));
659 if (iLength
> pParam
->cchValueLength
)
661 if (pParam
->pszValue
!= NULL
)
662 HeapFree(GetProcessHeap(), 0, pParam
->pszValue
);
664 pParam
->pszValue
= HeapAlloc(GetProcessHeap(), 0, (iLength
+ 1) * sizeof(WCHAR
));
667 if (pParam
->pszValue
!= NULL
)
669 Edit_GetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
),
672 pParam
->cchValueLength
= iLength
;
682 _In_ PPARAMETER_ARRAY ParamArray
)
688 if (ParamArray
== NULL
)
691 hDriverKey
= SetupDiOpenDevRegKey(ParamArray
->DeviceInfoSet
,
692 ParamArray
->DeviceInfoData
,
697 if (hDriverKey
== INVALID_HANDLE_VALUE
)
699 ERR("SetupDiOpenDevRegKey() failed\n");
703 for (i
= 0; i
< ParamArray
->dwCount
; i
++)
705 Param
= &ParamArray
->Array
[i
];
707 if (Param
== ParamArray
->pCurrentParam
)
709 ReadParameterValue(hwnd
, Param
);
714 TRACE("Set '%S' --> '%S'\n", Param
->pszName
, Param
->pszValue
);
715 RegSetValueExW(hDriverKey
,
719 (LPBYTE
)Param
->pszValue
,
720 (wcslen(Param
->pszValue
) + 1) * sizeof(WCHAR
));
724 TRACE("Delete '%S'\n", Param
->pszName
);
725 RegDeleteValueW(hDriverKey
,
730 RegCloseKey(hDriverKey
);
738 _In_ PPARAMETER Parameter
)
745 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_PRESENT
), (Parameter
->bOptional
) ? SW_SHOW
: SW_HIDE
);
746 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_NOT_PRESENT
), (Parameter
->bOptional
) ? SW_SHOW
: SW_HIDE
);
747 if (Parameter
->bOptional
)
749 if (Parameter
->bPresent
)
750 Button_SetCheck(GetDlgItem(hwnd
, IDC_PROPERTY_PRESENT
), BST_CHECKED
);
752 Button_SetCheck(GetDlgItem(hwnd
, IDC_PROPERTY_NOT_PRESENT
), BST_CHECKED
);
755 switch (Parameter
->Type
)
761 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), SW_HIDE
);
763 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
);
765 if (Parameter
->Type
!= DWORD_TYPE
)
767 EnableWindow(hwndControl
, Parameter
->bPresent
);
768 ShowWindow(hwndControl
, SW_SHOW
);
771 if (Parameter
->Type
== WORD_TYPE
|| Parameter
->Type
== DWORD_TYPE
)
772 SendMessage(hwndControl
, UDM_SETBASE
, Parameter
->iBase
, 0);
774 SendMessage(hwndControl
, UDM_SETBASE
, 10, 0);
776 if (Parameter
->Type
!= DWORD_TYPE
)
778 TRACE("SetMin %ld SetMax %ld\n", Parameter
->lMin
, Parameter
->lMax
);
779 SendMessage(hwndControl
, UDM_SETRANGE32
, Parameter
->lMin
, Parameter
->lMax
);
782 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
);
783 EnableWindow(hwndControl
, Parameter
->bPresent
);
784 ShowWindow(hwndControl
, SW_SHOW
);
786 Style
= GetWindowLongPtr(hwndControl
, GWL_STYLE
);
788 SetWindowLongPtr(hwndControl
, GWL_STYLE
, Style
);
790 Edit_LimitText(hwndControl
, 0);
792 if (Parameter
->pszValue
)
793 Edit_SetText(hwndControl
, Parameter
->pszValue
);
794 else if (Parameter
->pszDefault
)
795 Edit_SetText(hwndControl
, Parameter
->pszDefault
);
799 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), SW_HIDE
);
800 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), SW_HIDE
);
802 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
);
803 EnableWindow(hwndControl
, Parameter
->bPresent
);
804 ShowWindow(hwndControl
, SW_SHOW
);
806 Style
= GetWindowLongPtr(hwndControl
, GWL_STYLE
);
808 if (Parameter
->bUpperCase
)
809 Style
|= ES_UPPERCASE
;
811 Style
&= ~ES_UPPERCASE
;
812 SetWindowLongPtr(hwndControl
, GWL_STYLE
, Style
);
814 Edit_LimitText(hwndControl
, Parameter
->iTextLimit
);
816 if (Parameter
->pszValue
)
817 Edit_SetText(hwndControl
, Parameter
->pszValue
);
818 else if (Parameter
->pszDefault
)
819 Edit_SetText(hwndControl
, Parameter
->pszDefault
);
823 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), SW_HIDE
);
824 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), SW_HIDE
);
826 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
);
827 EnableWindow(hwndControl
, Parameter
->bPresent
);
828 ShowWindow(hwndControl
, SW_SHOW
);
830 ComboBox_ResetContent(hwndControl
);
832 if (Parameter
->pEnumOptions
!= NULL
&& Parameter
->dwEnumOptions
!= 0)
834 for (i
= 0; i
< Parameter
->dwEnumOptions
; i
++)
836 ComboBox_AddString(hwndControl
, Parameter
->pEnumOptions
[i
].pszName
);
840 if (Parameter
->pszValue
)
842 idx
= FindEnumOption(Parameter
, Parameter
->pszValue
);
844 ComboBox_SetCurSel(hwndControl
, idx
);
846 else if (Parameter
->pszDefault
)
848 idx
= FindEnumOption(Parameter
, Parameter
->pszDefault
);
850 ComboBox_SetCurSel(hwndControl
, idx
);
867 PPARAMETER_ARRAY pParamArray
;
873 TRACE("OnInitDialog()\n");
875 pParamArray
= (PPARAMETER_ARRAY
)((LPPROPSHEETPAGEW
)lParam
)->lParam
;
876 if (pParamArray
== NULL
)
878 ERR("pParamArray is NULL\n");
882 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)pParamArray
);
884 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_NAME
);
887 for (i
= 0; i
< pParamArray
->dwCount
; i
++)
889 if (pParamArray
->Array
[i
].pszDescription
!= NULL
)
890 pszText
= pParamArray
->Array
[i
].pszDescription
;
892 pszText
= pParamArray
->Array
[i
].pszName
;
894 idx
= ListBox_AddString(hwndControl
, pszText
);
896 ListBox_SetItemData(hwndControl
, idx
, (LPARAM
)&pParamArray
->Array
[i
]);
899 if (pParamArray
->dwCount
> 0)
901 ListBox_SetCurSel(hwndControl
, 0);
902 pParamArray
->pCurrentParam
= (PPARAMETER
)ListBox_GetItemData(hwndControl
, 0);
903 DisplayParameter(hwnd
, pParamArray
->pCurrentParam
);
918 PPARAMETER_ARRAY pParamArray
;
921 TRACE("OnCommand()\n");
923 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
924 if (pParamArray
== NULL
)
926 ERR("pParamArray is NULL\n");
930 if ((LOWORD(wParam
) == IDC_PROPERTY_NAME
) && (HIWORD(wParam
) == LBN_SELCHANGE
))
932 if (pParamArray
->pCurrentParam
!= NULL
)
934 ReadParameterValue(hwnd
, pParamArray
->pCurrentParam
);
937 iIndex
= ListBox_GetCurSel((HWND
)lParam
);
938 if (iIndex
!= LB_ERR
&& iIndex
< pParamArray
->dwCount
)
940 pParamArray
->pCurrentParam
= (PPARAMETER
)ListBox_GetItemData((HWND
)lParam
, iIndex
);
941 DisplayParameter(hwnd
, pParamArray
->pCurrentParam
);
944 else if ((LOWORD(wParam
) == IDC_PROPERTY_PRESENT
) && (HIWORD(wParam
) == BN_CLICKED
))
946 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), TRUE
);
947 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), TRUE
);
948 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), TRUE
);
949 pParamArray
->pCurrentParam
->bPresent
= TRUE
;
951 else if ((LOWORD(wParam
) == IDC_PROPERTY_NOT_PRESENT
) && (HIWORD(wParam
) == BN_CLICKED
))
953 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), FALSE
);
954 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), FALSE
);
955 EnableWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), FALSE
);
956 pParamArray
->pCurrentParam
->bPresent
= FALSE
;
968 PPARAMETER_ARRAY pParamArray
;
970 TRACE("OnNotify()\n");
972 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
973 if (pParamArray
== NULL
)
975 ERR("pParamArray is NULL\n");
979 if (((LPNMHDR
)lParam
)->code
== (UINT
)PSN_APPLY
)
981 TRACE("PSN_APPLY!\n");
982 WriteParameterArray(hwnd
, pParamArray
);
984 else if (((LPNMHDR
)lParam
)->code
== (UINT
)UDN_DELTAPOS
)
986 LPNMUPDOWN pUpDown
= (LPNMUPDOWN
)lParam
;
987 pUpDown
->iDelta
*= pParamArray
->pCurrentParam
->iStep
;
997 PPARAMETER_ARRAY pParamArray
;
999 TRACE("OnDestroy()\n");
1001 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
1002 if (pParamArray
== NULL
)
1004 ERR("pParamArray is NULL\n");
1008 FreeParameterArray(pParamArray
);
1009 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)NULL
);
1016 NetPropertyPageDlgProc(
1025 return OnInitDialog(hwnd
, wParam
, lParam
);
1028 OnCommand(hwnd
, wParam
, lParam
);
1032 OnNotify(hwnd
, wParam
, lParam
);
1049 NetPropPageProvider(
1050 PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
1051 LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
1054 PROPSHEETPAGEW PropSheetPage
;
1055 HPROPSHEETPAGE hPropSheetPage
;
1056 PPARAMETER_ARRAY ParameterArray
= NULL
;
1058 TRACE("NetPropPageProvider(%p %p %lx)\n",
1059 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
1061 if (!BuildParameterArray(lpPropSheetPageRequest
->DeviceInfoSet
,
1062 lpPropSheetPageRequest
->DeviceInfoData
,
1066 if (lpPropSheetPageRequest
->PageRequested
== SPPSR_ENUM_ADV_DEVICE_PROPERTIES
)
1068 TRACE("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
1070 PropSheetPage
.dwSize
= sizeof(PROPSHEETPAGEW
);
1071 PropSheetPage
.dwFlags
= 0;
1072 PropSheetPage
.hInstance
= netcfgx_hInstance
;
1073 PropSheetPage
.u
.pszTemplate
= MAKEINTRESOURCE(IDD_NET_PROPERTY_DLG
);
1074 PropSheetPage
.pfnDlgProc
= NetPropertyPageDlgProc
;
1075 PropSheetPage
.lParam
= (LPARAM
)ParameterArray
;
1076 PropSheetPage
.pfnCallback
= NULL
;
1078 hPropSheetPage
= CreatePropertySheetPageW(&PropSheetPage
);
1079 if (hPropSheetPage
== NULL
)
1081 ERR("CreatePropertySheetPageW() failed!\n");
1085 if (!(*lpfnAddPropSheetPageProc
)(hPropSheetPage
, lParam
))
1087 ERR("lpfnAddPropSheetPageProc() failed!\n");
1088 DestroyPropertySheetPage(hPropSheetPage
);