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 _PARAMETER
32 } PARAMETER
, *PPARAMETER
;
34 typedef struct _PARAMETER_ARRAY
38 } PARAMETER_ARRAY
, *PPARAMETER_ARRAY
;
44 _In_ PPARAMETER_ARRAY ParamArray
)
48 if (ParamArray
== NULL
)
51 for (i
= 0; i
< ParamArray
->dwCount
; i
++)
53 if (ParamArray
->Array
[i
].pszName
!= NULL
)
54 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszName
);
56 if (ParamArray
->Array
[i
].pszDescription
!= NULL
)
57 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszDescription
);
59 if (ParamArray
->Array
[i
].pszDefault
!= NULL
)
60 HeapFree(GetProcessHeap(), 0, ParamArray
->Array
[i
].pszDefault
);
64 HeapFree(GetProcessHeap(), 0, ParamArray
);
71 IN LPWSTR lpValueName
,
81 RegQueryValueExW(hKey
, lpValueName
, NULL
, &dwRegType
, NULL
, &dwLength
);
83 if (dwLength
== 0 || dwRegType
!= REG_SZ
)
84 return ERROR_FILE_NOT_FOUND
;
86 lpBuffer
= HeapAlloc(GetProcessHeap(), 0, dwLength
+ sizeof(WCHAR
));
88 return ERROR_NOT_ENOUGH_MEMORY
;
90 rc
= RegQueryValueExW(hKey
, lpValueName
, NULL
, NULL
, (LPBYTE
)lpBuffer
, &dwLength
);
91 if (rc
!= ERROR_SUCCESS
)
93 HeapFree(GetProcessHeap(), 0, lpBuffer
);
97 lpBuffer
[dwLength
/ sizeof(WCHAR
)] = UNICODE_NULL
;
101 return ERROR_SUCCESS
;
108 _In_ HDEVINFO DeviceInfoSet
,
109 _In_ PSP_DEVINFO_DATA DeviceInfoData
,
110 _Out_ PPARAMETER_ARRAY
*ParameterArray
)
112 HKEY hDriverKey
= INVALID_HANDLE_VALUE
;
113 HKEY hParamsKey
= INVALID_HANDLE_VALUE
;
115 PPARAMETER_ARRAY ParamArray
= NULL
;
116 DWORD dwSubKeys
, dwMaxSubKeyLen
, dwKeyLen
, dwIndex
;
117 PWSTR pszType
= NULL
;
121 hDriverKey
= SetupDiOpenDevRegKey(DeviceInfoSet
,
127 if (hDriverKey
== INVALID_HANDLE_VALUE
)
129 ERR("SetupDiOpenDevRegKey() failed\n");
133 lError
= RegOpenKeyExW(hDriverKey
,
138 if (lError
!= ERROR_SUCCESS
)
140 ERR("RegOpenKeyExW failed (Error %lu)\n", lError
);
144 lError
= RegQueryInfoKeyW(hParamsKey
,
156 if (lError
!= ERROR_SUCCESS
)
158 ERR("RegOpenKeyExW failed (Error %lu)\n", lError
);
162 FIXME("Sub keys: %lu\n", dwSubKeys
);
166 TRACE("No sub keys. Done!\n");
170 ParamArray
= HeapAlloc(GetProcessHeap(),
172 sizeof(PARAMETER_ARRAY
) + (dwSubKeys
* sizeof(PARAMETER
)));
173 if (ParamArray
== NULL
)
175 ERR("Parameter array allocation failed!\n");
179 ParamArray
->dwCount
= dwSubKeys
;
183 for (dwIndex
= 0; dwIndex
< dwSubKeys
; dwIndex
++)
185 ParamArray
->Array
[dwIndex
].pszName
= HeapAlloc(GetProcessHeap(),
187 dwMaxSubKeyLen
* sizeof(WCHAR
));
188 if (ParamArray
->Array
[dwIndex
].pszName
== NULL
)
190 ERR("Parameter array allocation failed!\n");
194 dwKeyLen
= dwMaxSubKeyLen
;
195 lError
= RegEnumKeyExW(hParamsKey
,
197 ParamArray
->Array
[dwIndex
].pszName
,
203 if (lError
!= ERROR_SUCCESS
)
206 FIXME("Sub key '%S'\n", ParamArray
->Array
[dwIndex
].pszName
);
208 lError
= RegOpenKeyExW(hParamsKey
,
209 ParamArray
->Array
[dwIndex
].pszName
,
213 if (lError
== ERROR_SUCCESS
)
215 GetValueString(hParamKey
,
217 &ParamArray
->Array
[dwIndex
].pszDescription
);
219 GetValueString(hParamKey
,
224 if (_wcsicmp(pszType
, L
"int") == 0)
225 ParamArray
->Array
[dwIndex
].Type
= INT_TYPE
;
226 else if (_wcsicmp(pszType
, L
"long") == 0)
227 ParamArray
->Array
[dwIndex
].Type
= LONG_TYPE
;
228 else if (_wcsicmp(pszType
, L
"word") == 0)
229 ParamArray
->Array
[dwIndex
].Type
= WORD_TYPE
;
230 else if (_wcsicmp(pszType
, L
"dword") == 0)
231 ParamArray
->Array
[dwIndex
].Type
= DWORD_TYPE
;
232 else if (_wcsicmp(pszType
, L
"edit") == 0)
233 ParamArray
->Array
[dwIndex
].Type
= EDIT_TYPE
;
234 else if (_wcsicmp(pszType
, L
"enum") == 0)
235 ParamArray
->Array
[dwIndex
].Type
= ENUM_TYPE
;
237 ParamArray
->Array
[dwIndex
].Type
= NO_TYPE
;
239 HeapFree(GetProcessHeap(), 0, pszType
);
243 GetValueString(hParamKey
,
245 &ParamArray
->Array
[dwIndex
].pszDefault
);
247 ParamArray
->Array
[dwIndex
].bUpperCase
= FALSE
;
248 ParamArray
->Array
[dwIndex
].bOptional
= FALSE
;
249 ParamArray
->Array
[dwIndex
].iLimitText
= 0;
251 RegCloseKey(hParamKey
);
254 GetValueString(hDriverKey
,
255 ParamArray
->Array
[dwIndex
].pszName
,
256 &ParamArray
->Array
[dwIndex
].pszValue
);
259 *ParameterArray
= ParamArray
;
263 if (ret
== FALSE
&& ParamArray
!= NULL
)
264 FreeParameterArray(ParamArray
);
266 if (hParamsKey
!= INVALID_HANDLE_VALUE
)
267 RegCloseKey(hParamsKey
);
269 if (hDriverKey
!= INVALID_HANDLE_VALUE
)
270 RegCloseKey(hDriverKey
);
280 PPARAMETER Parameter
)
284 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_PRESENT
), (Parameter
->bOptional
) ? SW_SHOW
: SW_HIDE
);
285 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_NOT_PRESENT
), (Parameter
->bOptional
) ? SW_SHOW
: SW_HIDE
);
287 switch (Parameter
->Type
)
293 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), SW_SHOW
);
294 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), SW_SHOW
);
295 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), SW_HIDE
);
297 Style
= GetWindowLongPtr(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), GWL_STYLE
);
299 SetWindowLongPtr(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), GWL_STYLE
, Style
);
301 Edit_LimitText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), 0);
303 if (Parameter
->pszValue
)
304 Edit_SetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), Parameter
->pszValue
);
305 else if (Parameter
->pszDefault
)
306 Edit_SetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), Parameter
->pszDefault
);
310 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), SW_SHOW
);
311 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), SW_HIDE
);
312 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), SW_HIDE
);
314 Style
= GetWindowLongPtr(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), GWL_STYLE
);
316 if (Parameter
->bUpperCase
)
317 Style
|= ES_UPPERCASE
;
319 Style
&= ~ES_UPPERCASE
;
320 SetWindowLongPtr(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), GWL_STYLE
, Style
);
322 Edit_LimitText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), Parameter
->iLimitText
);
324 if (Parameter
->pszValue
)
325 Edit_SetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), Parameter
->pszValue
);
326 else if (Parameter
->pszDefault
)
327 Edit_SetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), Parameter
->pszDefault
);
331 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), SW_HIDE
);
332 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_UPDN
), SW_HIDE
);
333 ShowWindow(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_LIST
), SW_SHOW
);
335 if (Parameter
->pszValue
)
336 Edit_SetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), Parameter
->pszValue
);
337 else if (Parameter
->pszDefault
)
338 Edit_SetText(GetDlgItem(hwnd
, IDC_PROPERTY_VALUE_EDIT
), Parameter
->pszDefault
);
354 PPARAMETER_ARRAY pParamArray
;
359 FIXME("OnInitDialog()\n");
361 pParamArray
= (PPARAMETER_ARRAY
)((LPPROPSHEETPAGEW
)lParam
)->lParam
;
362 if (pParamArray
== NULL
)
364 ERR("pParamArray is NULL\n");
368 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)pParamArray
);
370 hwndControl
= GetDlgItem(hwnd
, IDC_PROPERTY_NAME
);
373 for (i
= 0; i
< pParamArray
->dwCount
; i
++)
375 if (pParamArray
->Array
[i
].pszDescription
!= NULL
)
376 pszText
= pParamArray
->Array
[i
].pszDescription
;
378 pszText
= pParamArray
->Array
[i
].pszName
;
380 ListBox_AddString(hwndControl
, pszText
);
383 if (pParamArray
->dwCount
> 0)
385 ListBox_SetCurSel(hwndControl
, 0);
386 DisplayParameter(hwnd
, &pParamArray
->Array
[0]);
401 PPARAMETER_ARRAY pParamArray
;
404 TRACE("OnCommand()\n");
406 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
407 if (pParamArray
== NULL
)
409 ERR("pParamArray is NULL\n");
413 if ((LOWORD(wParam
) == IDC_PROPERTY_NAME
) && (HIWORD(wParam
) == LBN_SELCHANGE
))
415 iIndex
= ListBox_GetCurSel((HWND
)lParam
);
416 if (iIndex
!= LB_ERR
&& iIndex
< pParamArray
->dwCount
)
418 DisplayParameter(hwnd
, &pParamArray
->Array
[iIndex
]);
429 PPARAMETER_ARRAY pParamArray
;
431 FIXME("OnDestroy()\n");
433 pParamArray
= (PPARAMETER_ARRAY
)GetWindowLongPtr(hwnd
, DWLP_USER
);
434 if (pParamArray
== NULL
)
436 ERR("pParamArray is NULL\n");
440 FreeParameterArray(pParamArray
);
441 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)NULL
);
448 NetPropertyPageDlgProc(
457 return OnInitDialog(hwnd
, wParam
, lParam
);
460 OnCommand(hwnd
, wParam
, lParam
);
478 PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
479 LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
482 PROPSHEETPAGEW PropSheetPage
;
483 HPROPSHEETPAGE hPropSheetPage
;
484 PPARAMETER_ARRAY ParameterArray
= NULL
;
486 ERR("NetPropPageProvider(%p %p %lx)\n",
487 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
489 if (!BuildParameterArray(lpPropSheetPageRequest
->DeviceInfoSet
,
490 lpPropSheetPageRequest
->DeviceInfoData
,
494 if (lpPropSheetPageRequest
->PageRequested
== SPPSR_ENUM_ADV_DEVICE_PROPERTIES
)
496 ERR("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
498 PropSheetPage
.dwSize
= sizeof(PROPSHEETPAGEW
);
499 PropSheetPage
.dwFlags
= 0;
500 PropSheetPage
.hInstance
= netcfgx_hInstance
;
501 PropSheetPage
.u
.pszTemplate
= MAKEINTRESOURCE(IDD_NET_PROPERTY_DLG
);
502 PropSheetPage
.pfnDlgProc
= NetPropertyPageDlgProc
;
503 PropSheetPage
.lParam
= (LPARAM
)ParameterArray
;
504 PropSheetPage
.pfnCallback
= NULL
;
506 hPropSheetPage
= CreatePropertySheetPageW(&PropSheetPage
);
507 if (hPropSheetPage
== NULL
)
509 ERR("CreatePropertySheetPageW() failed!\n");
513 if (!(*lpfnAddPropSheetPageProc
)(hPropSheetPage
, lParam
))
515 ERR("lpfnAddPropSheetPageProc() failed!\n");
516 DestroyPropertySheetPage(hPropSheetPage
);