Привет. Как можно сделать неограниченный по размеру Shared Memory (память, которая будет доступна для многих процессов)? Я знаю, что с помощью функций для работы с файл маппингом можно отобразить файл в память, но только с фиксированным размером. Как можно изменять размер этой выделенной памяти? Очень много времени ищу выход, - ничего не получается. Подскажите правильный вариант работы. Заранее благодарен.
Нашел немного инфы по данной функции, - еще не пробовал, но это круто! Спасибо большое! Даже не знал, что с помощью Native функций можно делать такие вещи. Можете подсказать еще хороший справочник (оффлайн или онлайн) по Native функциям?
Charm0nt Нет, это сервис(вы ведь прерывания функциями не считаете). Это стаб вы вызываете как функцию.
Clerk Хорошо, не знал, спасибо большое. А вы работали раньше с NtExtendSection? Интересует, корректно ли работает это, так как раньше еще не приходилось работать с ntdll.dll.
Charm0nt Странный вопрос. Работает, ну если корректно будите юзать. Нэйтив вобще проще чем винапи, сервисы ядра имеют красивую структуру, в отличие от винапи, где всё сделано криво и не логично.
Clerk Ну вопрос возник потому, что это вроде как недокументированный сервис. Поэтому поинтересовался на всякий случай. Хотя я сам проверю еще.
Пока что ничего не получается. Подскажите, как правильно работать с этим сервисом. Как я сейчас работаю: Код (Text): function NtExtendSection(SectionHandle: HANDLE; SectionSize: PLARGE_INTEGER): NTSTATUS; stdcall; external 'ntdll.dll' name 'NtExtendSection'; ... h := CreateFileMapping(MAXDWORD, nil, PAGE_READWRITE, 0, 4096, 'File'); p := MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 0); ... Работаю с файлом. Могу записать 4096 байт. Все пока что в норме. ... NewLength := 10000; // NewLength имеет тип Int64 NtExtendSection(h, @NewLength); ... Возможно теперь мне выделилось 10000 байт под данные, но это не так. Размер секции не изменился. ... UnMapViewOfFile(p); CloseHandle(h);
Charm0nt кроме сорцов винды есть и другие источники. Например msdn, http://www.ozon.ru/context/detail/id/2734991/ ну и web. В вашем случае во-первых вставьте везде проверки на ошибки, и во-вторых как описано в той самой книжке И похоже что это работает только с файловыми проекциями.
Charm0nt CreateFileMapping при вызове NtCreateSection не ставит атрибут SECTION_EXTEND_SIZE, так что вам придётся использовать NtCreateSection вместо CreateFileMapping.
Я сам не смогу разобраться в этом пока что (( Не могли бы вы, по возможности, привести код? Есть другие способы решения поставленной задачи?
Charm0nt пробуйте, ничего сложного, документация по ф-циям есть, примеры использования в инете тоже есть. Опишите подробнее задачу. Почти всегда есть другие способы
Хорошо, но если будет возможность - приведите код для примера. В общем задача у меня следующая: я хочу реализовать неограниченную по размеру разделяемую секцию данных (то есть чтобы один или несколько процессов пишут некоторые данные в память, и остальные сразу же имеют доступ к этим данным). Я решил использовать файл маппинг. Большим неудобством есть то, что я не могу изменить размер секции. То есть если я задал секции размер 4096 байт, то мне не удастся его поменять в будущем (хотя как видим, с помощью сервисов Nt это как то можно сделать, но мне еще не получилось). С самого начала я хотел попробовать реализовать эту задачу следующим образом: 1) Создаю некоторый класс-обертку над файл маппингом. 2) В этом классе я создаю новый отображаемый в память файл с помощью CreateFileMapping некоторого размера. Например, все те же 4096 байт. В этом файле класс будет хранить необходимые данные для его правильной работы. 3) Когда какая то программа, которая использует мой класс вызывает метод Write, то класс просматривает содержимое нашего отображаемого файла с настройками. В этом файле должны находиться имена новых отображаемых файлов с уже с нашими данными, размер уже записанных данных в каждый файл и максимально возможный размер записанных данных. Если в файле с параметрами нету вообще никакой записи, то есть пользователь впервые добавляет данные, тогда класс должен просто создать новый отображаемый файл в памяти с помощью CreateFileMapping, записать необходимую информацию в файл с настройками и добавить пользовательские данные в новый созданный файл. 4) Тут же была следующая проблема: если какая нибудь программа создала файл маппинг и записала в него пользовательские данные и сразу же завершила свою работу, то, по идеи, этот файл с пользовательскими данными мы теряем, так как больше ни один процесс не открыл этот файл. Нормального решения этой проблемы я еще не нашел, по этому так сразу не стал реализовывать этот способ. Возможно я плохо объяснил свою первую мысль для реализации задачи, поэтому извините.
Charm0nt Это инвалидное виньапишное название. Вы решили использовать секции. Вот и используйте сервисы ядра, а не виньапи. Вам ведь сказали в #12 что нужны соответствующие флажки, иначе референс на обьекте ядро не выполнит.