[KSPROXY]
[reactos.git] / reactos / dll / cpl / sysdm / virtmem.c
index 43563f6..6dcd9ad 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "precomp.h"
 
+static BOOL OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem);
 static LPCTSTR lpKey = _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management");
 
 static BOOL
@@ -19,39 +20,40 @@ ReadPageFileSettings(PVIRTMEM pVirtMem)
     DWORD dwDataSize;
     BOOL bRet = FALSE;
 
-    if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                      lpKey,
-                      0,
-                      NULL,
-                      REG_OPTION_NON_VOLATILE,
-                      KEY_QUERY_VALUE,
-                      NULL,
-                      &hkey,
-                      NULL) == ERROR_SUCCESS)
+    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
+                       lpKey,
+                       0,
+                       NULL,
+                       REG_OPTION_NON_VOLATILE,
+                       KEY_QUERY_VALUE,
+                       NULL,
+                       &hkey,
+                       NULL) == ERROR_SUCCESS)
     {
-        if(RegQueryValueEx(hkey,
-                           _T("PagingFiles"),
-                           NULL,
-                           &dwType,
-                           NULL,
-                           &dwDataSize) == ERROR_SUCCESS)
+        if (RegQueryValueEx(hkey,
+                            _T("PagingFiles"),
+                            NULL,
+                            &dwType,
+                            NULL,
+                            &dwDataSize) == ERROR_SUCCESS)
         {
             pVirtMem->szPagingFiles = (LPTSTR)HeapAlloc(GetProcessHeap(),
                                                         0,
                                                         dwDataSize);
             if (pVirtMem->szPagingFiles != NULL)
             {
-                if(RegQueryValueEx(hkey,
-                                   _T("PagingFiles"),
-                                   NULL,
-                                   &dwType,
-                                   (PBYTE)pVirtMem->szPagingFiles,
-                                   &dwDataSize) == ERROR_SUCCESS)
+                ZeroMemory(pVirtMem->szPagingFiles,
+                           dwDataSize);
+                if (RegQueryValueEx(hkey,
+                                    _T("PagingFiles"),
+                                    NULL,
+                                    &dwType,
+                                    (PBYTE)pVirtMem->szPagingFiles,
+                                    &dwDataSize) == ERROR_SUCCESS)
                 {
                     bRet = TRUE;
                 }
             }
-
         }
     }
 
@@ -65,21 +67,37 @@ ReadPageFileSettings(PVIRTMEM pVirtMem)
 }
 
 
-static INT
-GetPageFileSizes(LPTSTR lpPageFiles)
+static VOID
+GetPageFileSizes(LPTSTR lpPageFiles,
+                 LPINT lpInitialSize,
+                 LPINT lpMaximumSize)
 {
+    INT i = 0;
+
+    *lpInitialSize = -1;
+    *lpMaximumSize = -1;
+
     while (*lpPageFiles != _T('\0'))
     {
         if (*lpPageFiles == _T(' '))
         {
             lpPageFiles++;
-            return (INT)_ttoi(lpPageFiles);
+
+            switch (i)
+            {
+                case 0:
+                    *lpInitialSize = (INT)_ttoi(lpPageFiles);
+                    i = 1;
+                    break;
+
+                case 1:
+                    *lpMaximumSize = (INT)_ttoi(lpPageFiles);
+                    return;
+            }
         }
 
         lpPageFiles++;
     }
-
-    return -1;
 }
 
 
