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
;
32 } PROFILEDATA
, *PPROFILEDATA
;
37 OnCopyProfileInit(HWND hwndDlg
,
38 PPROFILEDATA pProfileData
,
42 WCHAR szNewProfileName
[PROFILE_NAME_LENGTH
];
44 SetDlgItemText(hwndDlg
, idFrom
, pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
].szFriendlyName
);
46 swprintf(szNewProfileName
, L
"Profile %lu", pProfileData
->dwProfileCount
);
47 SendDlgItemMessageW(hwndDlg
, idTo
, EM_SETLIMITTEXT
, PROFILE_NAME_LENGTH
- 1, 0);
48 SetDlgItemText(hwndDlg
, idTo
, szNewProfileName
);
56 PPROFILEDATA pProfileData
)
59 // PPROFILE pSrcProfile
62 /* Allocate memory for the new profile */
63 pProfiles
= HeapReAlloc(GetProcessHeap(),
65 pProfileData
->pProfiles
,
66 (pProfileData
->dwProfileCount
+ 1) * sizeof(PROFILE
));
67 if (pProfiles
== NULL
)
69 DPRINT1("HeapReAlloc() failed!\n");
73 pProfileData
->dwProfileCount
++;
74 pProfileData
->pProfiles
= pProfiles
;
76 // pSrcProfile = &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex];
77 pDstProfile
= &pProfileData
->pProfiles
[pProfileData
->dwProfileCount
- 1];
79 GetDlgItemText(hwndDlg
,
81 pDstProfile
->szFriendlyName
,
84 pDstProfile
->dwProfileNumber
= ++pProfileData
->dwLastProfile
;
85 swprintf(pDstProfile
->szName
, L
"%04lu", pDstProfile
->dwProfileNumber
);
87 pDstProfile
->dwPreferenceOrder
= pDstProfile
->dwProfileNumber
;
89 SendDlgItemMessageW(pProfileData
->hwndProfileDlg
, IDC_HRDPROFLSTBOX
, LB_ADDSTRING
, 0, (LPARAM
)pDstProfile
->szFriendlyName
);
96 CopyProfileDlgProc(HWND hwndDlg
,
101 PPROFILEDATA pProfileData
;
103 pProfileData
= (PPROFILEDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
108 SetWindowLongPtr(hwndDlg
, DWLP_USER
, lParam
);
109 pProfileData
= (PPROFILEDATA
)lParam
;
110 OnCopyProfileInit(hwndDlg
, pProfileData
, IDC_COPYPROFILEFROM
, IDC_COPYPROFILETO
);
114 switch (LOWORD(wParam
))
117 CopyProfile(hwndDlg
, pProfileData
);
118 EndDialog(hwndDlg
, IDOK
);
122 EndDialog(hwndDlg
, IDCANCEL
);
135 PPROFILEDATA pProfileData
)
139 pProfile
= &pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
];
141 GetDlgItemText(hwndDlg
,
143 pProfile
->szFriendlyName
,
144 PROFILE_NAME_LENGTH
);
146 /* Replace the listbox string */
147 SendDlgItemMessageW(pProfileData
->hwndProfileDlg
, IDC_HRDPROFLSTBOX
, LB_DELETESTRING
, pProfileData
->dwSelectedProfileIndex
, 0);
148 SendDlgItemMessageW(pProfileData
->hwndProfileDlg
, IDC_HRDPROFLSTBOX
, LB_INSERTSTRING
, pProfileData
->dwSelectedProfileIndex
, (LPARAM
)pProfile
->szFriendlyName
);
155 RenameProfileDlgProc(HWND hwndDlg
,
160 PPROFILEDATA pProfileData
;
162 pProfileData
= (PPROFILEDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
167 SetWindowLongPtr(hwndDlg
, DWLP_USER
, lParam
);
168 pProfileData
= (PPROFILEDATA
)lParam
;
169 OnCopyProfileInit(hwndDlg
, pProfileData
, IDC_RENPROFEDITFROM
, IDC_RENPROFEDITTO
);
173 switch (LOWORD(wParam
))
176 RenameProfile(hwndDlg
, pProfileData
);
177 EndDialog(hwndDlg
, IDOK
);
181 EndDialog(hwndDlg
, IDCANCEL
);
193 DeleteHardwareProfile(PPROFILEDATA pProfileData
)
195 WCHAR szMessage
[256];
202 pProfile
= &pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
];
204 LoadStringW(hApplet
, IDS_HWPROFILE_CONFIRM_DELETE_TITLE
, szCaption
, sizeof(szCaption
) / sizeof(WCHAR
));
205 LoadStringW(hApplet
, IDS_HWPROFILE_CONFIRM_DELETE
, szBuffer
, sizeof(szBuffer
) / sizeof(WCHAR
));
206 swprintf(szMessage
, szBuffer
, pProfile
->szFriendlyName
);
211 MB_YESNO
| MB_ICONQUESTION
);
214 SendDlgItemMessageW(pProfileData
->hwndProfileDlg
, IDC_HRDPROFLSTBOX
, LB_DELETESTRING
, pProfileData
->dwSelectedProfileIndex
, 0);
216 if (pProfileData
->dwSelectedProfileIndex
!= pProfileData
->dwProfileCount
- 1)
218 RtlMoveMemory(&pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
],
219 &pProfileData
->pProfiles
[pProfileData
->dwSelectedProfileIndex
+ 1],
220 (pProfileData
->dwProfileCount
- pProfileData
->dwSelectedProfileIndex
- 1) * sizeof(PPROFILE
));
224 pProfileData
->dwSelectedProfileIndex
--;
227 pProfiles
= HeapReAlloc(GetProcessHeap(),
229 pProfileData
->pProfiles
,
230 (pProfileData
->dwProfileCount
- 1) * sizeof(PROFILE
));
231 if (pProfiles
== NULL
)
233 DPRINT1("HeapReAlloc() failed!\n");
237 pProfileData
->dwProfileCount
--;
238 pProfileData
->pProfiles
= pProfiles
;
240 SendDlgItemMessageW(pProfileData
->hwndProfileDlg
, IDC_HRDPROFLSTBOX
, LB_SETCURSEL
, pProfileData
->dwSelectedProfileIndex
, 0);
247 GetUserWaitInterval(VOID
)
249 DWORD dwWaitInterval
= 30;
253 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
254 L
"System\\CurrentControlSet\\Control\\IDConfigDB",
258 return dwWaitInterval
;
260 dwSize
= sizeof(DWORD
);
261 RegQueryValueExW(hKey
,
265 (LPBYTE
)&dwWaitInterval
,
270 return dwWaitInterval
;
276 SetUserWaitInterval(DWORD dwWaitInterval
)
280 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
281 L
"System\\CurrentControlSet\\Control\\IDConfigDB",
291 (LPBYTE
)&dwWaitInterval
,
300 GetProfileCount(LPDWORD lpProfileCount
)
307 lError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
308 L
"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
312 if (lError
!= ERROR_SUCCESS
)
315 lError
= RegQueryInfoKeyW(hKey
, NULL
, NULL
, NULL
, lpProfileCount
,
316 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
320 if (lError
!= ERROR_SUCCESS
)
333 DWORD dwProfileNumber
,
340 lError
= RegOpenKeyExW(hKey
,
345 if (lError
!= ERROR_SUCCESS
)
348 dwSize
= PROFILE_NAME_LENGTH
* sizeof(WCHAR
);
349 lError
= RegQueryValueExW(hProfileKey
,
353 (LPBYTE
)pProfile
->szFriendlyName
,
355 if (lError
== ERROR_SUCCESS
)
357 DPRINT1("Profile: %S\n", pProfile
->szFriendlyName
);
360 dwSize
= sizeof(DWORD
);
361 lError
= RegQueryValueExW(hProfileKey
,
365 (LPBYTE
)pProfile
->dwPreferenceOrder
,
367 if (lError
== ERROR_SUCCESS
)
369 DPRINT1("PreferenceOrder: %lu\n", pProfile
->dwPreferenceOrder
);
372 pProfile
->dwProfileNumber
= dwProfileNumber
;
374 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_ADDSTRING
, 0, (LPARAM
)pProfile
->szFriendlyName
);
376 RegCloseKey(hProfileKey
);
382 GetProfiles(HWND hwndDlg
)
384 PPROFILEDATA pProfileData
;
387 DWORD dwProfileNumber
;
392 pProfileData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(PROFILEDATA
));
393 if (pProfileData
== NULL
)
396 pProfileData
->hwndProfileDlg
= hwndDlg
;
397 pProfileData
->dwLastProfile
= (DWORD
)-1;
398 pProfileData
->dwSelectedProfileIndex
= (DWORD
)-1;
400 if (!GetProfileCount(&pProfileData
->dwProfileCount
))
402 HeapFree(GetProcessHeap(), 0, pProfileData
);
406 pProfileData
->pProfiles
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
407 pProfileData
->dwProfileCount
* sizeof(PROFILE
));
408 if (pProfileData
->pProfiles
== NULL
)
410 HeapFree(GetProcessHeap(), 0, pProfileData
);
414 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pProfileData
);
416 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
417 L
"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
420 &hKey
) != ERROR_SUCCESS
)
423 for (dwIndex
= 0; dwIndex
< pProfileData
->dwProfileCount
; dwIndex
++)
426 lError
= RegEnumKeyExW(hKey
,
434 if (lError
!= ERROR_SUCCESS
)
437 dwProfileNumber
= wcstoul(szName
, NULL
, 10);
438 DPRINT("Profile name: %S\n", szName
);
439 DPRINT("Profile number: %lu\n", dwProfileNumber
);
441 if ((pProfileData
->dwLastProfile
== (DWORD
)-1) ||
442 (pProfileData
->dwLastProfile
< dwProfileNumber
))
443 pProfileData
->dwLastProfile
= dwProfileNumber
;
445 DPRINT("Last Profile number: %lu\n", pProfileData
->dwLastProfile
);
447 GetProfile(hwndDlg
, hKey
, szName
, dwProfileNumber
, &pProfileData
->pProfiles
[dwIndex
]);
458 OnInitDialog(HWND hwndDlg
)
460 DWORD dwWaitInterval
;
462 DPRINT("OnInitDialog()\n");
464 SendMessage(GetDlgItem(hwndDlg
, IDC_HRDPROFUP
),
465 BM_SETIMAGE
,(WPARAM
)IMAGE_ICON
,
466 (LPARAM
)(HANDLE
)LoadIcon(hApplet
, MAKEINTRESOURCE(IDI_UP
)));
467 SendMessage(GetDlgItem(hwndDlg
, IDC_HRDPROFDWN
),
468 BM_SETIMAGE
,(WPARAM
)IMAGE_ICON
,
469 (LPARAM
)(HANDLE
)LoadIcon(hApplet
, MAKEINTRESOURCE(IDI_DOWN
)));
471 if (!GetProfiles(hwndDlg
))
474 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_SETRANGE
, (WPARAM
)0, (LPARAM
)MAKELONG((SHORT
)500, 0));
476 dwWaitInterval
= GetUserWaitInterval();
477 if (dwWaitInterval
== (DWORD
)-1)
479 CheckDlgButton(hwndDlg
, IDC_HRDPROFWAIT
, BST_CHECKED
);
480 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_SETPOS
, 0, 30);
481 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFEDIT
), FALSE
);
485 CheckDlgButton(hwndDlg
, IDC_HRDPROFSELECT
, BST_CHECKED
);
486 SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_SETPOS
, 0, dwWaitInterval
);
497 DWORD dwWaitInterval
;
499 if (IsDlgButtonChecked(hwndDlg
, IDC_HRDPROFWAIT
) == BST_CHECKED
)
501 dwWaitInterval
= (DWORD
)-1;
505 dwWaitInterval
= LOWORD(SendDlgItemMessageW(hwndDlg
, IDC_HRDPROFUPDWN
, UDM_GETPOS
, 0, 0));
508 SetUserWaitInterval(dwWaitInterval
);
512 /* Property page dialog callback */
515 HardProfDlgProc(HWND hwndDlg
,
520 PPROFILEDATA pProfileData
;
522 UNREFERENCED_PARAMETER(lParam
);
523 UNREFERENCED_PARAMETER(wParam
);
524 UNREFERENCED_PARAMETER(hwndDlg
);
526 pProfileData
= (PPROFILEDATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
531 return OnInitDialog(hwndDlg
);
534 if (pProfileData
!= NULL
)
536 if (pProfileData
->pProfiles
!= NULL
)
537 HeapFree(GetProcessHeap(), 0, pProfileData
->pProfiles
);
538 HeapFree(GetProcessHeap(), 0, pProfileData
);
543 switch (LOWORD(wParam
))
545 case IDC_HRDPROFCOPY
:
546 DialogBoxParam(hApplet
,
547 MAKEINTRESOURCE(IDD_COPYPROFILE
),
549 (DLGPROC
)CopyProfileDlgProc
,
550 (LPARAM
)pProfileData
);
553 case IDC_HRDPROFRENAME
:
554 DialogBoxParam(hApplet
,
555 MAKEINTRESOURCE(IDD_RENAMEPROFILE
),
557 (DLGPROC
)RenameProfileDlgProc
,
558 (LPARAM
)pProfileData
);
562 DeleteHardwareProfile(pProfileData
);
565 case IDC_HRDPROFWAIT
:
566 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFEDIT
), FALSE
);
569 case IDC_HRDPROFSELECT
:
570 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFEDIT
), TRUE
);
573 case IDC_HRDPROFLSTBOX
:
574 if (HIWORD(wParam
) == LBN_SELCHANGE
)
576 pProfileData
->dwSelectedProfileIndex
= (DWORD
)SendDlgItemMessage(hwndDlg
, IDC_HRDPROFLSTBOX
, LB_GETCURSEL
, 0, 0);
578 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFCOPY
), (pProfileData
->dwSelectedProfileIndex
!= (DWORD
)-1) ? TRUE
: FALSE
);
579 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFRENAME
), (pProfileData
->dwSelectedProfileIndex
!= (DWORD
)-1) ? TRUE
: FALSE
);
580 EnableWindow(GetDlgItem(hwndDlg
, IDC_HRDPROFDEL
), (pProfileData
->dwSelectedProfileIndex
!= (DWORD
)-1) ? TRUE
: FALSE
);
588 EndDialog(hwndDlg
, LOWORD(wParam
));