Пишем DLL на FASM'e - FASM - Ответ 13022562

Memory Mapping File - обмен через файл подкачки

..значит на данном этапе я выяснил, что мой процесс может пересылать данные моей-же библиотеке без каких-либо ограничений. Можно отправить "бандеролью" хоть всю секцию и принять ответ тем-же способом. Но рассмотрим другую ситуацию, когда в наш/внутренний диалог с библиотекой хочет вмешаться кто-то третий, например совсем посторонний процесс из другого адресного пространства.

Для таких случаев Microsoft предусмотрела вполне легальный способ - это именованные файлы, которые создаются в пространстве файла-подкачки

(pagefile.sys)

, что делает их общими для всех процессов. Поскольку подкачка есть ничто-иное как продолжение PhysicalMemory

(физ.памяти)

, большой Билли назвал такие файлы

"Memory Mapping File"

- файлы, отображённые в память. Процессы могут получить доступ к MMF тремя способами: по имени, по дескриптору, и по его дубликату. Схема ниже демонстрирует работу этого механизма:

Рассмотрим в общих чертах, откуда берутся и куда исчезают такие файлы..

Основа Win -

объекты ядра

, т.е. она построена на объектной модели. Диспетчер объектов позволяет создавать и оперировать несколькими типами объектов, в том числе и

File-Mapping object

. На самом деле каждый объект - это просто блок памяти, доступный только самому ядру. По известным причинам, юзеру не светит прямой доступ к ядерным объектам, для него выделена только директория "Global\", в которой он может создавать расшаренные

(или нет)

файлы. К каждому файлу привязывается счётчик обращений, и если этот счётчик сбрасывается в нуль, то файл автоматом удаляется. Для просмотра системных объектов можно воспользоваться утилитой

WinObj

от Sysinternal.

Теперь разработаем план действий..

Поскольку файла ещё нет, значит его нужно создать функцией

CreateFileMapping()

. Не важно кто будет этим заниматься, главное что-бы он опубликовал всем имя этого файла, ..ну или его дескриптор. Суть в том, что "один" создаёт - а "общество" пользуется этим файлом. В общем случае, при публикации последовательность функций такая:

CreateFileMapping() - создать файл с дескриптором (-1) =Invalid;
MapViewOfFile() - отобразить его в памяти;
CopyMemory() - записать в него общую информацию;
UnmapViewOfFile() - освободить от него память;
CloseHandle() - закрыть дескриптор.

С этого момента любой процесс может прочитать этот файл по имени, или наоборот записать в него информацию, если при создании это было предусмотрено флагами защиты "CreateFileMapping()". В свою очередь тот-кто хочет прочитать этот файл, должен проделать эти-же операции, только в первом пункте не создать, а открыть его чз

OpenFileMapping()

.

Вернуться к обсуждению:

Пишем DLL на FASM'e FASM