@@ -88,8 +106,9 @@ ParseMemSettings(PVIRTMEM pVirtMem)
 {
     TCHAR szDrives[1024];    // all drives
     LPTSTR DrivePtr = szDrives;
-    TCHAR szDrive[MAX_PATH]; // single drive
+    TCHAR szDrive[3]; // single drive
     TCHAR szVolume[MAX_PATH];
+    TCHAR *szDisplayString;
     INT InitialSize = 0;
     INT MaxSize = 0;
     INT DriveLen;
@@ -98,9 +117,12 @@ ParseMemSettings(PVIRTMEM pVirtMem)
     DriveLen = GetLogicalDriveStrings(1023,
                                       szDrives);
 
+    szDisplayString = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (MAX_PATH * 2 + 69) * sizeof(TCHAR));
+    if (szDisplayString == NULL)
+        return;
+
     while (DriveLen != 0)
     {
-        LVITEM Item;
         INT Len;
 
         Len = lstrlen(DrivePtr) + 1;
@@ -109,16 +131,17 @@ ParseMemSettings(PVIRTMEM pVirtMem)
         DrivePtr = _tcsupr(DrivePtr);
 
         /* copy the 'X:' portion */
-        lstrcpyn(szDrive, DrivePtr, 3);
+        lstrcpyn(szDrive, DrivePtr, sizeof(szDrive) / sizeof(TCHAR));
 
-        if(GetDriveType(DrivePtr) == DRIVE_FIXED)
+        if (GetDriveType(DrivePtr) == DRIVE_FIXED)
         {
             /* does drive match the one in the registry ? */
-            if(!_tcsncmp(pVirtMem->szPagingFiles, szDrive, 2))
+            if (!_tcsncmp(pVirtMem->szPagingFiles, szDrive, 2))
             {
                 /* FIXME: we only check the first available pagefile in the reg */
-                InitialSize = GetPageFileSizes(pVirtMem->szPagingFiles);
-                MaxSize = GetPageFileSizes(pVirtMem->szPagingFiles);
+                GetPageFileSizes(pVirtMem->szPagingFiles,
+                                 &InitialSize,
+                                 &MaxSize);
 
                 pVirtMem->Pagefile[PgCnt].InitialValue = InitialSize;
                 pVirtMem->Pagefile[PgCnt].MaxValue = MaxSize;
@@ -133,12 +156,8 @@ ParseMemSettings(PVIRTMEM pVirtMem)
                 lstrcpy(pVirtMem->Pagefile[PgCnt].szDrive, szDrive);
             }
 
-            /* fill out the listview */
-            ZeroMemory(&Item, sizeof(Item));
-            Item.mask = LVIF_TEXT;
-            Item.iItem = ListView_GetItemCount(pVirtMem->hListView);
-            Item.pszText = szDrive;
-            (void)ListView_InsertItem(pVirtMem->hListView, &Item);
+            _tcscpy(szDisplayString, szDrive);
+            _tcscat(szDisplayString, _T("\t"));
 
             /* set a volume label if there is one */
             if (GetVolumeInformation(DrivePtr,
@@ -150,15 +169,11 @@ ParseMemSettings(PVIRTMEM pVirtMem)
                                      NULL,
                                      0))
             {
-                if (szVolume != _T('\0'))
+                if (szVolume[0] != _T('\0'))
                 {
                     TCHAR szVol[MAX_PATH + 2];
-
-                    wsprintf(szVol, _T("[%s]"), szVolume);
-
-                    Item.iSubItem = 1;
-                    Item.pszText = szVol;
-                    (void)ListView_InsertItem(pVirtMem->hListView, &Item);
+                    _stprintf(szVol, _T("[%s]"), szVolume);
+                    _tcscat(szDisplayString, szVol);
                 }
             }
 
@@ -166,20 +181,22 @@ ParseMemSettings(PVIRTMEM pVirtMem)
             {
                 TCHAR szSize[64];
 
-                wsprintf(szSize, _T("%i - %i"), InitialSize, MaxSize);
-
-                Item.iSubItem = 2;
-                Item.pszText = szSize;
-                (void)ListView_InsertItem(pVirtMem->hListView, &Item);
+                _stprintf(szSize, _T("%i - %i"), InitialSize, MaxSize);
+                _tcscat(szDisplayString, _T("\t"));
+                _tcscat(szDisplayString, szSize);
             }
 
+            SendMessage(pVirtMem->hListBox, LB_ADDSTRING, (WPARAM)0, (LPARAM)szDisplayString);
             PgCnt++;
         }
 
         DrivePtr += Len;
     }
 
+    SendMessage(pVirtMem->hListBox, LB_SETCURSEL, (WPARAM)0, (LPARAM)0);
+    HeapFree(GetProcessHeap(), 0, szDisplayString);
     pVirtMem->Count = PgCnt;
+    OnSelChange(pVirtMem->hSelf, pVirtMem);
 }
 
 
