/* * PROJECT: ReactOS System Control Panel Applet * LICENSE: GPL - See COPYING in the top level directory * FILE: dll/cpl/sysdm/hardprof.c * PURPOSE: Modify hardware profiles * COPYRIGHT: Copyright 2006 Ged Murphy * */ #include "precomp.h" #include #define PROFILE_NAME_LENGTH 80 typedef struct _PROFILE { WCHAR szFriendlyName[PROFILE_NAME_LENGTH]; WCHAR szName[5]; DWORD dwProfileNumber; DWORD dwPreferenceOrder; } PROFILE, *PPROFILE; typedef struct _PROFILEDATA { DWORD dwProfileCount; DWORD dwLastProfile; DWORD dwSelectedProfile; DWORD dwSelectedProfileIndex; PPROFILE pProfiles; } PROFILEDATA, *PPROFILEDATA; typedef struct _PROFILENAMES { WCHAR szSourceName[PROFILE_NAME_LENGTH]; WCHAR szDestinationName[PROFILE_NAME_LENGTH]; PPROFILEDATA pProfileData; } PROFILENAMES, *PPROFILENAMES; static VOID UpdateButtons( HWND hwndDlg, PPROFILEDATA pProfileData) { EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFPROP), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFCOPY), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFRENAME), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFDEL), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE); if (pProfileData->dwProfileCount < 2) { EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFUP), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFDWN), FALSE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFUP), (pProfileData->dwSelectedProfileIndex > 0) ? TRUE : FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFDWN), (pProfileData->dwSelectedProfileIndex < pProfileData->dwProfileCount - 1) ? TRUE : FALSE); } } static BOOL IsProfileNameInUse( PPROFILENAMES pProfileNames, BOOL bIgnoreCurrent) { DWORD i; for (i = 0; i < pProfileNames->pProfileData->dwProfileCount; i++) { if (bIgnoreCurrent == TRUE && i == pProfileNames->pProfileData->dwSelectedProfileIndex) continue; if (wcscmp(pProfileNames->pProfileData->pProfiles[i].szFriendlyName, pProfileNames->szDestinationName) == 0) return TRUE; } return FALSE; } static INT_PTR CALLBACK CopyProfileDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PPROFILENAMES pProfileNames; pProfileNames = (PPROFILENAMES)GetWindowLongPtr(hwndDlg, DWLP_USER); switch (uMsg) { case WM_INITDIALOG: SetWindowLongPtr(hwndDlg, DWLP_USER, lParam); pProfileNames = (PPROFILENAMES)lParam; /* Set the old name */ SetDlgItemText(hwndDlg, IDC_COPYPROFILEFROM, pProfileNames->szSourceName); /* Set the new name */ SendDlgItemMessageW(hwndDlg, IDC_COPYPROFILETO, EM_SETLIMITTEXT, PROFILE_NAME_LENGTH - 1, 0); SetDlgItemText(hwndDlg, IDC_COPYPROFILETO, pProfileNames->szDestinationName); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetDlgItemText(hwndDlg, IDC_COPYPROFILETO, pProfileNames->szDestinationName, PROFILE_NAME_LENGTH); if (IsProfileNameInUse(pProfileNames, FALSE)) ResourceMessageBox(hApplet, NULL, MB_OK | MB_ICONERROR, IDS_HWPROFILE_WARNING, IDS_HWPROFILE_ALREADY_IN_USE); else EndDialog(hwndDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return TRUE; } break; } return FALSE; } static VOID CopyHardwareProfile( HWND hwndDlg, PPROFILEDATA pProfileData) { PROFILENAMES ProfileNames; PPROFILE pProfile, pNewProfiles, pNewProfile; WCHAR szBuffer[80]; pProfile = &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex]; LoadStringW(hApplet, IDS_HWPROFILE_PROFILE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)); wcscpy(ProfileNames.szSourceName, pProfile->szFriendlyName); swprintf(ProfileNames.szDestinationName, L"%s %lu", szBuffer, pProfileData->dwProfileCount); ProfileNames.pProfileData = pProfileData; if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_COPYPROFILE), hwndDlg, CopyProfileDlgProc, (LPARAM)&ProfileNames) != IDOK) return; /* Apply new name only if it has been changed */ if (wcscmp(ProfileNames.szSourceName, ProfileNames.szDestinationName) == 0) return; /* Allocate memory for the new profile */ pNewProfiles = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pProfileData->pProfiles, (pProfileData->dwProfileCount + 1) * sizeof(PROFILE)); if (pNewProfiles == NULL) { DPRINT1("HeapReAlloc() failed!\n"); return; } pProfileData->dwProfileCount++; pProfileData->pProfiles = pNewProfiles; pNewProfile = &pProfileData->pProfiles[pProfileData->dwProfileCount - 1]; CopyMemory(pNewProfile, pProfile, sizeof(PROFILE)); wcscpy(pNewProfile->szFriendlyName, ProfileNames.szDestinationName); pNewProfile->dwProfileNumber = ++pProfileData->dwLastProfile; swprintf(pNewProfile->szName, L"%04lu", pNewProfile->dwProfileNumber); pNewProfile->dwPreferenceOrder = pNewProfile->dwProfileNumber; SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_ADDSTRING, 0, (LPARAM)pNewProfile->szFriendlyName); UpdateButtons(hwndDlg, pProfileData); } static INT_PTR CALLBACK RenameProfileDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PPROFILENAMES pProfileNames; pProfileNames = (PPROFILENAMES)GetWindowLongPtr(hwndDlg, DWLP_USER); switch (uMsg) { case WM_INITDIALOG: SetWindowLongPtr(hwndDlg, DWLP_USER, lParam); pProfileNames = (PPROFILENAMES)lParam; /* Set the old name */ SetDlgItemText(hwndDlg, IDC_RENPROFEDITFROM, pProfileNames->szSourceName); /* Set the new name */ SendDlgItemMessageW(hwndDlg, IDC_RENPROFEDITTO, EM_SETLIMITTEXT, PROFILE_NAME_LENGTH - 1, 0); SetDlgItemText(hwndDlg, IDC_RENPROFEDITTO, pProfileNames->szDestinationName); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetDlgItemText(hwndDlg, IDC_RENPROFEDITTO, pProfileNames->szDestinationName, PROFILE_NAME_LENGTH); if (IsProfileNameInUse(pProfileNames, TRUE)) ResourceMessageBox(hApplet, NULL, MB_OK | MB_ICONERROR, IDS_HWPROFILE_WARNING, IDS_HWPROFILE_ALREADY_IN_USE); else EndDialog(hwndDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); return TRUE; } break; } return FALSE; } static VOID RenameHardwareProfile( HWND hwndDlg, PPROFILEDATA pProfileData) { PROFILENAMES ProfileNames; PPROFILE pProfile; WCHAR szBuffer[80]; pProfile = &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex]; LoadStringW(hApplet, IDS_HWPROFILE_PROFILE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)); wcscpy(ProfileNames.szSourceName, pProfile->szFriendlyName); swprintf(ProfileNames.szDestinationName, L"%s %lu", szBuffer, pProfileData->dwProfileCount); ProfileNames.pProfileData = pProfileData; if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_RENAMEPROFILE), hwndDlg, RenameProfileDlgProc, (LPARAM)&ProfileNames) != IDOK) return; /* Apply new name only if it has been changed */ if (wcscmp(pProfile->szFriendlyName, ProfileNames.szDestinationName) == 0) return; /* Replace the profile name in the profile list */ wcscpy(pProfile->szFriendlyName, ProfileNames.szDestinationName); /* Replace the profile name in the listbox */ SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_DELETESTRING, pProfileData->dwSelectedProfileIndex, 0); SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_INSERTSTRING, pProfileData->dwSelectedProfileIndex, (LPARAM)pProfile->szFriendlyName); } static VOID DeleteHardwareProfile( HWND hwndDlg, PPROFILEDATA pProfileData) { WCHAR szMessage[256]; WCHAR szBuffer[128]; WCHAR szCaption[80]; PPROFILE pProfiles; PPROFILE pProfile; pProfile = &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex]; LoadStringW(hApplet, IDS_HWPROFILE_CONFIRM_DELETE_TITLE, szCaption, sizeof(szCaption) / sizeof(WCHAR)); LoadStringW(hApplet, IDS_HWPROFILE_CONFIRM_DELETE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)); swprintf(szMessage, szBuffer, pProfile->szFriendlyName); if (MessageBox(NULL, szMessage, szCaption, MB_YESNO | MB_ICONQUESTION) != IDYES) return; SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_DELETESTRING, pProfileData->dwSelectedProfileIndex, 0); if (pProfileData->dwSelectedProfileIndex != pProfileData->dwProfileCount - 1) { RtlMoveMemory(&pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex], &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex + 1], (pProfileData->dwProfileCount - pProfileData->dwSelectedProfileIndex - 1) * sizeof(PROFILE)); } else { pProfileData->dwSelectedProfileIndex--; } pProfiles = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pProfileData->pProfiles, (pProfileData->dwProfileCount - 1) * sizeof(PROFILE)); if (pProfiles == NULL) { DPRINT1("HeapReAlloc() failed!\n"); return; } pProfileData->dwProfileCount--; pProfileData->pProfiles = pProfiles; SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_SETCURSEL, pProfileData->dwSelectedProfileIndex, 0); UpdateButtons(hwndDlg, pProfileData); } static VOID MoveHardwareProfile( HWND hwndDlg, PPROFILEDATA pProfileData, BOOL bMoveUp) { PROFILE TempProfile; PPROFILE pSrcProfile, pDstProfile; DWORD dwSrcIndex, dwDstIndex; dwSrcIndex = pProfileData->dwSelectedProfileIndex; dwDstIndex = bMoveUp ? (dwSrcIndex - 1) : (dwSrcIndex + 1); pSrcProfile = &pProfileData->pProfiles[dwSrcIndex]; pDstProfile = &pProfileData->pProfiles[dwDstIndex]; CopyMemory(&TempProfile, pDstProfile, sizeof(PROFILE)); CopyMemory(pDstProfile, pSrcProfile, sizeof(PROFILE)); CopyMemory(pSrcProfile, &TempProfile, sizeof(PROFILE)); SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_DELETESTRING, dwSrcIndex, 0); SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_INSERTSTRING, dwDstIndex, (LPARAM)pDstProfile->szFriendlyName); pProfileData->dwSelectedProfileIndex = dwDstIndex; SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_SETCURSEL, pProfileData->dwSelectedProfileIndex, 0); UpdateButtons(hwndDlg, pProfileData); } static INT_PTR CALLBACK HardwareProfilePropertiesDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(hwndDlg); UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(wParam); switch (uMsg) { case WM_INITDIALOG: return TRUE; } return FALSE; } static int CALLBACK PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam) { // NOTE: This callback is needed to set large icon correctly. HICON hIcon; switch (uMsg) { case PSCB_INITIALIZED: { hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_HARDPROF)); SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); break; } } return 0; } static VOID HardwareProfileProperties( HWND hwndDlg, PPROFILEDATA pProfileData) { HPROPSHEETPAGE hpsp; PROPSHEETHEADER psh; PROPSHEETPAGE psp; ZeroMemory(&psp, sizeof(psp)); psp.dwSize = sizeof(psp); psp.dwFlags = PSP_DEFAULT; psp.hInstance = hApplet; psp.pszTemplate = MAKEINTRESOURCE(IDD_HARDWAREPROFILE); psp.pfnDlgProc = HardwareProfilePropertiesDlgProc; hpsp = CreatePropertySheetPage(&psp); if (hpsp == NULL) { return; } ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK; psh.hwndParent = hwndDlg; psh.hInstance = hApplet; psh.pszIcon = MAKEINTRESOURCEW(IDI_HARDPROF); psh.pszCaption = pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex].szFriendlyName; psh.nPages = 1; psh.nStartPage = 0; psh.phpage = &hpsp; psh.pfnCallback = PropSheetProc; PropertySheet(&psh); } static DWORD GetUserWaitInterval(VOID) { DWORD dwWaitInterval = 30; DWORD dwSize; HKEY hKey; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\IDConfigDB", 0, KEY_QUERY_VALUE, &hKey)) return dwWaitInterval; dwSize = sizeof(DWORD); RegQueryValueExW(hKey, L"UserWaitInterval", NULL, NULL, (LPBYTE)&dwWaitInterval, &dwSize); RegCloseKey(hKey); return dwWaitInterval; } static VOID SetUserWaitInterval(DWORD dwWaitInterval) { HKEY hKey; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\IDConfigDB", 0, KEY_SET_VALUE, &hKey)) return; RegSetValueExW(hKey, L"UserWaitInterval", 0, REG_DWORD, (LPBYTE)&dwWaitInterval, sizeof(DWORD)); RegCloseKey(hKey); } static BOOL GetProfileCount(LPDWORD lpProfileCount) { HKEY hKey; LONG lError; *lpProfileCount = 0; lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles", 0, KEY_READ, &hKey); if (lError != ERROR_SUCCESS) return FALSE; lError = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, lpProfileCount, NULL, NULL, NULL, NULL, NULL, NULL, NULL); RegCloseKey(hKey); if (lError != ERROR_SUCCESS) return FALSE; return TRUE; } static VOID GetProfile( HWND hwndDlg, HKEY hKey, LPWSTR lpName, DWORD dwProfileNumber, PPROFILE pProfile) { HKEY hProfileKey; DWORD dwSize; LONG lError; lError = RegOpenKeyExW(hKey, lpName, 0, KEY_READ, &hProfileKey); if (lError != ERROR_SUCCESS) return; dwSize = PROFILE_NAME_LENGTH * sizeof(WCHAR); lError = RegQueryValueExW(hProfileKey, L"FriendlyName", NULL, NULL, (LPBYTE)pProfile->szFriendlyName, &dwSize); if (lError == ERROR_SUCCESS) { DPRINT1("Profile: %S\n", pProfile->szFriendlyName); } dwSize = sizeof(DWORD); lError = RegQueryValueExW(hProfileKey, L"PreferenceOrder", NULL, NULL, (LPBYTE)&pProfile->dwPreferenceOrder, &dwSize); if (lError == ERROR_SUCCESS) { DPRINT1("PreferenceOrder: %lu\n", pProfile->dwPreferenceOrder); } pProfile->dwProfileNumber = dwProfileNumber; SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_ADDSTRING, 0, (LPARAM)pProfile->szFriendlyName); RegCloseKey(hProfileKey); } static BOOL GetProfiles(HWND hwndDlg) { PPROFILEDATA pProfileData; WCHAR szName[8]; DWORD dwNameLength; DWORD dwProfileNumber; DWORD dwIndex = 0; HKEY hKey; LONG lError; pProfileData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PROFILEDATA)); if (pProfileData == NULL) return FALSE; pProfileData->dwLastProfile = (DWORD)-1; pProfileData->dwSelectedProfileIndex = (DWORD)-1; if (!GetProfileCount(&pProfileData->dwProfileCount)) { HeapFree(GetProcessHeap(), 0, pProfileData); return FALSE; } pProfileData->pProfiles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pProfileData->dwProfileCount * sizeof(PROFILE)); if (pProfileData->pProfiles == NULL) { HeapFree(GetProcessHeap(), 0, pProfileData); return FALSE; } SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pProfileData); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles", 0, KEY_READ, &hKey) != ERROR_SUCCESS) return FALSE; for (dwIndex = 0; dwIndex < pProfileData->dwProfileCount; dwIndex++) { dwNameLength = 8; lError = RegEnumKeyExW(hKey, dwIndex, szName, &dwNameLength, NULL, NULL, NULL, NULL); if (lError != ERROR_SUCCESS) break; dwProfileNumber = wcstoul(szName, NULL, 10); DPRINT("Profile name: %S\n", szName); DPRINT("Profile number: %lu\n", dwProfileNumber); if ((pProfileData->dwLastProfile == (DWORD)-1) || (pProfileData->dwLastProfile < dwProfileNumber)) pProfileData->dwLastProfile = dwProfileNumber; DPRINT("Last Profile number: %lu\n", pProfileData->dwLastProfile); GetProfile(hwndDlg, hKey, szName, dwProfileNumber, &pProfileData->pProfiles[dwIndex]); } RegCloseKey(hKey); return TRUE; } static BOOL OnInitHardProfDialog(HWND hwndDlg) { DWORD dwWaitInterval; DPRINT("OnInitHardProfDialog()\n"); SendMessage(GetDlgItem(hwndDlg, IDC_HRDPROFUP), BM_SETIMAGE,(WPARAM)IMAGE_ICON, (LPARAM)(HANDLE)LoadIcon(hApplet, MAKEINTRESOURCE(IDI_UP))); SendMessage(GetDlgItem(hwndDlg, IDC_HRDPROFDWN), BM_SETIMAGE,(WPARAM)IMAGE_ICON, (LPARAM)(HANDLE)LoadIcon(hApplet, MAKEINTRESOURCE(IDI_DOWN))); if (!GetProfiles(hwndDlg)) return FALSE; SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETRANGE, (WPARAM)0, (LPARAM)MAKELONG((SHORT)500, 0)); dwWaitInterval = GetUserWaitInterval(); if (dwWaitInterval == (DWORD)-1) { CheckDlgButton(hwndDlg, IDC_HRDPROFWAIT, BST_CHECKED); SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETPOS, 0, 30); EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), FALSE); } else { CheckDlgButton(hwndDlg, IDC_HRDPROFSELECT, BST_CHECKED); SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETPOS, 0, dwWaitInterval); } return TRUE; } static VOID OnOk(HWND hwndDlg) { DWORD dwWaitInterval; if (IsDlgButtonChecked(hwndDlg, IDC_HRDPROFWAIT) == BST_CHECKED) { dwWaitInterval = (DWORD)-1; } else { dwWaitInterval = LOWORD(SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_GETPOS, 0, 0)); } SetUserWaitInterval(dwWaitInterval); } /* Property page dialog callback */ INT_PTR CALLBACK HardProfDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PPROFILEDATA pProfileData; UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(hwndDlg); pProfileData = (PPROFILEDATA)GetWindowLongPtr(hwndDlg, DWLP_USER); switch (uMsg) { case WM_INITDIALOG: return OnInitHardProfDialog(hwndDlg); case WM_DESTROY: if (pProfileData != NULL) { if (pProfileData->pProfiles != NULL) HeapFree(GetProcessHeap(), 0, pProfileData->pProfiles); HeapFree(GetProcessHeap(), 0, pProfileData); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_HRDPROFPROP: HardwareProfileProperties(hwndDlg, pProfileData); break; case IDC_HRDPROFCOPY: CopyHardwareProfile(hwndDlg, pProfileData); break; case IDC_HRDPROFRENAME: RenameHardwareProfile(hwndDlg, pProfileData); break; case IDC_HRDPROFDEL: DeleteHardwareProfile(hwndDlg, pProfileData); break; case IDC_HRDPROFUP: MoveHardwareProfile(hwndDlg, pProfileData, TRUE); break; case IDC_HRDPROFDWN: MoveHardwareProfile(hwndDlg, pProfileData, FALSE); break; case IDC_HRDPROFWAIT: EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), FALSE); return TRUE; case IDC_HRDPROFSELECT: EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), TRUE); return TRUE; case IDC_HRDPROFLSTBOX: if (HIWORD(wParam) == LBN_SELCHANGE) { pProfileData->dwSelectedProfileIndex = (DWORD)SendDlgItemMessage(hwndDlg, IDC_HRDPROFLSTBOX, LB_GETCURSEL, 0, 0); UpdateButtons(hwndDlg, pProfileData); } return TRUE; case IDOK: OnOk(hwndDlg); case IDCANCEL: EndDialog(hwndDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; }