ReactOS 0.4.15-dev-7842-g558ab78
propertypage.c
Go to the documentation of this file.
1/*
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)
6 */
7
8#include "precomp.h"
9
10typedef enum _PARAM_TYPE
11{
20
21typedef struct _ENUM_OPTION
22{
26
27typedef struct _PARAMETER
28{
37
40
43
46
47 union
48 {
49 struct
50 {
53 } l;
54 struct
55 {
58 } dw;
59 } u;
61
62typedef struct _PARAMETER_ARRAY
63{
70
71
72static
73VOID
75 _In_ PPARAMETER_ARRAY ParamArray)
76{
77 INT i, j;
78
79 if (ParamArray == NULL)
80 return;
81
82 for (i = 0; i < ParamArray->dwCount; i++)
83 {
84 if (ParamArray->Array[i].pszName != NULL)
85 HeapFree(GetProcessHeap(), 0, ParamArray->Array[i].pszName);
86
87 if (ParamArray->Array[i].pszDescription != NULL)
88 HeapFree(GetProcessHeap(), 0, ParamArray->Array[i].pszDescription);
89
90 if (ParamArray->Array[i].pszDefault != NULL)
91 HeapFree(GetProcessHeap(), 0, ParamArray->Array[i].pszDefault);
92
93
94 if (ParamArray->Array[i].pEnumOptions != NULL)
95 {
96 for (j = 0; j < ParamArray->Array[i].dwEnumOptions; j++)
97 {
98 if (ParamArray->Array[i].pEnumOptions[j].pszValue != NULL)
99 HeapFree(GetProcessHeap(), 0, ParamArray->Array[i].pEnumOptions[j].pszValue);
100
101 if (ParamArray->Array[i].pEnumOptions[j].pszName != NULL)
102 HeapFree(GetProcessHeap(), 0, ParamArray->Array[i].pEnumOptions[j].pszName);
103 }
104
105 HeapFree(GetProcessHeap(), 0, ParamArray->Array[i].pEnumOptions);
106 }
107 }
108
109 HeapFree(GetProcessHeap(), 0, ParamArray);
110}
111
112
113static DWORD
115 _In_ HKEY hKey,
116 _In_ PWSTR pValueName,
118 _Out_opt_ PDWORD pdwStringLength)
119{
121 DWORD dwLength = 0;
122 DWORD dwRegType;
123 DWORD dwError;
124
125 *pString = NULL;
126
127 RegQueryValueExW(hKey, pValueName, NULL, &dwRegType, NULL, &dwLength);
128
129 if (dwLength == 0 || dwRegType != REG_SZ)
131
132 pBuffer = HeapAlloc(GetProcessHeap(), 0, dwLength + sizeof(WCHAR));
133 if (pBuffer == NULL)
135
136 dwError = RegQueryValueExW(hKey, pValueName, NULL, NULL, (LPBYTE)pBuffer, &dwLength);
137 if (dwError != ERROR_SUCCESS)
138 {
140 return dwError;
141 }
142
143 pBuffer[dwLength / sizeof(WCHAR)] = UNICODE_NULL;
144
145 *pString = pBuffer;
146 if (pdwStringLength)
147 *pdwStringLength = dwLength;
148
149 return ERROR_SUCCESS;
150}
151
152
153static DWORD
155 _In_ HKEY hKey,
156 _In_ PWSTR pValueName,
157 _In_ BOOL bDefault,
159{
160 WCHAR szBuffer[16];
161 DWORD dwLength = 0;
162 DWORD dwRegType;
163
164 *pValue = bDefault;
165
166 dwLength = sizeof(szBuffer);
168 pValueName,
169 NULL,
170 &dwRegType,
171 (LPBYTE)szBuffer,
172 &dwLength);
173
174 if (dwRegType == REG_SZ && dwLength >= sizeof(WCHAR))
175 {
176 if (szBuffer[0] == L'0')
177 *pValue = FALSE;
178 else
179 *pValue = TRUE;
180 }
181
182 return ERROR_SUCCESS;
183}
184
185
186static DWORD
188 _In_ HKEY hKey,
189 _In_ PWSTR pValueName,
190 _In_ INT iDefault,
192{
193 WCHAR szBuffer[24];
194 DWORD dwLength = 0;
195 DWORD dwRegType;
196
197 *pValue = iDefault;
198
199 dwLength = sizeof(szBuffer);
201 pValueName,
202 NULL,
203 &dwRegType,
204 (LPBYTE)szBuffer,
205 &dwLength);
206
207 if (dwRegType == REG_SZ && dwLength >= sizeof(WCHAR))
208 {
209 *pValue = _wtoi(szBuffer);
210 }
211
212 return ERROR_SUCCESS;
213}
214
215
216static DWORD
218 _In_ HKEY hKey,
219 _In_ PWSTR pValueName,
220 _In_ LONG lDefault,
222{
223 WCHAR szBuffer[24];
224 DWORD dwLength = 0;
225 DWORD dwRegType;
226 PWSTR ptr = NULL;
227
228 dwLength = sizeof(szBuffer);
230 pValueName,
231 NULL,
232 &dwRegType,
233 (LPBYTE)szBuffer,
234 &dwLength);
235
236 if (dwRegType == REG_SZ && dwLength >= sizeof(WCHAR))
237 {
238 *pValue = wcstol(szBuffer, &ptr, 10);
239 if (*pValue == 0 && ptr != NULL)
240 *pValue = lDefault;
241 }
242 else
243 {
244 *pValue = lDefault;
245 }
246
247 return ERROR_SUCCESS;
248}
249
250
251static DWORD
253 _In_ HKEY hKey,
254 _In_ PWSTR pValueName,
255 _In_ DWORD dwDefault,
257{
258 WCHAR szBuffer[24];
259 DWORD dwLength = 0;
260 DWORD dwRegType;
261 PWSTR ptr = NULL;
262
263 dwLength = sizeof(szBuffer);
265 pValueName,
266 NULL,
267 &dwRegType,
268 (LPBYTE)szBuffer,
269 &dwLength);
270
271 if (dwRegType == REG_SZ && dwLength >= sizeof(WCHAR))
272 {
273 *pValue = wcstoul(szBuffer, &ptr, 10);
274 if (*pValue == 0 && ptr != NULL)
275 *pValue = dwDefault;
276 }
277 else
278 {
279 *pValue = dwDefault;
280 }
281
282 return ERROR_SUCCESS;
283}
284
285
286static
287DWORD
289 _In_ HKEY hKey,
290 _In_ PPARAMETER pParameter)
291{
293 PENUM_OPTION pOptions = NULL;
294 DWORD dwValues, dwMaxValueNameLen, dwMaxValueLen;
295 DWORD dwValueNameLength, dwValueLength;
296 DWORD i;
297 DWORD dwError;
298
299 dwError = RegOpenKeyExW(hKey,
300 L"enum",
301 0,
302 KEY_READ,
303 &hEnumKey);
304 if (dwError != ERROR_SUCCESS)
305 return dwError;
306
307 dwError = RegQueryInfoKeyW(hEnumKey,
308 NULL,
309 NULL,
310 NULL,
311 NULL,
312 NULL,
313 NULL,
314 &dwValues,
315 &dwMaxValueNameLen,
316 &dwMaxValueLen,
317 NULL,
318 NULL);
319 if (dwError != ERROR_SUCCESS)
320 {
321 ERR("RegQueryInfoKeyW failed (Error %lu)\n", dwError);
322 goto done;
323 }
324
325 pOptions = HeapAlloc(GetProcessHeap(),
327 dwValues * sizeof(ENUM_OPTION));
328 if (pOptions == NULL)
329 {
330 dwError = ERROR_OUTOFMEMORY;
331 goto done;
332 }
333
334 for (i = 0; i < dwValues; i++)
335 {
336 dwValueNameLength = dwMaxValueNameLen + sizeof(WCHAR);
337 pOptions[i].pszValue = HeapAlloc(GetProcessHeap(),
338 0,
339 dwValueNameLength * sizeof(WCHAR));
340 if (pOptions[i].pszValue == NULL)
341 {
342 dwError = ERROR_OUTOFMEMORY;
343 goto done;
344 }
345
346 dwValueLength = dwMaxValueLen;
347 pOptions[i].pszName = HeapAlloc(GetProcessHeap(),
348 0,
349 dwValueLength);
350 if (pOptions[i].pszName == NULL)
351 {
352 dwError = ERROR_OUTOFMEMORY;
353 goto done;
354 }
355
356 dwError = RegEnumValueW(hEnumKey,
357 i,
358 pOptions[i].pszValue,
359 &dwValueNameLength,
360 NULL,
361 NULL,
362 (PBYTE)pOptions[i].pszName,
363 &dwValueLength);
364 if (dwError == ERROR_NO_MORE_ITEMS)
365 {
366 dwError = ERROR_SUCCESS;
367 goto done;
368 }
369 else if (dwError != ERROR_SUCCESS)
370 {
371 goto done;
372 }
373 }
374
375 pParameter->pEnumOptions = pOptions;
376 pParameter->dwEnumOptions = dwValues;
377 pOptions = NULL;
378
379done:
380 if (pOptions != NULL)
381 {
382 for (i = 0; i < dwValues; i++)
383 {
384 if (pOptions[i].pszValue != NULL)
385 HeapFree(GetProcessHeap(), 0, pOptions[i].pszValue);
386
387 if (pOptions[i].pszName != NULL)
388 HeapFree(GetProcessHeap(), 0, pOptions[i].pszName);
389 }
390
391 HeapFree(GetProcessHeap(), 0, pOptions);
392 }
393
394 if (hEnumKey != NULL)
396
397 return dwError;
398}
399
400
401static
402INT
404 _In_ PPARAMETER pParameter,
405 _In_ PWSTR pszValue)
406{
407 INT i;
408
409 if ((pParameter->pEnumOptions == NULL) ||
410 (pParameter->dwEnumOptions == 0))
411 return -1;
412
413 for (i = 0; i < pParameter->dwEnumOptions; i++)
414 {
415 if (_wcsicmp(pParameter->pEnumOptions[i].pszValue, pszValue) == 0)
416 return i;
417 }
418
419 return -1;
420}
421
422
423static
424BOOL
428 _Out_ PPARAMETER_ARRAY *ParameterArray)
429{
430 HKEY hDriverKey = INVALID_HANDLE_VALUE;
431 HKEY hParamsKey = INVALID_HANDLE_VALUE;
432 HKEY hParamKey;
433 PPARAMETER_ARRAY ParamArray = NULL;
434 DWORD dwSubKeys, dwMaxSubKeyLen, dwKeyLen, dwIndex;
435 PWSTR pszType = NULL;
436 LONG lError;
437 LONG lDefaultMin, lDefaultMax;
438 DWORD dwDefaultMin, dwDefaultMax;
439 BOOL ret = FALSE;
440
444 0,
445 DIREG_DRV,
446 KEY_READ);
447 if (hDriverKey == INVALID_HANDLE_VALUE)
448 {
449 ERR("SetupDiOpenDevRegKey() failed\n");
450 return FALSE;
451 }
452
453 lError = RegOpenKeyExW(hDriverKey,
454 L"Ndi\\Params",
455 0,
456 KEY_READ,
457 &hParamsKey);
458 if (lError != ERROR_SUCCESS)
459 {
460 ERR("RegOpenKeyExW failed (Error %lu)\n", lError);
461 goto done;
462 }
463
464 lError = RegQueryInfoKeyW(hParamsKey,
465 NULL,
466 NULL,
467 NULL,
468 &dwSubKeys,
469 &dwMaxSubKeyLen,
470 NULL,
471 NULL,
472 NULL,
473 NULL,
474 NULL,
475 NULL);
476 if (lError != ERROR_SUCCESS)
477 {
478 ERR("RegOpenKeyExW failed (Error %lu)\n", lError);
479 goto done;
480 }
481
482 TRACE("Sub keys: %lu\n", dwSubKeys);
483
484 if (dwSubKeys == 0)
485 {
486 TRACE("No sub keys. Done!\n");
487 goto done;
488 }
489
490 ParamArray = HeapAlloc(GetProcessHeap(),
492 sizeof(PARAMETER_ARRAY) + (dwSubKeys * sizeof(PARAMETER)));
493 if (ParamArray == NULL)
494 {
495 ERR("Parameter array allocation failed!\n");
496 goto done;
497 }
498
499 ParamArray->DeviceInfoSet = DeviceInfoSet;
500 ParamArray->DeviceInfoData = DeviceInfoData;
501 ParamArray->dwCount = dwSubKeys;
502
503 dwMaxSubKeyLen++;
504
505 for (dwIndex = 0; dwIndex < dwSubKeys; dwIndex++)
506 {
507 ParamArray->Array[dwIndex].pszName = HeapAlloc(GetProcessHeap(),
508 0,
509 dwMaxSubKeyLen * sizeof(WCHAR));
510 if (ParamArray->Array[dwIndex].pszName == NULL)
511 {
512 ERR("Parameter array allocation failed!\n");
513 goto done;
514 }
515
516 dwKeyLen = dwMaxSubKeyLen;
517 lError = RegEnumKeyExW(hParamsKey,
518 dwIndex,
519 ParamArray->Array[dwIndex].pszName,
520 &dwKeyLen,
521 NULL,
522 NULL,
523 NULL,
524 NULL);
525 if (lError != ERROR_SUCCESS)
526 break;
527
528 TRACE("Sub key '%S'\n", ParamArray->Array[dwIndex].pszName);
529
530 lError = RegOpenKeyExW(hParamsKey,
531 ParamArray->Array[dwIndex].pszName,
532 0,
533 KEY_READ,
534 &hParamKey);
535 if (lError == ERROR_SUCCESS)
536 {
537 GetStringValue(hParamKey,
538 L"ParamDesc",
539 &ParamArray->Array[dwIndex].pszDescription,
540 NULL);
541
542 GetStringValue(hParamKey,
543 L"Type",
544 &pszType,
545 NULL);
546 if (pszType != NULL)
547 {
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;
560 else
561 ParamArray->Array[dwIndex].Type = NO_TYPE;
562
563 HeapFree(GetProcessHeap(), 0, pszType);
564 pszType = NULL;
565 }
566
567 GetStringValue(hParamKey,
568 L"Default",
569 &ParamArray->Array[dwIndex].pszDefault,
570 NULL);
571
572 GetBooleanValue(hParamKey,
573 L"Optional",
574 FALSE,
575 &ParamArray->Array[dwIndex].bOptional);
576
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)
581 {
582 if (ParamArray->Array[dwIndex].Type == INT_TYPE)
583 {
584 lDefaultMin = -32768L; //MIN_SHORT;
585 lDefaultMax = 32767L; //MAX_SHORT;
586 }
587 else if (ParamArray->Array[dwIndex].Type == LONG_TYPE)
588 {
589 lDefaultMin = (-2147483647L - 1); // MIN_LONG;
590 lDefaultMax = 2147483647L; // MAX_LONG;
591 }
592 else if (ParamArray->Array[dwIndex].Type == WORD_TYPE)
593 {
594 dwDefaultMin = 0UL;
595 dwDefaultMax = 65535UL; // MAX_WORD;
596 }
597 else if (ParamArray->Array[dwIndex].Type == DWORD_TYPE)
598 {
599 dwDefaultMin = 0UL;
600 dwDefaultMax = 4294967295UL; //MAX_DWORD;
601 }
602
603 if (ParamArray->Array[dwIndex].Type == INT_TYPE ||
604 ParamArray->Array[dwIndex].Type == LONG_TYPE)
605 {
606 GetLongValue(hParamKey,
607 L"Min",
608 lDefaultMin,
609 &ParamArray->Array[dwIndex].u.l.lMin);
610
611 GetLongValue(hParamKey,
612 L"Max",
613 lDefaultMax,
614 &ParamArray->Array[dwIndex].u.l.lMax);
615 }
616 else if (ParamArray->Array[dwIndex].Type == WORD_TYPE ||
617 ParamArray->Array[dwIndex].Type == DWORD_TYPE)
618 {
619 GetDWordValue(hParamKey,
620 L"Min",
621 dwDefaultMin,
622 &ParamArray->Array[dwIndex].u.dw.dwMin);
623
624 GetDWordValue(hParamKey,
625 L"Max",
626 dwDefaultMax,
627 &ParamArray->Array[dwIndex].u.dw.dwMax);
628 }
629
630 GetIntValue(hParamKey,
631 L"Base",
632 10,
633 &ParamArray->Array[dwIndex].iBase);
634
635 GetIntValue(hParamKey,
636 L"Step",
637 1,
638 &ParamArray->Array[dwIndex].iStep);
639 }
640 else if (ParamArray->Array[dwIndex].Type == EDIT_TYPE)
641 {
642 GetBooleanValue(hParamKey,
643 L"UpperCase",
644 FALSE,
645 &ParamArray->Array[dwIndex].bUpperCase);
646
647 GetIntValue(hParamKey,
648 L"TextLimit",
649 0,
650 &ParamArray->Array[dwIndex].iTextLimit);
651 }
652 else if (ParamArray->Array[dwIndex].Type == ENUM_TYPE)
653 {
654 GetEnumOptions(hParamKey,
655 &ParamArray->Array[dwIndex]);
656 }
657
658 RegCloseKey(hParamKey);
659 }
660
661 lError = GetStringValue(hDriverKey,
662 ParamArray->Array[dwIndex].pszName,
663 &ParamArray->Array[dwIndex].pszValue,
664 &ParamArray->Array[dwIndex].cchValueLength);
665 if ((lError == ERROR_SUCCESS) ||
666 (ParamArray->Array[dwIndex].pszDefault != NULL))
667 {
668 ParamArray->Array[dwIndex].bPresent = TRUE;
669 }
670 }
671
672 *ParameterArray = ParamArray;
673 ret = TRUE;
674
675done:
676 if (ret == FALSE && ParamArray != NULL)
677 FreeParameterArray(ParamArray);
678
679 if (hParamsKey != INVALID_HANDLE_VALUE)
680 RegCloseKey(hParamsKey);
681
682 if (hDriverKey != INVALID_HANDLE_VALUE)
683 RegCloseKey(hDriverKey);
684
685 return ret;
686}
687
688
689static
690VOID
692 HWND hwnd,
693 PPARAMETER pParam)
694{
695 INT iIndex, iLength;
696
697 if (pParam->Type == ENUM_TYPE)
698 {
700 if (iIndex != CB_ERR && iIndex < pParam->dwEnumOptions)
701 {
702 iLength = wcslen(pParam->pEnumOptions[iIndex].pszValue);
703 if (iLength > pParam->cchValueLength)
704 {
705 if (pParam->pszValue != NULL)
706 HeapFree(GetProcessHeap(), 0, pParam->pszValue);
707
708 pParam->pszValue = HeapAlloc(GetProcessHeap(), 0, (iLength + 1) * sizeof(WCHAR));
709 }
710
711 if (pParam->pszValue != NULL)
712 {
713 wcscpy(pParam->pszValue,
714 pParam->pEnumOptions[iIndex].pszValue);
715 pParam->cchValueLength = iLength;
716 }
717 }
718 }
719 else
720 {
722 if (iLength > pParam->cchValueLength)
723 {
724 if (pParam->pszValue != NULL)
725 HeapFree(GetProcessHeap(), 0, pParam->pszValue);
726
727 pParam->pszValue = HeapAlloc(GetProcessHeap(), 0, (iLength + 1) * sizeof(WCHAR));
728 }
729
730 if (pParam->pszValue != NULL)
731 {
733 pParam->pszValue,
734 iLength + 1);
735 pParam->cchValueLength = iLength;
736 }
737 }
738}
739
740
741static
742VOID
744 _In_ HWND hwnd,
745 _In_ PPARAMETER_ARRAY ParamArray)
746{
747 SP_DEVINSTALL_PARAMS_W InstallParams;
748 PPARAMETER Param;
749 HKEY hDriverKey;
750 INT i;
751
752 if (ParamArray == NULL)
753 return;
754
755 hDriverKey = SetupDiOpenDevRegKey(ParamArray->DeviceInfoSet,
756 ParamArray->DeviceInfoData,
758 0,
759 DIREG_DRV,
760 KEY_WRITE);
761 if (hDriverKey == INVALID_HANDLE_VALUE)
762 {
763 ERR("SetupDiOpenDevRegKey() failed\n");
764 return;
765 }
766
767 for (i = 0; i < ParamArray->dwCount; i++)
768 {
769 Param = &ParamArray->Array[i];
770
771 if (Param == ParamArray->pCurrentParam)
772 {
773 ReadParameterValue(hwnd, Param);
774 }
775
776 if (Param->bPresent)
777 {
778 TRACE("Set '%S' --> '%S'\n", Param->pszName, Param->pszValue);
779 RegSetValueExW(hDriverKey,
780 Param->pszName,
781 0,
782 REG_SZ,
783 (LPBYTE)Param->pszValue,
784 (wcslen(Param->pszValue) + 1) * sizeof(WCHAR));
785 }
786 else
787 {
788 TRACE("Delete '%S'\n", Param->pszName);
789 RegDeleteValueW(hDriverKey,
790 Param->pszName);
791 }
792 }
793
794 RegCloseKey(hDriverKey);
795
796 /* Notify the installer of changes to the properties */
797 InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
798 if (SetupDiGetDeviceInstallParamsW(ParamArray->DeviceInfoSet,
799 ParamArray->DeviceInfoData,
800 &InstallParams))
801 {
802 InstallParams.FlagsEx |= DI_FLAGSEX_PROPCHANGE_PENDING;
803
804 SetupDiSetDeviceInstallParamsW(ParamArray->DeviceInfoSet,
805 ParamArray->DeviceInfoData,
806 &InstallParams);
807 }
808}
809
810
811static
812VOID
814 _In_ HWND hwnd,
816{
817 HWND hwndControl;
819 INT idx;
820 DWORD i;
821
824 if (Parameter->bOptional)
825 {
826 if (Parameter->bPresent)
828 else
830 }
831
832 switch (Parameter->Type)
833 {
834 case INT_TYPE:
835 case LONG_TYPE:
836 case WORD_TYPE:
837 case DWORD_TYPE:
839
841
842 if (Parameter->Type != DWORD_TYPE)
843 {
844 EnableWindow(hwndControl, Parameter->bPresent);
845 ShowWindow(hwndControl, SW_SHOW);
846 }
847
848 if (Parameter->Type == WORD_TYPE || Parameter->Type == DWORD_TYPE)
849 SendMessage(hwndControl, UDM_SETBASE, Parameter->iBase, 0);
850 else
851 SendMessage(hwndControl, UDM_SETBASE, 10, 0);
852
853 if (Parameter->Type == INT_TYPE || Parameter->Type == LONG_TYPE)
854 {
855 TRACE("SetMin %ld SetMax %ld\n", Parameter->u.l.lMin, Parameter->u.l.lMax);
856 SendMessage(hwndControl, UDM_SETRANGE32, Parameter->u.l.lMin, Parameter->u.l.lMax);
857 }
858 else if (Parameter->Type == WORD_TYPE)
859 {
860 TRACE("SetMin %lu SetMax %lu\n", Parameter->u.dw.dwMin, Parameter->u.dw.dwMax);
861 SendMessage(hwndControl, UDM_SETRANGE32, (INT)Parameter->u.dw.dwMin, (INT)Parameter->u.dw.dwMax);
862 }
863
865 EnableWindow(hwndControl, Parameter->bPresent);
866 ShowWindow(hwndControl, SW_SHOW);
867
868 Style = GetWindowLongPtr(hwndControl, GWL_STYLE);
869 Style |= ES_NUMBER;
870 SetWindowLongPtr(hwndControl, GWL_STYLE, Style);
871
872 Edit_LimitText(hwndControl, 0);
873
874 if (Parameter->pszValue)
875 Edit_SetText(hwndControl, Parameter->pszValue);
876 else if (Parameter->pszDefault)
877 Edit_SetText(hwndControl, Parameter->pszDefault);
878 break;
879
880 case EDIT_TYPE:
883
885 EnableWindow(hwndControl, Parameter->bPresent);
886 ShowWindow(hwndControl, SW_SHOW);
887
888 Style = GetWindowLongPtr(hwndControl, GWL_STYLE);
889 Style &= ~ES_NUMBER;
890 if (Parameter->bUpperCase)
892 else
893 Style &= ~ES_UPPERCASE;
894 SetWindowLongPtr(hwndControl, GWL_STYLE, Style);
895
896 Edit_LimitText(hwndControl, Parameter->iTextLimit);
897
898 if (Parameter->pszValue)
899 Edit_SetText(hwndControl, Parameter->pszValue);
900 else if (Parameter->pszDefault)
901 Edit_SetText(hwndControl, Parameter->pszDefault);
902 break;
903
904 case ENUM_TYPE:
907
909 EnableWindow(hwndControl, Parameter->bPresent);
910 ShowWindow(hwndControl, SW_SHOW);
911
912 ComboBox_ResetContent(hwndControl);
913
914 if (Parameter->pEnumOptions != NULL && Parameter->dwEnumOptions != 0)
915 {
916 for (i = 0; i < Parameter->dwEnumOptions; i++)
917 {
918 ComboBox_AddString(hwndControl, Parameter->pEnumOptions[i].pszName);
919 }
920 }
921
922 if (Parameter->pszValue)
923 {
925 if (idx != CB_ERR)
926 ComboBox_SetCurSel(hwndControl, idx);
927 }
928 else if (Parameter->pszDefault)
929 {
930 idx = FindEnumOption(Parameter, Parameter->pszDefault);
931 if (idx != CB_ERR)
932 ComboBox_SetCurSel(hwndControl, idx);
933 }
934 break;
935
936 default:
937 break;
938 }
939}
940
941
942static
943BOOL
945 HWND hwnd,
948{
949 PPARAMETER_ARRAY pParamArray;
950 HWND hwndControl;
951 PWSTR pszText;
952 DWORD i;
953 INT idx;
954
955 TRACE("OnInitDialog()\n");
956
958 if (pParamArray == NULL)
959 {
960 ERR("pParamArray is NULL\n");
961 return FALSE;
962 }
963
964 SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)pParamArray);
965
966 hwndControl = GetDlgItem(hwnd, IDC_PROPERTY_NAME);
967 if (hwndControl)
968 {
969 for (i = 0; i < pParamArray->dwCount; i++)
970 {
971 if (pParamArray->Array[i].pszDescription != NULL)
972 pszText = pParamArray->Array[i].pszDescription;
973 else
974 pszText = pParamArray->Array[i].pszName;
975
976 idx = ListBox_AddString(hwndControl, pszText);
977 if (idx != LB_ERR)
978 ListBox_SetItemData(hwndControl, idx, (LPARAM)&pParamArray->Array[i]);
979 }
980
981 if (pParamArray->dwCount > 0)
982 {
983 ListBox_SetCurSel(hwndControl, 0);
984 pParamArray->pCurrentParam = (PPARAMETER)ListBox_GetItemData(hwndControl, 0);
985 DisplayParameter(hwnd, pParamArray->pCurrentParam);
986 }
987 }
988
989 return TRUE;
990}
991
992
993static
994VOID
996 HWND hwnd,
999{
1000 PPARAMETER_ARRAY pParamArray;
1001 INT iIndex;
1002
1003 TRACE("OnCommand()\n");
1004
1006 if (pParamArray == NULL)
1007 {
1008 ERR("pParamArray is NULL\n");
1009 return;
1010 }
1011
1013 {
1014 if (pParamArray->pCurrentParam != NULL)
1015 {
1016 ReadParameterValue(hwnd, pParamArray->pCurrentParam);
1017 }
1018
1019 iIndex = ListBox_GetCurSel((HWND)lParam);
1020 if (iIndex != LB_ERR && iIndex < pParamArray->dwCount)
1021 {
1022 pParamArray->pCurrentParam = (PPARAMETER)ListBox_GetItemData((HWND)lParam, iIndex);
1023 DisplayParameter(hwnd, pParamArray->pCurrentParam);
1024 }
1025 }
1026 else if ((LOWORD(wParam) == IDC_PROPERTY_PRESENT) && (HIWORD(wParam) == BN_CLICKED))
1027 {
1031 pParamArray->pCurrentParam->bPresent = TRUE;
1032 }
1034 {
1038 pParamArray->pCurrentParam->bPresent = FALSE;
1039 }
1040}
1041
1042
1043static
1044VOID
1046 HWND hwnd,
1047 WPARAM wParam,
1048 LPARAM lParam)
1049{
1050 PPARAMETER_ARRAY pParamArray;
1051
1052 TRACE("OnNotify()\n");
1053
1055 if (pParamArray == NULL)
1056 {
1057 ERR("pParamArray is NULL\n");
1058 return;
1059 }
1060
1061 if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
1062 {
1063 TRACE("PSN_APPLY!\n");
1064 WriteParameterArray(hwnd, pParamArray);
1065 }
1066 else if (((LPNMHDR)lParam)->code == (UINT)UDN_DELTAPOS)
1067 {
1068 LPNMUPDOWN pUpDown = (LPNMUPDOWN)lParam;
1069 pUpDown->iDelta *= pParamArray->pCurrentParam->iStep;
1070 }
1071}
1072
1073
1074static
1075VOID
1077 HWND hwnd)
1078{
1079 PPARAMETER_ARRAY pParamArray;
1080
1081 TRACE("OnDestroy()\n");
1082
1084 if (pParamArray == NULL)
1085 {
1086 ERR("pParamArray is NULL\n");
1087 return;
1088 }
1089
1090 FreeParameterArray(pParamArray);
1092}
1093
1094
1095static
1096INT_PTR
1099 HWND hwnd,
1100 UINT uMsg,
1101 WPARAM wParam,
1102 LPARAM lParam)
1103{
1104 switch (uMsg)
1105 {
1106 case WM_INITDIALOG:
1107 return OnInitDialog(hwnd, wParam, lParam);
1108
1109 case WM_COMMAND:
1111 break;
1112
1113 case WM_NOTIFY:
1115 break;
1116
1117 case WM_DESTROY:
1118 OnDestroy(hwnd);
1119 break;
1120
1121 default:
1122 break;
1123 }
1124
1125 return FALSE;
1126}
1127
1128
1129BOOL
1130WINAPI
1132 PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest,
1133 LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc,
1134 LPARAM lParam)
1135{
1137 HPROPSHEETPAGE hPropSheetPage;
1138 PPARAMETER_ARRAY ParameterArray = NULL;
1139
1140 TRACE("NetPropPageProvider(%p %p %lx)\n",
1141 lpPropSheetPageRequest, lpfnAddPropSheetPageProc, lParam);
1142
1143 if (!BuildParameterArray(lpPropSheetPageRequest->DeviceInfoSet,
1144 lpPropSheetPageRequest->DeviceInfoData,
1145 &ParameterArray))
1146 return FALSE;
1147
1148 if (lpPropSheetPageRequest->PageRequested == SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
1149 {
1150 TRACE("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
1151
1152 PropSheetPage.dwSize = sizeof(PROPSHEETPAGEW);
1153 PropSheetPage.dwFlags = 0;
1154 PropSheetPage.hInstance = netcfgx_hInstance;
1157 PropSheetPage.lParam = (LPARAM)ParameterArray;
1158 PropSheetPage.pfnCallback = NULL;
1159
1160 hPropSheetPage = CreatePropertySheetPageW(&PropSheetPage);
1161 if (hPropSheetPage == NULL)
1162 {
1163 ERR("CreatePropertySheetPageW() failed!\n");
1164 return FALSE;
1165 }
1166
1167 if (!(*lpfnAddPropSheetPageProc)(hPropSheetPage, lParam))
1168 {
1169 ERR("lpfnAddPropSheetPageProc() failed!\n");
1170 DestroyPropertySheetPage(hPropSheetPage);
1171 return FALSE;
1172 }
1173 }
1174
1175 TRACE("Done!\n");
1176
1177 return TRUE;
1178}
1179
1180/* EOF */
const DWORD Style
Definition: appswitch.c:71
HKEY hEnumKey
Definition: umpnpmgr.c:44
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:49
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:41
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 RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2330
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2830
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3662
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
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
Definition: propsheet.c:3083
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
Definition: propsheet.c:3152
#define GetProcessHeap()
Definition: compat.h:736
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CALLBACK
Definition: compat.h:35
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static DWORD DWORD * dwLength
Definition: fusion.c:86
HINSTANCE netcfgx_hInstance
Definition: netcfgx.c:15
#define IDC_PROPERTY_VALUE_UPDN
Definition: resource.h:92
#define IDC_PROPERTY_NAME
Definition: resource.h:90
#define IDC_PROPERTY_PRESENT
Definition: resource.h:94
#define IDD_NET_PROPERTY_DLG
Definition: resource.h:19
#define IDC_PROPERTY_VALUE_LIST
Definition: resource.h:93
#define IDC_PROPERTY_VALUE_EDIT
Definition: resource.h:91
#define IDC_PROPERTY_NOT_PRESENT
Definition: resource.h:95
BOOL WINAPI SetupDiSetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
Definition: devinst.c:4558
BOOL WINAPI SetupDiGetDeviceInstallParamsW(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
Definition: devinst.c:4451
HKEY WINAPI SetupDiOpenDevRegKey(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired)
Definition: devinst.c:5934
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxString * pString
FxAutoRegKey hKey
PWCHAR pValue
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define REG_SZ
Definition: layer.c:22
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static PVOID ptr
Definition: dispmode.c:27
#define _Out_opt_
Definition: ms_sal.h:346
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_WRITE
Definition: nt_native.h:1031
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
#define ES_UPPERCASE
Definition: pedump.c:668
BYTE * PBYTE
Definition: pedump.c:66
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
static DWORD GetEnumOptions(_In_ HKEY hKey, _In_ PPARAMETER pParameter)
Definition: propertypage.c:288
static DWORD GetBooleanValue(_In_ HKEY hKey, _In_ PWSTR pValueName, _In_ BOOL bDefault, _Out_ PBOOL pValue)
Definition: propertypage.c:154
struct _PARAMETER PARAMETER
struct _ENUM_OPTION * PENUM_OPTION
static VOID ReadParameterValue(HWND hwnd, PPARAMETER pParam)
Definition: propertypage.c:691
static DWORD GetStringValue(_In_ HKEY hKey, _In_ PWSTR pValueName, _Out_ PWSTR *pString, _Out_opt_ PDWORD pdwStringLength)
Definition: propertypage.c:114
static DWORD GetDWordValue(_In_ HKEY hKey, _In_ PWSTR pValueName, _In_ DWORD dwDefault, _Out_ PDWORD pValue)
Definition: propertypage.c:252
enum _PARAM_TYPE * PPARAM_TYPE
struct _PARAMETER_ARRAY PARAMETER_ARRAY
_PARAM_TYPE
Definition: propertypage.c:11
@ ENUM_TYPE
Definition: propertypage.c:18
@ EDIT_TYPE
Definition: propertypage.c:17
@ DWORD_TYPE
Definition: propertypage.c:16
@ WORD_TYPE
Definition: propertypage.c:15
@ INT_TYPE
Definition: propertypage.c:13
@ LONG_TYPE
Definition: propertypage.c:14
@ NO_TYPE
Definition: propertypage.c:12
static BOOL BuildParameterArray(_In_ HDEVINFO DeviceInfoSet, _In_ PSP_DEVINFO_DATA DeviceInfoData, _Out_ PPARAMETER_ARRAY *ParameterArray)
Definition: propertypage.c:425
static VOID OnDestroy(HWND hwnd)
struct _ENUM_OPTION ENUM_OPTION
static DWORD GetIntValue(_In_ HKEY hKey, _In_ PWSTR pValueName, _In_ INT iDefault, _Out_ PINT pValue)
Definition: propertypage.c:187
BOOL WINAPI NetPropPageProvider(PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest, LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc, LPARAM lParam)
enum _PARAM_TYPE PARAM_TYPE
static VOID DisplayParameter(_In_ HWND hwnd, _In_ PPARAMETER Parameter)
Definition: propertypage.c:813
static VOID OnNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
static VOID WriteParameterArray(_In_ HWND hwnd, _In_ PPARAMETER_ARRAY ParamArray)
Definition: propertypage.c:743
struct _PARAMETER * PPARAMETER
static INT_PTR CALLBACK NetPropertyPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
static DWORD GetLongValue(_In_ HKEY hKey, _In_ PWSTR pValueName, _In_ LONG lDefault, _Out_ PLONG pValue)
Definition: propertypage.c:217
static VOID OnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
Definition: propertypage.c:995
static BOOL OnInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam)
Definition: propertypage.c:944
static VOID FreeParameterArray(_In_ PPARAMETER_ARRAY ParamArray)
Definition: propertypage.c:74
struct _PARAMETER_ARRAY * PPARAMETER_ARRAY
static INT FindEnumOption(_In_ PPARAMETER pParameter, _In_ PWSTR pszValue)
Definition: propertypage.c:403
#define PSN_APPLY
Definition: prsht.h:117
struct _PROPSHEETPAGEW PROPSHEETPAGEW
BOOL(CALLBACK * LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM)
Definition: prsht.h:327
struct _NM_UPDOWN * LPNMUPDOWN
#define UDM_SETBASE
Definition: commctrl.h:2149
#define UDM_SETRANGE32
Definition: commctrl.h:2151
#define UDN_DELTAPOS
Definition: commctrl.h:2169
PVOID pBuffer
#define WM_NOTIFY
Definition: richedit.h:61
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define DIREG_DRV
Definition: setupapi.h:182
struct _SP_DEVINSTALL_PARAMS_W SP_DEVINSTALL_PARAMS_W
_In_opt_ PSP_DEVINFO_DATA DeviceInfoData
Definition: setupapi.h:1528
#define DI_FLAGSEX_PROPCHANGE_PENDING
Definition: setupapi.h:86
#define DICS_FLAG_GLOBAL
Definition: setupapi.h:113
#define SPPSR_ENUM_ADV_DEVICE_PROPERTIES
Definition: setupapi.h:615
#define TRACE(s)
Definition: solgame.cpp:4
PWSTR pszValue
Definition: propertypage.c:23
int iDelta
Definition: commctrl.h:2166
PPARAMETER pCurrentParam
Definition: propertypage.c:66
HDEVINFO DeviceInfoSet
Definition: propertypage.c:64
PSP_DEVINFO_DATA DeviceInfoData
Definition: propertypage.c:65
PARAMETER Array[0]
Definition: propertypage.c:68
PWSTR pszDefault
Definition: propertypage.c:33
union _PARAMETER::@521 u
PENUM_OPTION pEnumOptions
Definition: propertypage.c:39
DWORD dwEnumOptions
Definition: propertypage.c:38
PWSTR pszDescription
Definition: propertypage.c:30
struct _PARAMETER::@521::@523 dw
BOOL bPresent
Definition: propertypage.c:35
DWORD dwMin
Definition: propertypage.c:56
BOOL bOptional
Definition: propertypage.c:34
DWORD cchValueLength
Definition: propertypage.c:32
struct _PARAMETER::@521::@522 l
INT iTextLimit
Definition: propertypage.c:42
BOOL bUpperCase
Definition: propertypage.c:41
DWORD dwMax
Definition: propertypage.c:57
PARAM_TYPE Type
Definition: propertypage.c:36
PWSTR pszName
Definition: propertypage.c:29
PWSTR pszValue
Definition: propertypage.c:31
PSP_DEVINFO_DATA DeviceInfoData
Definition: setupapi.h:1104
Definition: inflate.c:139
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
#define UL
Definition: tui.h:165
uint16_t * PWSTR
Definition: typedefs.h:56
int32_t INT_PTR
Definition: typedefs.h:64
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
int32_t * PLONG
Definition: typedefs.h:58
#define HIWORD(l)
Definition: typedefs.h:247
int ret
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
int * PINT
Definition: windef.h:177
BOOL * PBOOL
Definition: windef.h:161
#define WINAPI
Definition: msvc.h:6
#define ListBox_GetCurSel(hwndCtl)
Definition: windowsx.h:481
#define ComboBox_SetCurSel(hwndCtl, index)
Definition: windowsx.h:66
#define Edit_LimitText(hwndCtl, cchMax)
Definition: windowsx.h:97
#define ComboBox_GetCurSel(hwndCtl)
Definition: windowsx.h:49
#define ListBox_SetCurSel(hwndCtl, index)
Definition: windowsx.h:500
#define ListBox_GetItemData(hwndCtl, index)
Definition: windowsx.h:483
#define Edit_GetTextLength(hwndCtl)
Definition: windowsx.h:95
#define ListBox_SetItemData(hwndCtl, index, data)
Definition: windowsx.h:502
#define ComboBox_AddString(hwndCtl, lpsz)
Definition: windowsx.h:41
#define ComboBox_ResetContent(hwndCtl)
Definition: windowsx.h:63
#define Edit_GetText(hwndCtl, lpch, cchMax)
Definition: windowsx.h:94
#define Edit_SetText(hwndCtl, lpsz)
Definition: windowsx.h:112
#define ListBox_AddString(hwndCtl, lpsz)
Definition: windowsx.h:472
#define Button_SetCheck(hwndCtl, check)
Definition: windowsx.h:35
#define LB_ERR
Definition: winuser.h:2432
#define SW_HIDE
Definition: winuser.h:768
#define DWLP_USER
Definition: winuser.h:872
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define WM_COMMAND
Definition: winuser.h:1740
#define CB_ERR
Definition: winuser.h:2435
#define WM_INITDIALOG
Definition: winuser.h:1739
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define SendMessage
Definition: winuser.h:5843
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define ES_NUMBER
Definition: winuser.h:301
#define LBN_SELCHANGE
Definition: winuser.h:2075
#define BN_CLICKED
Definition: winuser.h:1925
#define SW_SHOW
Definition: winuser.h:775
#define WM_DESTROY
Definition: winuser.h:1609
#define GWL_STYLE
Definition: winuser.h:852
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define BST_CHECKED
Definition: winuser.h:197
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:323
__wchar_t WCHAR
Definition: xmlstorage.h:180