Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

стрельба по-македонски

ДМИТРИЙ КОВАЛЕНКО

Спецвыпуск: Хакер, номер #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);

Назад на стр. 071-040-3  Содержание  Вперед на стр. 071-040-5