Мониторинг активности пользователя в ОС Windows XP
3.3 Виртуальная память
Под памятью в ОС Windows подразумевается не только физическая память (ОЗУ), но также память, резервируемая операционной системой на жестком диске. Этот вид памяти называется виртуальной памятью и образует файл подкачки. По мере необходимости операционная среда обращается к этому файлу, чтобы поместить в него пока ненужные системе данные или наоборот считать в ОЗУ уже потребовавшиеся. WinAPI предоставляет способ работы с файлами подкачки посредством объекта файлового отображения.
Принцип файлового отображения является одним из основополагающих принципов работы с виртуальной памятью в Windows. С помощью техники файлового отображения можно создать область памяти, которая при нехватке физической памяти будет сбрасываться не в файл подкачки, а в какой-нибудь указанный нами файл. Таким образом, при изменении памяти, выделенной и спроецированной с помощью механизма отображения, содержимое файла тоже будет изменено.
Для создания объекта файлового отображения необходимо использовать WinAPI функцию CreateFileMapping. Она имеет следующий формат:
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName );
Функция WinAPI OpenFileMapping открывает существующий объект файлового отображения. Функция имеет следующий формат:
HANDLE OpenFileMapping(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName );
Для проецирования объекта файлового отображения на память необходимо использовать WinAPI функцию MapViewOfFile. Она имеет следующий формат:
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap );
Функция WinAPI UnmapViewOfFile освобождает выделенную память для объекта файлового отображения. Функция имеет следующий формат:
BOOL UnmapViewOfFile(
LPVOID lpBaseAddress );
Для закрытия объекта файлового отображения необходимо использовать WinAPI функцию CloseHandle. Она имеет следующий формат:
BOOL CloseHandle(
HANDLE hFileMapObj );
Для помещения собранной информации в виртуальную память используем функцию CopyMemory.