Данные на этой странице не
Данные на этой странице не
Создание эффективных Win32-приложений - ДЖ. Рихтер
Рис. 15-1. продолжение
if (MessageBox(NULL, TEXT("Do you want to access this data later?"), szAppName, MB_YESNO) == IDNO) {
// Мы хотим сохранить эту страницу физической памяти в нашем // процессе, но ее данные нас больше не интересуют.
// Скажем системе, что данные на этой странице не изменялись.
// Примечание: поскольку MEM_RESET разрушает данные, VirtualAlloc округляет // параметры с базовым адресом и размером до наиболее безопасных значений. // Вот пример:
// VirtualAlloc(pvData, 5000, MEM_RESET, PAGE_READWRITE)
// сбросит 0 страниц на процессорах с размером страниц более 4 Кб // и 1 страницу на процессорах с четырехкилобайтовыми страницами.
// Поэтому, чтобы вызов VirtualAlloc всегда был успешным, надо // сначала вызвать VirtualQuery и определить точный размер страницы.
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(pszData, &mbi, sizeof(mbi));
VirtualAlloc(pszData, mbi.RegionSize, MEM_RESET, PAGE_READWRITE);
}
// передаем объем памяти, равный размеру оперативной памяти MEMORYSTATUS mst;
GlobalMemoryStatus(&mst);
PVOID pvDummy = VirtualAlloc(NULL, mst.dwTotalPhys,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
// изменяем содержимое всех страниц в регионе, чтобы все страницы,
// модифицированные в оперативной памяти, записывались в страничный файл ZeroMemory(pvDummy, mst.dwTotalPhys);
// сравниваем нашу страницу данных с тем,
// что было записано туда изначально if (lstrcmp(pszData, szTestData) == 0) {
// Данные на этой странице совпали с тем, что мы туда записывали.
// Функция ZeroMemory заставила систему записать нашу // страницу в страничный файл.
MessageBox(NULL, TEXT("Modified data page was saved."), szAppName, MB_OK);
} else {
// Данные на этой странице не совпадают с тем, что мы туда записывали.
// ZeroMemory не заставила систему записать измененную страницу // в страничный файл.
MessageBox(NULL, TEXT("Modified data page was NOT saved."), szAppName, MB_OK);