стрельба по-македонски ДМИТРИЙ КОВАЛЕНКО Спецвыпуск: Хакер, номер #071, стр. 071-040-4 Memory-mapped файл – это, по сути, именованный участок оперативной памяти, к которому может получить доступ любой работающий процесс. Приведем две программы, на примере которых рассмотрим основные методы работы с memory-mapped файлами. Первая программа – MemoryMapped1, будет создавать memory-mapped файл и записывать в него строчки, введенные с клавиатуры. Вторая программа – MemoryMapped2, будет считывать эти строчки из memory-mapped файла и выводить их на монитор. Обе программы будут консольными. Начнем с первой программы. Сначала напишем ее на Visual C++. Откроем Visual Studio и создадим новое консольное приложение MemoryMapped1. Сразу же отключим в настройках компилятора использование UNICODE. Пропишем в MemoryMapped1.cpp заголовочные файлы windows.h (чтобы можно было без проблем использовать Windows API) и stdio.h: // заголовочные файлы #include <windows.h> #include <stdio.h> Затем впишем в main() следующий код: int main() { // создаем memory-mapped файл HANDLE hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,\ PAGE_READWRITE, 0, 1024, LPTSTR("DigitalPoem")); Этот код вызывает API CreateFileMapping, которая создает memory-mapped файл. Коротко остановимся на параметрах, передаваемых в CreateFileMapping. Первый параметр – хендл ранее открытого файла на диске. Никакого файла на диске мы не открывали, поэтому мы передаем здесь INVALID_HANDLE_VALUE. Второй параметр – указатель на структуру SECURITY_ATTRIBUTES, в которой мы можем установить права доступа к нашему memory-mapped файлу. Ничего особого мы устанавливать не собираемся, поэтому второй параметр у нас 0. Третий параметр – защита (protection) memory-mapped файла. Мы хотим читать и писать memory-mapped файл, поэтому переедем константу PAGE_READWRITE. Четвертый и пятый параметр – двойные слова. Вместе они определяют одно 64-разрядное число — размер memory-mapped файла в байтах. Нам хватит одного килобайта, поэтому четвертый параметр (который определяет старшее двойное слово в значении размера) у нас равен 0, а пятый параметр (младшее двойное слово в значении размера) равен 1024. И, наконец, пятый параметр «DigitalPoem» — уникальное имя нашего memory-mapped файла. Если API CreateFileMapping завершилась успешно, в hFile будет находиться хендл созданного файла. В случае неудачи в hFile будет 0. Чтобы отследить это, вставляем в нашу программу проверку: // ошибка? if(hFile==0) { // да, ошибка — выведем сообщение и закончим работу printf("Error! CreateFileMapping returns NULL.\n"); return 0; } После того, как memory-mapped файл создан, его надо отобразить в адресное пространство приложения. Для этого используется API MapViewOfFile. Код следующий: // отобразим memory-mapped файл с полным доступом LPVOID pFileContent = MapViewOfFile(hFile,\ FILE_MAP_ALL_ACCESS, 0, 0, 0); |