@@ -188,20 +205,19 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
 {
     HKEY hk = NULL;
     TCHAR szPagingFiles[2048];
+    TCHAR szText[256];
     INT i;
     INT nPos = 0;
     BOOL bErr = TRUE;
 
-    for(i = 0; i < pVirtMem->Count; ++i)
+    for (i = 0; i < pVirtMem->Count; ++i)
     {
-        if(pVirtMem->Pagefile[i].bUsed)
+        if (pVirtMem->Pagefile[i].bUsed)
         {
-            TCHAR szText[256];
-
-            wsprintf(szText, _T("%s\\pagefile.sys %i %i"),
-                     pVirtMem->Pagefile[i].szDrive,
-                     pVirtMem->Pagefile[i].InitialValue,
-                     pVirtMem->Pagefile[i].MaxValue);
+            _stprintf(szText, _T("%s\\pagefile.sys %i %i"),
+                      pVirtMem->Pagefile[i].szDrive,
+                      pVirtMem->Pagefile[i].InitialValue,
+                      pVirtMem->Pagefile[i].MaxValue);
 
             /* Add it to our overall registry string */
             lstrcat(szPagingFiles + nPos, szText);
@@ -215,22 +231,22 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
         }
     }
 
-    if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                      lpKey,
-                      0,
-                      NULL,
-                      REG_OPTION_NON_VOLATILE,
-                      KEY_WRITE,
-                      NULL,
-                      &hk,
-                      NULL) == ERROR_SUCCESS)
+    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
+                       lpKey,
+                       0,
+                       NULL,
+                       REG_OPTION_NON_VOLATILE,
+                       KEY_WRITE,
+                       NULL,
+                       &hk,
+                       NULL) == ERROR_SUCCESS)
     {
         if (RegSetValueEx(hk,
                           _T("PagingFiles"),
                           0,
                           REG_MULTI_SZ,
                           (LPBYTE) szPagingFiles,
-                          (DWORD) nPos * sizeof(TCHAR)))
+                          (DWORD) nPos * sizeof(TCHAR)) == ERROR_SUCCESS)
         {
             bErr = FALSE;
         }
@@ -244,31 +260,11 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
 
 
 static VOID
-SetListViewColumns(HWND hwndListView)
+SetListBoxColumns(HWND hwndListBox)
 {
-    RECT rect;
-    LV_COLUMN lvc;
-
-    GetClientRect(hwndListView, &rect);
-
-    (void)ListView_SetExtendedListViewStyle(hwndListView,
-                                            LVS_EX_FULLROWSELECT);
+    const INT tabs[2] = {30, 120};
 
-    ZeroMemory(&lvc, sizeof(lvc));
-    lvc.mask = LVCF_SUBITEM | LVCF_WIDTH  | LVCF_FMT;
-    lvc.fmt = LVCFMT_LEFT;
-
-    lvc.cx = (INT)((rect.right - rect.left) * 0.1);
-    lvc.iSubItem = 0;
-    (void)ListView_InsertColumn(hwndListView, 0, &lvc);
-
-    lvc.cx = (INT)((rect.right - rect.left) * 0.3);
-    lvc.iSubItem = 1;
-    (void)ListView_InsertColumn(hwndListView, 1, &lvc);
-
-    lvc.cx = (INT)((rect.right - rect.left) * 0.6);
-    lvc.iSubItem = 2;
-    (void)ListView_InsertColumn(hwndListView, 2, &lvc);
+    SendMessage(hwndListBox, LB_SETTABSTOPS, (WPARAM)2, (LPARAM)&tabs[0]);
 }
 
 
@@ -303,6 +299,8 @@ static VOID
 OnSet(PVIRTMEM pVirtMem)
 {
     INT Index;
+    UINT Value;
+    BOOL bTranslated;
 
     pVirtMem->bSave = TRUE;
 
@@ -311,31 +309,47 @@ OnSet(PVIRTMEM pVirtMem)
                                      LB_GETCURSEL,
                                      0,
                                      0);
