#include "precomp.h"
+static BOOL OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem);
static LPCTSTR lpKey = _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management");
static BOOL
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;
}
}
-
}
}
}
-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;
}
{
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;
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;
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;
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,
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);
}
}
{
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);
}
{
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);
}
}
- 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;
}
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]);
}
OnSet(PVIRTMEM pVirtMem)
{
INT Index;
+ UINT Value;
+ BOOL bTranslated;
pVirtMem->bSave = TRUE;
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
{
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;
}
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
{
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;
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))
/* Parse our settings and set up dialog */
ParseMemSettings(pVirtMem);
}
-
- return pVirtMem;
}
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;
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;