ільки фізична пам'ять (ОЗУ), але також пам'ять, резервируемая операційною системою на жорсткому диску. Цей вид пам'яті називається віртуальною пам'яттю і утворює файл підкачки. У міру необхідності операційна середу звертається до цього файлу, щоб помістити в нього поки непотрібні системі дані або навпаки вважати в ОЗУ вже потребовавшиеся. WinAPI надає спосіб роботи з файлами підкачки допомогою об'єкта файлового відображення.
Принцип файлового відображення є одним з основоположних принципів роботи з віртуальною пам'яттю в Windows. За допомогою техніки файлового відображення можна створити область пам'яті, яка при нестачі фізичної пам'яті буде скидатися не в файл підкачки, а в якій-небудь вказаний нами файл. Таким чином, при зміні пам'яті, виділеної і спроектованої за допомогою механізму відображення, вміст файлу теж буде змінено.
Для створення об'єкта файлового відображення необхідно використовувати WinAPI функцію CreateFileMapping. Вона має наступний формат:
CreateFileMapping (hFile, _ATTRIBUTES lpFileMappingAttributes, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow,
LPCTSTR lpName);
Функція WinAPI OpenFileMapping відкриває існуючий об'єкт файлового відображення. Функція має наступний формат:
OpenFileMapping (
DWORD dwDesiredAccess, bInheritHandle, lpName);
Для проектування об'єкта файлового відображення на пам'ять необхідно використовувати WinAPI функцію MapViewOfFile. Вона має наступний формат:
LPVOID MapViewOfFile (
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap);
Функція WinAPI UnmapViewOfFile звільняє виділену пам'ять для об'єкта файлового відображення. Функція має наступний формат:
OOL UnmapViewOfFile (
LPVOID lpBaseAddress);
Для закриття об'єкта файлового відображення необхідно використовувати WinAPI функцію CloseHandle. Вона має наступний формат:
BOOL CloseHandle (
HANDLE hFileMapObj);
Для приміщення зібраної інформації в віртуальну пам'ять використовуємо функцію CopyMemory.
. 4 М'ютекс
Під час роботи моніторингу, DLL з фільтр-функцією проектується системою в адресний простір всіх GUI процесів, де фільтр-функції збирають відстежуємо інформацію активності користувача.
Після отримання інформації нам необхідно помістити її в буфер, організований у вигляді об'єкта файлового відображення. Але так як DLL спроектовані на адресні простори процесів, і в кожного з них свої системні потоки, то для виключення ситуації асинхронного доступу до буфера пам'яті необхідно використовувати обробник критичних секцій. Заміною оброблювача критичних секцій в Межпроцессорная масштабі є об'єкти взаємовиключення - м'ютекси.
М'ютекс - одномісний семафор, службовець для синхронізації одночасно виконуються потоків. М'ютекси можуть знаходитися в двох станах в захопленому і вільному. Також м'ютекси, як і будь-які інші об'єкти в Windows, можуть знаходитися в двох станах: сигнальному і несигнальному стані. Коли мьютекс захоплений яким-небудь потоком, він знаходиться в несигнальному стані, коли мьютекс вільний, він знаходиться в сигнальному стані.
Для роботи з м'ютексів в ОС Windows визначені WinAPI функції:
Функція CreateMutex викликається для створення мьютекса, її формат:
HANDLE CreateMutex (_ATTRIBUTES lpMutexAttributes, bInitialOwner, lpName);
Функція OpenMutex використовується для відкриття існуючого мьютекса, її формат:
OpenMutex (dwDesiredAccess, bInheritHandle, lpName);
Для звільнення мьютекса використана функція ReleaseMutex, її формат:
BOOL WINAPI ReleaseMutex (hMute);
Для здійснення ексклюзивного доступу до буфера використовуємо конструкцію:
();
//код працює з загальними даними ();
Функція WaitForSingleObject очікує, поки зазначений об'єкт знаходиться в несигнальному стані або поки не закінчиться час очікування, затримуючи при цьому виконання потоку в поточному процесі. При зміні об'єкта на сигнальний стан, вона отримує доступ до буферу і встановлює мьютекс в несигнальному стан. Функція має наступний формат:
WaitForSingleObject (hHand...