-
-    if(Index < pVirtMem->Count)
+    if (Index < pVirtMem->Count)
     {
-        TCHAR szText[255];
-
         /* check if custom settings are checked */
-        if(SendDlgItemMessage(pVirtMem->hSelf,
-                              IDC_CUSTOM,
-                              BM_GETCHECK,
-                              0,
-                              0) == BST_CHECKED)
+        if (IsDlgButtonChecked(pVirtMem->hSelf,
+                               IDC_CUSTOM) == BST_CHECKED)
         {
-            SendDlgItemMessage(pVirtMem->hSelf,
-                               IDC_INITIALSIZE,
-                               WM_GETTEXT,
-                               254,
-                               (LPARAM)szText);
-            pVirtMem->Pagefile[Index].InitialValue = _ttoi(szText);
-
-            SendDlgItemMessage(pVirtMem->hSelf,
-                               IDC_MAXSIZE,
-                               WM_GETTEXT,
-                               254,
-                               (LPARAM)szText);
-            pVirtMem->Pagefile[Index].MaxValue = _ttoi(szText);
+            Value = GetDlgItemInt(pVirtMem->hSelf,
+                                  IDC_INITIALSIZE,
+                                  &bTranslated,
+                                  FALSE);
+            if (!bTranslated)
+            {
+                /* FIXME: Show error message instead of setting the edit
+                          field to the previous value */
+                SetDlgItemInt(pVirtMem->hSelf,
+                              IDC_INITIALSIZE,
+                              pVirtMem->Pagefile[Index].InitialValue,
+                              FALSE);
+            }
+            else
+            {
+                pVirtMem->Pagefile[Index].InitialValue = Value;
+            }
+
+            Value = GetDlgItemInt(pVirtMem->hSelf,
+                                  IDC_MAXSIZE,
+                                  &bTranslated,
+                                  FALSE);
+            if (!bTranslated)
+            {
+                /* FIXME: Show error message instead of setting the edit
+                          field to the previous value */
+                SetDlgItemInt(pVirtMem->hSelf,
+                              IDC_MAXSIZE,
+                              pVirtMem->Pagefile[Index].MaxValue,
+                              FALSE);
+            }
+            else
+            {
+                pVirtMem->Pagefile[Index].MaxValue = Value;
+            }
         }
         else
         {
@@ -343,11 +357,8 @@ OnSet(PVIRTMEM pVirtMem)
             pVirtMem->Pagefile[Index].InitialValue = pVirtMem->Pagefile[Index].MaxValue = 0;
 
             // check to see if this drive is used for a paging file
-            if (SendDlgItemMessage(pVirtMem->hSelf,
-                                   IDC_NOPAGEFILE,
-                                   BM_GETCHECK,
-                                   0,
-                                   0) == BST_UNCHECKED)
+            if (IsDlgButtonChecked(pVirtMem->hSelf,
+                                   IDC_NOPAGEFILE) == BST_UNCHECKED)
             {
                 pVirtMem->Pagefile[Index].bUsed = TRUE;
             }
@@ -361,49 +372,55 @@ OnSet(PVIRTMEM pVirtMem)
 
 
 static BOOL
-OnSelChange(PVIRTMEM pVirtMem,
-            LPNMLISTVIEW pnmv)
+OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
 {
-    TCHAR szCustVals[255];
+    TCHAR szBuffer[64];
+    MEMORYSTATUSEX MemoryStatus;
+    ULARGE_INTEGER FreeBytes;
+    DWORDLONG FreeMemory;
     INT Index;
+    INT i;
+    INT FileSize;
 
-    UNREFERENCED_PARAMETER(pnmv);
-
-    Index = (INT)SendDlgItemMessage(pVirtMem->hSelf,
+    Index = (INT)SendDlgItemMessage(hwndDlg,
                                     IDC_PAGEFILELIST,
                                     LB_GETCURSEL,
                                     0,
                                     0);
-
-    if(Index < pVirtMem->Count)
+    if (Index < pVirtMem->Count)
     {
+        /* Set drive letter */
+        SetDlgItemText(hwndDlg, IDC_DRIVE,
+                       pVirtMem->Pagefile[Index].szDrive);
 
-        if(pVirtMem->Pagefile[Index].InitialValue  != 0 &&
-           pVirtMem->Pagefile[Index].MaxValue != 0)
+        /* Set available disk space */
+        if (GetDiskFreeSpaceEx(pVirtMem->Pagefile[Index].szDrive,
+                               NULL, NULL, &FreeBytes))
+        {
+            _stprintf(szBuffer, _T("%I64u MB"), FreeBytes.QuadPart / (1024 * 1024));
+            SetDlgItemText(hwndDlg, IDC_SPACEAVAIL, szBuffer);
+        }
+
+        if (pVirtMem->Pagefile[Index].InitialValue  != 0 &&
+            pVirtMem->Pagefile[Index].MaxValue != 0)
         {
             /* enable and fill the custom values */
             EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_MAXSIZE), TRUE);
             EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_INITIALSIZE), TRUE);
 
-            _itot(pVirtMem->Pagefile[Index].InitialValue , szCustVals, 10);
-            SendDlgItemMessage(pVirtMem->hSelf,
-                               IDC_INITIALSIZE,
-                               WM_SETTEXT,
-                               0,
-                               (LPARAM)szCustVals);
-
-            _itot(pVirtMem->Pagefile[Index].MaxValue, szCustVals, 10);
-            SendDlgItemMessage(pVirtMem->hSelf,
-                               IDC_MAXSIZE,
-                               WM_SETTEXT,
-                               0,
-                               (LPARAM)szCustVals);
-
-            SendDlgItemMessage(pVirtMem->hSelf,
-                               IDC_CUSTOM,
-                               BM_SETCHECK,
-                               1,
-                               0);
+            SetDlgItemInt(pVirtMem->hSelf,
+                          IDC_INITIALSIZE,
+                          pVirtMem->Pagefile[Index].InitialValue,
+                          FALSE);
+
+            SetDlgItemInt(pVirtMem->hSelf,
+                          IDC_MAXSIZE,
+                          pVirtMem->Pagefile[Index].MaxValue,
+                          FALSE);
+
+            CheckDlgButton(pVirtMem->hSelf,
+                           IDC_CUSTOM,
+                           BST_CHECKED);
         }
         else
         {
@@ -412,23 +429,40 @@ OnSelChange(PVIRTMEM pVirtMem,
             EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_INITIALSIZE), FALSE);
 
             /* is it system managed */
-            if(pVirtMem->Pagefile[Index].bUsed)
+            if (pVirtMem->Pagefile[Index].bUsed)
             {
-                SendDlgItemMessage(pVirtMem->hSelf,
-                                   IDC_SYSMANSIZE,
-                                   BM_SETCHECK,
-                                   1,
-                                   0);
+                CheckDlgButton(pVirtMem->hSelf,
+                               IDC_SYSMANSIZE,
+                               BST_CHECKED);
             }
             else
             {
-                SendDlgItemMessage(pVirtMem->hSelf,
-                                   IDC_NOPAGEFILE,
-                                   BM_SETCHECK,
-                                   1,
-                                   0);
+                CheckDlgButton(pVirtMem->hSelf,
+                               IDC_NOPAGEFILE,
+                               BST_CHECKED);
             }
         }
