Я не говорю, что вы хотите сделать это или что это лучшая практика, но вы можете найти, что она работает достаточно хорошо для вас. Похоже, что вы просили.
Сводка: регулярно касайтесь каждой страницы в процессе, на странице за раз.
Как насчет потока, который работает в фоновом режиме и просыпается один раз каждые N секунд. Каждый раз, когда страница просыпается, она пытается прочитать с адреса X. Попытка защищена обработчиком исключений на случай, если вы прочитали неверный адрес. Затем увеличьте X на размер страницы.
65536 страниц в 4 ГБ, 49152 страницы в 3 ГБ, 32768 страниц в 2 ГБ. Разделите время простоя (ночное время простоя) на то, как часто вы хотите (пытаетесь) попасть на каждую страницу.
BYTE *ptr;
ptr = NULL;
while(TRUE)
{
__try
{
BYTE b;
b = *ptr;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
// ignore, some pages won't be accessible
}
ptr += sizeofVMPage;
Sleep(N * 1000);
}
Вы можете получить значение sizeOfVMPage из значения dwPageSize в возвращенном результате из GetSystemInfo ().
Не пытайтесь избежать обработчика исключений, используя if (! IsBadReadPtr (ptr)), потому что другие потоки в приложении могут одновременно изменять защиту памяти. Если вы отстегнетесь из-за этого, почти невозможно определить причину (это, скорее всего, будет не повторяемое состояние гонки), поэтому не тратьте время на это.
Конечно, вы захотите отключить эту ветку в течение дня и запускать ее только в нерабочее время.