void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) { UINT uIndex = 0; switch (id) { case IDCANCEL: EndDialog(hWnd, id); break; case IDC_RESERVE: // Reserve enough address space to hold the array of structures. g_pSomeData = (PSOMEDATA) VirtualAlloc(NULL, MAX_SOMEDATA * sizeof(SOMEDATA), MEM_RESERVE, PAGE_READWRITE); // Disable the Reserve button and enable all the other controls. EnableWindow(GetDlgItem(hWnd, IDC_RESERVE), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_INDEXTEXT), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_INDEX), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_USE), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_GARBAGECOLLECT), TRUE); // Force the index edit control to have the focus. SetFocus(GetDlgItem(hWnd, IDC_INDEX)); // Force the memory map to update InvalidateRect(hWnd, &g_rcMemMap, FALSE); break; case IDC_INDEX: if (codeNotify != EN_CHANGE) break; uIndex = GetDlgItemInt(hWnd, id, NULL, FALSE); if ((g_pSomeData != NULL) && chINRANGE(0, uIndex, MAX_SOMEDATA - 1)) { MEMORY_BASIC_INFORMATION mbi; /* Retrieves information about a range of pages * in the virtual address space of the calling process. * To retrieve information about a range of pages * in the address space of another process, use the VirtualQueryEx function. * * lpAddress [in, optional] * A pointer to the base address of the region of pages to be queried. * This value is rounded down to the next page boundary. * To determine the size of a page on the host computer, use the GetSystemInfo function. * If lpAddress specifies an address above the highest memory address accessible to the process, * the function fails with ERROR_INVALID_PARAMETER. * * lpBuffer [out] * A pointer to a MEMORY_BASIC_INFORMATION structure * in which information about the specified page range is returned. */ VirtualQuery(&g_pSomeData[uIndex], &mbi, sizeof(mbi)); /* State * The state of the pages in the region. * This member can be one of the following values. * MEM_COMMIT * 0x1000 * Indicates committed pages for which physical storage has been allocated, * either in memory or in the paging file on disk. * */ BOOL bOk = (mbi.State == MEM_COMMIT); if (bOk) bOk = g_pSomeData[uIndex].bInUse; EnableWindow(GetDlgItem(hWnd, IDC_USE), !bOk); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), bOk); } else { EnableWindow(GetDlgItem(hWnd, IDC_USE), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), FALSE); } break; case IDC_USE: uIndex = GetDlgItemInt(hWnd, IDC_INDEX, NULL, FALSE); // NOTE: New pages are always zeroed by the system /* Commit memory allocated for g_pSomeData[uIndex] */ VirtualAlloc( &g_pSomeData[uIndex], sizeof(SOMEDATA), MEM_COMMIT, PAGE_READWRITE); /* Mark this part of array as used */ g_pSomeData[uIndex].bInUse = TRUE; EnableWindow(GetDlgItem(hWnd, IDC_USE), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), TRUE); // Force the Clear button control to have the focus. SetFocus(GetDlgItem(hWnd, IDC_CLEAR)); // Force the memory map to update InvalidateRect(hWnd, &g_rcMemMap, FALSE); break; case IDC_CLEAR: uIndex = GetDlgItemInt(hWnd, IDC_INDEX, NULL, FALSE); g_pSomeData[uIndex].bInUse = FALSE; EnableWindow(GetDlgItem(hWnd, IDC_USE), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), FALSE); // Force the Use button control to have the focus. SetFocus(GetDlgItem(hWnd, IDC_USE)); break; case IDC_GARBAGECOLLECT: GarbageCollect(g_pSomeData, MAX_SOMEDATA, sizeof(SOMEDATA)); // Force the memory map to update InvalidateRect(hWnd, &g_rcMemMap, FALSE); break; } }
void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) { UINT uIndex = 0; switch (id) { case IDCANCEL: EndDialog(hWnd, id); break; case IDC_RESERVE: // Reserve enough address space to hold the array of structures. g_pSomeData = (PSOMEDATA) VirtualAlloc(NULL, MAX_SOMEDATA * sizeof(SOMEDATA), MEM_RESERVE, PAGE_READWRITE); // Disable the Reserve button and enable all the other controls. EnableWindow(GetDlgItem(hWnd, IDC_RESERVE), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_INDEXTEXT), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_INDEX), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_USE), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_GARBAGECOLLECT), TRUE); // Force the index edit control to have the focus. SetFocus(GetDlgItem(hWnd, IDC_INDEX)); // Force the memory map to update InvalidateRect(hWnd, &g_rcMemMap, FALSE); break; case IDC_INDEX: if (codeNotify != EN_CHANGE) break; uIndex = GetDlgItemInt(hWnd, id, NULL, FALSE); if ((g_pSomeData != NULL) && chINRANGE(0, uIndex, MAX_SOMEDATA - 1)) { MEMORY_BASIC_INFORMATION mbi; VirtualQuery(&g_pSomeData[uIndex], &mbi, sizeof(mbi)); BOOL bOk = (mbi.State == MEM_COMMIT); if (bOk) bOk = g_pSomeData[uIndex].bInUse; EnableWindow(GetDlgItem(hWnd, IDC_USE), !bOk); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), bOk); } else { EnableWindow(GetDlgItem(hWnd, IDC_USE), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), FALSE); } break; case IDC_USE: uIndex = GetDlgItemInt(hWnd, IDC_INDEX, NULL, FALSE); // NOTE: New pages are always zeroed by the system VirtualAlloc(&g_pSomeData[uIndex], sizeof(SOMEDATA), MEM_COMMIT, PAGE_READWRITE); g_pSomeData[uIndex].bInUse = TRUE; EnableWindow(GetDlgItem(hWnd, IDC_USE), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), TRUE); // Force the Clear button control to have the focus. SetFocus(GetDlgItem(hWnd, IDC_CLEAR)); // Force the memory map to update InvalidateRect(hWnd, &g_rcMemMap, FALSE); break; case IDC_CLEAR: uIndex = GetDlgItemInt(hWnd, IDC_INDEX, NULL, FALSE); g_pSomeData[uIndex].bInUse = FALSE; EnableWindow(GetDlgItem(hWnd, IDC_USE), TRUE); EnableWindow(GetDlgItem(hWnd, IDC_CLEAR), FALSE); // Force the Use button control to have the focus. SetFocus(GetDlgItem(hWnd, IDC_USE)); break; case IDC_GARBAGECOLLECT: GarbageCollect(g_pSomeData, MAX_SOMEDATA, sizeof(SOMEDATA)); // Force the memory map to update InvalidateRect(hWnd, &g_rcMemMap, FALSE); break; } }