+
+        /* Set minimum pagefile size */
+        SetDlgItemText(hwndDlg, IDC_MINIMUM, _T("2 MB"));
+
+        /* Set recommended pagefile size */
+        MemoryStatus.dwLength = sizeof(MEMORYSTATUSEX);
+        if (GlobalMemoryStatusEx(&MemoryStatus))
+        {
+            FreeMemory = MemoryStatus.ullTotalPhys / (1024 * 1024);
+            _stprintf(szBuffer, _T("%I64u MB"), FreeMemory + (FreeMemory / 2));
+            SetDlgItemText(hwndDlg, IDC_RECOMMENDED, szBuffer);
+        }
+
+        /* Set current pagefile size */
+        FileSize = 0;
+        for (i = 0; i < 26; i++)
+        {
+            FileSize += pVirtMem->Pagefile[i].InitialValue;
+        }
+        _stprintf(szBuffer, _T("%u MB"), FileSize);
+        SetDlgItemText(hwndDlg, IDC_CURRENT, szBuffer);
     }
 
     return TRUE;
@@ -438,52 +472,21 @@ OnSelChange(PVIRTMEM pVirtMem,
 static VOID
 OnOk(PVIRTMEM pVirtMem)
 {
-    if(pVirtMem->bSave == TRUE)
+    if (pVirtMem->bSave == TRUE)
     {
         WritePageFileSettings(pVirtMem);
     }
-
-    if (pVirtMem->szPagingFiles)
-        HeapFree(GetProcessHeap(),
-                 0,
-                 pVirtMem->szPagingFiles);
-
-    HeapFree(GetProcessHeap(),
-             0,
-             pVirtMem);
 }
 
 
 static VOID
-OnCancel(PVIRTMEM pVirtMem)
+OnInitDialog(HWND hwnd, PVIRTMEM pVirtMem)
 {
-    if (pVirtMem->szPagingFiles)
-        HeapFree(GetProcessHeap(),
-                 0,
-                 pVirtMem->szPagingFiles);
-
-    HeapFree(GetProcessHeap(),
-             0,
-             pVirtMem);
-}
-
-
-static PVIRTMEM
-OnInitDialog(HWND hwnd)
-{
-    PVIRTMEM pVirtMem = (PVIRTMEM)HeapAlloc(GetProcessHeap(),
-                                            HEAP_ZERO_MEMORY,
-                                            sizeof(VIRTMEM));
-    if (pVirtMem == NULL)
-    {
-        EndDialog(hwnd, 0);
-    }
-
     pVirtMem->hSelf = hwnd;
-    pVirtMem->hListView = GetDlgItem(hwnd, IDC_PAGEFILELIST);
+    pVirtMem->hListBox = GetDlgItem(hwnd, IDC_PAGEFILELIST);
     pVirtMem->bSave = FALSE;
 
-    SetListViewColumns(pVirtMem->hListView);
+    SetListBoxColumns(pVirtMem->hListBox);
 
     /* Load the pagefile systems from the reg */
     if (ReadPageFileSettings(pVirtMem))
@@ -491,8 +494,6 @@ OnInitDialog(HWND hwnd)
         /* Parse our settings and set up dialog */
         ParseMemSettings(pVirtMem);
     }
-
-    return pVirtMem;
 }
 
 
