2 * PROJECT: ReactOS System Control Panel Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/sysdm/hardprof.c
5 * PURPOSE: Modify hardware profiles
6 * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
14 #define PROFILE_NAME_LENGTH 80
16 typedef struct _PROFILE
18 WCHAR szFriendlyName
[PROFILE_NAME_LENGTH
];
20 DWORD dwProfileNumber
;
21 DWORD dwPreferenceOrder
;
24 typedef struct _PROFILEDATA
28 DWORD dwSelectedProfile
;
29 DWORD dwSelectedProfileIndex
;
31 } PROFILEDATA
, *PPROFILEDATA
;
33 typedef struct _PROFILENAMES
35 WCHAR szSourceName
[PROFILE_NAME_LENGTH
];
36 WCHAR szDestinationName
[PROFILE_NAME_LENGTH
];
37 PPROFILEDATA pProfileData
;
38 } PROFILENAMES
, *PPROFILENAMES
;
45 PPROFILEDATA pProfileData
)
47 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFPROP
), (pProfileData
->dwSelectedProfileIndex
!= (DWORD
)-1) ? TRUE
: FALSE
);
48 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFCOPY
), (pProfileData
->dwSelectedProfileIndex
!= (DWORD
)-1) ? TRUE
: FALSE
);
49 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFRENAME
), (pProfileData
->dwSelectedProfileIndex
!= (DWORD
)-1) ? TRUE
: FALSE
);
50 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFDEL
), (pProfileData
->dwSelectedProfileIndex
!= (DWORD
)-1) ? TRUE
: FALSE
);
52 if (pProfileData
->dwProfileCount
< 2)
54 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFUP
), FALSE
);
55 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFDWN
), FALSE
);
59 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFUP
),
60 (pProfileData
->dwSelectedProfileIndex
> 0) ? TRUE
: FALSE
);
61 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFDWN
),
62 (pProfileData
->dwSelectedProfileIndex
< pProfileData
->dwProfileCount
- 1) ? TRUE
: FALSE
);
70 PPROFILENAMES pProfileNames
,
75 for (i
= 0; i
< pProfileNames
->pProfileData
->dwProfileCount
; i
++)
77 if (bIgnoreCurrent
== TRUE
&& i
== pProfileNames
->pProfileData
->dwSelectedProfileIndex
)
80 if (wcscmp(pProfileNames
->pProfileData
->pProfiles
[i
].szFriendlyName
, pProfileNames
->szDestinationName
) == 0)
97 PPROFILENAMES pProfileNames
;
99 pProfileNames
= (PPROFILENAMES
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
104 SetWindowLongPtr(hwndDlg
, DWLP_USER
, lParam
);
105 pProfileNames
= (PPROFILENAMES
)lParam
;
107 /* Set the old name */
108 SetDlgItemText(hwndDlg
, IDC_COPYPROFILEFROM
, pProfileNames
->szSourceName
);
110 /* Set the new name */
111 SendDlgItemMessageW(hwndDlg
, IDC_COPYPROFILETO
, EM_SETLIMITTEXT
, PROFILE_NAME_LENGTH
- 1, 0);
112 SetDlgItemText(hwndDlg
, IDC_COPYPROFILETO
, pProfileNames
->szDestinationName
);
116 switch (LOWORD(wParam
))
119 GetDlgItemText(hwndDlg
,
121 pProfileNames
->szDestinationName
,
122 PROFILE_NAME_LENGTH
);
123 if (IsProfileNameInUse(pProfileNames
, FALSE
))
124 ResourceMessageBox(hApplet
,
126 MB_OK
| MB_ICONERROR
,
127 IDS_HWPROFILE_WARNING
,
128 IDS_HWPROFILE_ALREADY_IN_USE
);
130 EndDialog(hwndDlg
, IDOK
);
134 EndDialog(hwndDlg
, IDCANCEL
);
148 PPROFILEDATA pProfileData
)
150 PROFILENAMES ProfileNames
;
151 PPROFILE pProfile
, pNewProfiles
, pNewProfile
;
154 pProfile
= &pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
];
156 LoadStringW(hApplet
, IDS_HWPROFILE_PROFILE
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
158 wcscpy(ProfileNames
.szSourceName
, pProfile
->szFriendlyName
);
159 swprintf(ProfileNames
.szDestinationName
, L
"%s %lu", szBuffer
, pProfileData
->dwProfileCount
);
161 ProfileNames
.pProfileData
= pProfileData
;
163 if (DialogBoxParam(hApplet
,
164 MAKEINTRESOURCE(IDD_COPYPROFILE
),
167 (LPARAM
)&ProfileNames
) != IDOK
)
170 /* Apply new name only if it has been changed */
171 if (wcscmp(ProfileNames
.szSourceName
, ProfileNames
.szDestinationName
) == 0)
174 /* Allocate memory for the new profile */
175 pNewProfiles
= HeapReAlloc(GetProcessHeap(),
177 pProfileData
->pProfiles
,
178 (pProfileData
->dwProfileCount
+ 1) * sizeof(PROFILE
));
179 if (pNewProfiles
== NULL
)
181 DPRINT1("HeapReAlloc() failed!\n");
185 pProfileData
->dwProfileCount
++;
186 pProfileData
->pProfiles
= pNewProfiles
;
188 pNewProfile
= &pProfileData
->pProfiles
[pProfileData
->dwProfileCount
- 1];
190 CopyMemory(pNewProfile
, pProfile
, sizeof(PROFILE
));
192 wcscpy(pNewProfile
->szFriendlyName
, ProfileNames
.szDestinationName
);
194 pNewProfile
->dwProfileNumber
= ++pProfileData
->dwLastProfile
;
195 swprintf(pNewProfile
->szName
, L
"%04lu", pNewProfile
->dwProfileNumber
);
197 pNewProfile
->dwPreferenceOrder
= pNewProfile
->dwProfileNumber
;
199 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_ADDSTRING
, 0, (LPARAM
)pNewProfile
->szFriendlyName
);
201 UpdateButtons(hwndDlg
, pProfileData
);
208 RenameProfileDlgProc(
214 PPROFILENAMES pProfileNames
;
216 pProfileNames
= (PPROFILENAMES
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
221 SetWindowLongPtr(hwndDlg
, DWLP_USER
, lParam
);
222 pProfileNames
= (PPROFILENAMES
)lParam
;
224 /* Set the old name */
225 SetDlgItemText(hwndDlg
, IDC_RENPROFEDITFROM
, pProfileNames
->szSourceName
);
227 /* Set the new name */
228 SendDlgItemMessageW(hwndDlg
, IDC_RENPROFEDITTO
, EM_SETLIMITTEXT
, PROFILE_NAME_LENGTH
- 1, 0);
229 SetDlgItemText(hwndDlg
, IDC_RENPROFEDITTO
, pProfileNames
->szDestinationName
);
233 switch (LOWORD(wParam
))
236 GetDlgItemText(hwndDlg
,
238 pProfileNames
->szDestinationName
,
239 PROFILE_NAME_LENGTH
);
240 if (IsProfileNameInUse(pProfileNames
, TRUE
))
241 ResourceMessageBox(hApplet
,
243 MB_OK
| MB_ICONERROR
,
244 IDS_HWPROFILE_WARNING
,
245 IDS_HWPROFILE_ALREADY_IN_USE
);
247 EndDialog(hwndDlg
, IDOK
);
251 EndDialog(hwndDlg
, IDCANCEL
);
263 RenameHardwareProfile(
265 PPROFILEDATA pProfileData
)
267 PROFILENAMES ProfileNames
;
271 pProfile
= &pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
];
273 LoadStringW(hApplet
, IDS_HWPROFILE_PROFILE
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
275 wcscpy(ProfileNames
.szSourceName
, pProfile
->szFriendlyName
);
276 swprintf(ProfileNames
.szDestinationName
, L
"%s %lu", szBuffer
, pProfileData
->dwProfileCount
);
278 ProfileNames
.pProfileData
= pProfileData
;
280 if (DialogBoxParam(hApplet
,
281 MAKEINTRESOURCE(IDD_RENAMEPROFILE
),
283 RenameProfileDlgProc
,
284 (LPARAM
)&ProfileNames
) != IDOK
)
287 /* Apply new name only if it has been changed */
288 if (wcscmp(pProfile
->szFriendlyName
, ProfileNames
.szDestinationName
) == 0)
291 /* Replace the profile name in the profile list */
292 wcscpy(pProfile
->szFriendlyName
, ProfileNames
.szDestinationName
);
294 /* Replace the profile name in the listbox */
295 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_DELETESTRING
, pProfileData
->dwSelectedProfileIndex
, 0);
296 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_INSERTSTRING
, pProfileData
->dwSelectedProfileIndex
, (LPARAM
)pProfile
->szFriendlyName
);
302 DeleteHardwareProfile(
304 PPROFILEDATA pProfileData
)
306 WCHAR szMessage
[256];
312 pProfile
= &pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
];
314 LoadStringW(hApplet
, IDS_HWPROFILE_CONFIRM_DELETE_TITLE
, szCaption
, sizeof(szCaption
) / sizeof(WCHAR
));
315 LoadStringW(hApplet
, IDS_HWPROFILE_CONFIRM_DELETE
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
316 swprintf(szMessage
, szBuffer
, pProfile
->szFriendlyName
);
321 MB_YESNO
| MB_ICONQUESTION
) != IDYES
)
324 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_DELETESTRING
, pProfileData
->dwSelectedProfileIndex
, 0);
326 if (pProfileData
->dwSelectedProfileIndex
!= pProfileData
->dwProfileCount
- 1)
328 RtlMoveMemory(&pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
],
329 &pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
+ 1],
330 (pProfileData
->dwProfileCount
- pProfileData
->dwSelectedProfileIndex
- 1) * sizeof(PROFILE
));
334 pProfileData
->dwSelectedProfileIndex
--;
337 pProfiles
= HeapReAlloc(GetProcessHeap(),
339 pProfileData
->pProfiles
,
340 (pProfileData
->dwProfileCount
- 1) * sizeof(PROFILE
));
341 if (pProfiles
== NULL
)
343 DPRINT1("HeapReAlloc() failed!\n");
347 pProfileData
->dwProfileCount
--;
348 pProfileData
->pProfiles
= pProfiles
;
350 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_SETCURSEL
, pProfileData
->dwSelectedProfileIndex
, 0);
352 UpdateButtons(hwndDlg
, pProfileData
);
360 PPROFILEDATA pProfileData
,
364 PPROFILE pSrcProfile
, pDstProfile
;
365 DWORD dwSrcIndex
, dwDstIndex
;
367 dwSrcIndex
= pProfileData
->dwSelectedProfileIndex
;
368 dwDstIndex
= bMoveUp
? (dwSrcIndex
- 1) : (dwSrcIndex
+ 1);
370 pSrcProfile
= &pProfileData
->pProfiles
[dwSrcIndex
];
371 pDstProfile
= &pProfileData
->pProfiles
[dwDstIndex
];
373 CopyMemory(&TempProfile
, pDstProfile
, sizeof(PROFILE
));
374 CopyMemory(pDstProfile
, pSrcProfile
, sizeof(PROFILE
));
375 CopyMemory(pSrcProfile
, &TempProfile
, sizeof(PROFILE
));
377 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_DELETESTRING
, dwSrcIndex
, 0);
378 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_INSERTSTRING
, dwDstIndex
, (LPARAM
)pDstProfile
->szFriendlyName
);
380 pProfileData
->dwSelectedProfileIndex
= dwDstIndex
;
381 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_SETCURSEL
, pProfileData
->dwSelectedProfileIndex
, 0);
383 UpdateButtons(hwndDlg
, pProfileData
);
390 HardwareProfilePropertiesDlgProc(
396 UNREFERENCED_PARAMETER(hwndDlg
);
397 UNREFERENCED_PARAMETER(lParam
);
398 UNREFERENCED_PARAMETER(wParam
);
413 HardwareProfileProperties(
415 PPROFILEDATA pProfileData
)
421 ZeroMemory(&psp
, sizeof(psp
));
422 psp
.dwSize
= sizeof(psp
);
423 psp
.dwFlags
= PSP_DEFAULT
;
424 psp
.hInstance
= hApplet
;
425 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_HARDWAREPROFILE
);
426 psp
.pfnDlgProc
= HardwareProfilePropertiesDlgProc
;
428 hpsp
= CreatePropertySheetPage(&psp
);
434 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
435 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
436 psh
.dwFlags
= PSH_PROPTITLE
;
437 psh
.hwndParent
= hwndDlg
;
438 psh
.hInstance
= hApplet
;
440 psh
.pszCaption
= pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
].szFriendlyName
;
444 psh
.pfnCallback
= NULL
;
452 GetUserWaitInterval(VOID
)
454 DWORD dwWaitInterval
= 30;
458 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
459 L
"System\\CurrentControlSet\\Control\\IDConfigDB",
463 return dwWaitInterval
;
465 dwSize
= sizeof(DWORD
);
466 RegQueryValueExW(hKey
,
470 (LPBYTE
)&dwWaitInterval
,
475 return dwWaitInterval
;
481 SetUserWaitInterval(DWORD dwWaitInterval
)
485 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
486 L
"System\\CurrentControlSet\\Control\\IDConfigDB",
496 (LPBYTE
)&dwWaitInterval
,
505 GetProfileCount(LPDWORD lpProfileCount
)
512 lError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
513 L
"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
517 if (lError
!= ERROR_SUCCESS
)
520 lError
= RegQueryInfoKeyW(hKey
, NULL
, NULL
, NULL
, lpProfileCount
,
521 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
525 if (lError
!= ERROR_SUCCESS
)
538 DWORD dwProfileNumber
,
545 lError
= RegOpenKeyExW(hKey
,
550 if (lError
!= ERROR_SUCCESS
)
553 dwSize
= PROFILE_NAME_LENGTH
* sizeof(WCHAR
);
554 lError
= RegQueryValueExW(hProfileKey
,
558 (LPBYTE
)pProfile
->szFriendlyName
,
560 if (lError
== ERROR_SUCCESS
)
562 DPRINT1("Profile: %S\n", pProfile
->szFriendlyName
);
565 dwSize
= sizeof(DWORD
);
566 lError
= RegQueryValueExW(hProfileKey
,
570 (LPBYTE
)&pProfile
->dwPreferenceOrder
,
572 if (lError
== ERROR_SUCCESS
)
574 DPRINT1("PreferenceOrder: %lu\n", pProfile
->dwPreferenceOrder
);
577 pProfile
->dwProfileNumber
= dwProfileNumber
;
579 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_ADDSTRING
, 0, (LPARAM
)pProfile
->szFriendlyName
);
581 RegCloseKey(hProfileKey
);
587 GetProfiles(HWND hwndDlg
)
589 PPROFILEDATA pProfileData
;
592 DWORD dwProfileNumber
;
597 pProfileData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(PROFILEDATA
));
598 if (pProfileData
== NULL
)
601 pProfileData
->dwLastProfile
= (DWORD
)-1;
602 pProfileData
->dwSelectedProfileIndex
= (DWORD
)-1;
604 if (!GetProfileCount(&pProfileData
->dwProfileCount
))
606 HeapFree(GetProcessHeap(), 0, pProfileData
);
610 pProfileData
->pProfiles
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
611 pProfileData
->dwProfileCount
* sizeof(PROFILE
));
612 if (pProfileData
->pProfiles
== NULL
)
614 HeapFree(GetProcessHeap(), 0, pProfileData
);
618 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pProfileData
);
620 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
621 L
"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
624 &hKey
) != ERROR_SUCCESS
)
627 for (dwIndex
= 0; dwIndex
< pProfileData
->dwProfileCount
; dwIndex
++)
630 lError
= RegEnumKeyExW(hKey
,
638 if (lError
!= ERROR_SUCCESS
)
641 dwProfileNumber
= wcstoul(szName
, NULL
, 10);
642 DPRINT("Profile name: %S\n", szName
);
643 DPRINT("Profile number: %lu\n", dwProfileNumber
);
645 if ((pProfileData
->dwLastProfile
== (DWORD
)-1) ||
646 (pProfileData
->dwLastProfile
< dwProfileNumber
))
647 pProfileData
->dwLastProfile
= dwProfileNumber
;
649 DPRINT("Last Profile number: %lu\n", pProfileData
->dwLastProfile
);
651 GetProfile(hwndDlg
, hKey
, szName
, dwProfileNumber
, &pProfileData
->pProfiles
[dwIndex
]);
662 OnInitHardProfDialog(HWND hwndDlg
)
664 DWORD dwWaitInterval
;
666 DPRINT("OnInitHardProfDialog()\n");
668 SendMessage(GetDlgItem(hwndDlg
, IDC_HRDPROFUP
),
669 BM_SETIMAGE
,(WPARAM
)IMAGE_ICON
,
670 (LPARAM
)(HANDLE
)LoadIcon(hApplet
, MAKEINTRESOURCE(IDI_UP
)));
671 SendMessage(GetDlgItem(hwndDlg
, IDC_HRDPROFDWN
),
672 BM_SETIMAGE
,(WPARAM
)IMAGE_ICON
,
673 (LPARAM
)(HANDLE
)LoadIcon(hApplet
, MAKEINTRESOURCE(IDI_DOWN
)));
675 if (!GetProfiles(hwndDlg
))
678 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_SETRANGE
, (WPARAM
)0, (LPARAM
)MAKELONG((SHORT
)500, 0));
680 dwWaitInterval
= GetUserWaitInterval();
681 if (dwWaitInterval
== (DWORD
)-1)
683 CheckDlgButton(hwndDlg
, IDC_HRDPROFWAIT
, BST_CHECKED
);
684 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_SETPOS
, 0, 30);
685 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFEDIT
), FALSE
);
689 CheckDlgButton(hwndDlg
, IDC_HRDPROFSELECT
, BST_CHECKED
);
690 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_SETPOS
, 0, dwWaitInterval
);
701 DWORD dwWaitInterval
;
703 if (IsDlgButtonChecked(hwndDlg
, IDC_HRDPROFWAIT
) == BST_CHECKED
)
705 dwWaitInterval
= (DWORD
)-1;
709 dwWaitInterval
= LOWORD(SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_GETPOS
, 0, 0));
712 SetUserWaitInterval(dwWaitInterval
);
716 /* Property page dialog callback */
719 HardProfDlgProc(HWND hwndDlg
,
724 PPROFILEDATA pProfileData
;
726 UNREFERENCED_PARAMETER(lParam
);
727 UNREFERENCED_PARAMETER(wParam
);
728 UNREFERENCED_PARAMETER(hwndDlg
);
730 pProfileData
= (PPROFILEDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
735 return OnInitHardProfDialog(hwndDlg
);
738 if (pProfileData
!= NULL
)
740 if (pProfileData
->pProfiles
!= NULL
)
741 HeapFree(GetProcessHeap(), 0, pProfileData
->pProfiles
);
742 HeapFree(GetProcessHeap(), 0, pProfileData
);
747 switch (LOWORD(wParam
))
749 case IDC_HRDPROFPROP
:
750 HardwareProfileProperties(hwndDlg
, pProfileData
);
753 case IDC_HRDPROFCOPY
:
754 CopyHardwareProfile(hwndDlg
, pProfileData
);
757 case IDC_HRDPROFRENAME
:
758 RenameHardwareProfile(hwndDlg
, pProfileData
);
762 DeleteHardwareProfile(hwndDlg
, pProfileData
);
766 MoveHardwareProfile(hwndDlg
, pProfileData
, TRUE
);
770 MoveHardwareProfile(hwndDlg
, pProfileData
, FALSE
);
773 case IDC_HRDPROFWAIT
:
774 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFEDIT
), FALSE
);
777 case IDC_HRDPROFSELECT
:
778 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFEDIT
), TRUE
);
781 case IDC_HRDPROFLSTBOX
:
782 if (HIWORD(wParam
) == LBN_SELCHANGE
)
784 pProfileData
->dwSelectedProfileIndex
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_GETCURSEL
, 0, 0);
785 UpdateButtons(hwndDlg
, pProfileData
);
793 EndDialog(hwndDlg
, LOWORD(wParam
));