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

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

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

Спецвыпуск: Хакер, номер #071, стр. 071-040-5


Опять коротко остановимся на параметрах, которые мы передаем в MapViewOfFile. Первый параметр – хендл memory-mapped файла. Вторым параметром у нас передается FILE_MAP_ALL_ACCESS. Это значит, что мы хотим получить полный доступ к отображенному файлу. Третий и четвертый параметры определят 64-разрядное смещение отображаемого участка относительно начала файла. Поскольку мы хотим отображать файл с начала (с нулевого смещения), у нас нули. Ну, и пятый параметр – число типа DWORD, которое определяет, сколько байт нужно отобразить. Мы передаем 0 – это значит, что нам нужно все.

Если MapViewOfFile завершилась успешно, в pFileContent будет смещение отображаемого файла. В случае неудачи там будет NULL. Отслеживаешь, и если MapViewOfFile вернула NULL, то закрываешь хендл memory-mapped файла с помощью API CloseHandle и выходишь:

// memory-mapped файл отображен?

if(pFileContent==NULL)

{

// нет, открыть memory-mapped файл не удалось

printf("Error! MapViewOfFile returns NULL.");

// закрываем хендл memory-mapped файла и выходим

CloseHandle(hFile);

return 0;

};

Дальше организуем цикл, который читает строки с клавиатуры. В качестве буфера для этих строк используется наш memory-mapped файл. Цикл выглядит следующим образом:

// инициализируем счетчик сообщений

int i = 1;

// будем передавать через memory-mapped файл сообщения

// до тех пор, пока пользователь не введет «stop»

while(strcmp((char*)pFileContent, "stop")!=0)

{

// ожидаем ввода

printf("Message #%d: ", i);

scanf("%1023s\0", (char*)pFileContent, 1024);

// увеличиваем счетчик сообщений

i++;

};

Когда программа завершает работу, прекращаем отображение memory-mapped файла с помощью API UnmapViewOfFile и закрываем его хендл:

// закрываем отображение и хендл memory-mapped файла

UnmapViewOfFile(pFileContent);

CloseHandle(hFile);

// выходим

return 0;

}

На Delphi MemoryMapped1 реализуется точно так же. Чтобы не повторяться, прокомментируем принципиальные моменты.

Открываешь Borland Delphi и создаешь новое консольное приложение. Сохраняешь его под именем MemoryMapped1. Затем прописываешь в начале файла MemoryMapped1.dpr:

{$APPTYPE CONSOLE}

// использовать Windows API

uses Windows;

Затем прописываешь все необходимые переменные:

var

// хендл memory-mapped файла

hFile: THandle;

// указатель на отображение memory-mapped файла в памяти

pFileContent: pointer;

// счетчик количества отображений

i: integer = 1;

// строка, в которую будет осуществляться ввод

s: string;

Затем создаешь memory-mapped файл и проверяешь, успешно ли завершилась CreateFileMapping:

begin

// создаем memory-mapped файл

hFile:= CreateFileMapping(INVALID_HANDLE_VALUE, nil,

PAGE_READWRITE, 0, 1024, 'DigitalPoem');

// memory-mapped файл открыт?

if(hFile=0) then

begin

// нет, открыть memory-mapped файл не удалось

writeln('Error! MapViewOfFile returns nil.');

exit;

end;

Отображаешь memory-mapped файл в память и проверяешь, получилось ли:

// отобразим memory-mapped файл с полным доступом

pFileContent:= MapViewOfFile(hFile,

FILE_MAP_ALL_ACCESS, 0, 0, 0);

// memory-mapped файл отображен?

if pFileContent=nil then

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