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

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

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

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


begin

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

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

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

CloseHandle(hFile);

exit;

end;

Организуешь цикл передачи в memory-mapped файл введенных с клавиатуры строк:

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

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

while s<>'stop' do

begin

// читаем строку с клавиатуры

write('Message #', i, ': ');

readln(s);

// записываем строку в memory-mapped файл

CopyMemory(pFileContent, pchar(s), length(s));

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

inc(i);

end;

И после всего:

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

UnmapViewOfFile(pFileContent);

CloseHandle(hFile);

end.

Все, теперь можно начинать писать программу MemoryMapped2, которая будет считывать строчки из memory-mapped файла и выводить их в консоль. Сначала рассмотрим соответствующий код на Visual C++.

Снова открываешь Visual Studio и создаешь консольное приложение MemoryMapped2. Выделяешь исходный код MemoryMapped1 и копируешь в файл MemoryMapped2.cpp. Затем целиком удаляешь цикл ввода строк, начинающийся со строчки while(strcmp((char*)pFileContent, "stop")!=0), и вместо него вписываешь цикл чтения строк из memory-mapped файла:

// считываем из memory-mapped файла сообщения, пока

// не считаем "stop"

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

{

// в memory-mapped файле есть строка?

if(strcmp((char*)pFileContent, "")!=0)

{

// да — выводим сообщение

printf("Incoming message #%d: %s\n",\

i, (char*)pFileContent);

// очищаем (заполняем нулями) буфер

memset(pFileContent, '\0', 1024);

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

i++;

}

};

Вот и все. Как видишь, единственное отличие MemoryMapped2 от MemoryMapped1 в том, что чтение из memory-mapped файла, а не запись в него. Аналогично, чтобы получить MemoryMapped2 на Delphi, в исходном коде MemoryMapped1.pas достаточно заменить цикл записи строк, который начинается с while s<>'stop' do, на цикл чтения:

// считываем из memory-mapped файла сообщения, пока

// не считаем "stop"

while s<>'stop' do

begin

// в memory-mapped файле есть строка?

if (byte(pFileContent^)<>0) then

begin

// да — выводим сообщение

s:=string(pchar(pFileContent));

writeln('Incoming message ',i,': ', s);

// очищаем (заполняем нулями) буфер

FillMemory(pFileContent, 1024, 0);

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

inc(i);

end;

end;

Конечно, это не единственный способ «подружить» между собой две программы. Есть еще DDE, именованные каналы, сокеты, COM, DCOM... Но это намного сложнее и требует больше кода.

#include <stdio.h>

char format[] = "%s %s\n";

int main()

{

__asm{

mov eax, offset format ; заносим в eax смещение строки format

mov bl, byte ptr [eax+2] ; теперь в bl третий байт из строки format

}

}

__asm{

mov ecx, 10 ; заносим в ecx число 10

jmp short lab ; принудительный короткий переход на lab

xor ecx, ecx ; обнуление ecx (никогда не произойдет из-за предыдущего

; короткого перехода)

lab: dec ecx ; декремент ecx

cmp ecx, 0 ; сравниваем с 0

jne lab ; если не равно 0, переходим на метку lab

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