@@ -502,23 +503,38 @@ VirtMemDlgProc(HWND hwndDlg,
                WPARAM wParam,
                LPARAM lParam)
 {
-    /* there can only be one instance of this dialog */
-    static PVIRTMEM pVirtMem = NULL;
+    PVIRTMEM pVirtMem;
 
     UNREFERENCED_PARAMETER(lParam);
 
+    pVirtMem = (PVIRTMEM)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
     switch (uMsg)
     {
         case WM_INITDIALOG:
-            pVirtMem = OnInitDialog(hwndDlg);
+            pVirtMem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(VIRTMEM));
+            if (pVirtMem == NULL)
+            {
+                EndDialog(hwndDlg, 0);
+                return FALSE;
+            }
+
+            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pVirtMem);
+
+            OnInitDialog(hwndDlg, pVirtMem);
+            break;
+
+        case WM_DESTROY:
+            if (pVirtMem->szPagingFiles)
+                HeapFree(GetProcessHeap(), 0,
+                         pVirtMem->szPagingFiles);
+            HeapFree(GetProcessHeap(), 0, pVirtMem);
             break;
 
         case WM_COMMAND:
-        {
             switch (LOWORD(wParam))
             {
                 case IDCANCEL:
-                    OnCancel(pVirtMem);
                     EndDialog(hwndDlg, 0);
                     return TRUE;
 
@@ -542,26 +558,17 @@ VirtMemDlgProc(HWND hwndDlg,
                 case IDC_SET:
                     OnSet(pVirtMem);
                     return TRUE;
-            }
-        }
-        break;
 
-        case WM_NOTIFY:
-        {
-            LPNMHDR pnmhdr = (LPNMHDR)lParam;
-
-            switch (pnmhdr->code)
-            {
-                case LVN_ITEMCHANGED:
-                {
-                    LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
-
-                    OnSelChange(pVirtMem, pnmv);
-
-                }
+                case IDC_PAGEFILELIST:
+                    switch HIWORD(wParam)
+                    {
+                        case LBN_SELCHANGE:
+                            OnSelChange(hwndDlg, pVirtMem);
+                            return TRUE;
+                    }
+                    break;
             }
-        }
-        break;
+            break;
     }
 
     return FALSE;