Неограниченный размер для Shared Memory

Тема в разделе "WASM.WIN32", создана пользователем Charm0nt, 28 авг 2010.

  1. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Привет.
    Как можно сделать неограниченный по размеру Shared Memory (память, которая будет доступна для многих процессов)? Я знаю, что с помощью функций для работы с файл маппингом можно отобразить файл в память, но только с фиксированным размером. Как можно изменять размер этой выделенной памяти? Очень много времени ищу выход, - ничего не получается.
    Подскажите правильный вариант работы. Заранее благодарен.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    NtExtendSection
     
  3. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Нашел немного инфы по данной функции, - еще не пробовал, но это круто!
    Спасибо большое!
    Даже не знал, что с помощью Native функций можно делать такие вещи. Можете подсказать еще хороший справочник (оффлайн или онлайн) по Native функциям?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charm0nt
    Это не функция, а сервис. Справочник - сурцы венды.
     
  5. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Но ведь NtExtendSection - функция?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charm0nt
    Нет, это сервис(вы ведь прерывания функциями не считаете). Это стаб вы вызываете как функцию.
     
  7. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Clerk
    Хорошо, не знал, спасибо большое. А вы работали раньше с NtExtendSection? Интересует, корректно ли работает это, так как раньше еще не приходилось работать с ntdll.dll.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charm0nt
    Странный вопрос. Работает, ну если корректно будите юзать. Нэйтив вобще проще чем винапи, сервисы ядра имеют красивую структуру, в отличие от винапи, где всё сделано криво и не логично.
     
  9. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Clerk
    Ну вопрос возник потому, что это вроде как недокументированный сервис. Поэтому поинтересовался на всякий случай. Хотя я сам проверю еще.
     
  10. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Пока что ничего не получается.
    Подскажите, как правильно работать с этим сервисом.
    Как я сейчас работаю:

    Код (Text):
    1. function NtExtendSection(SectionHandle: HANDLE; SectionSize: PLARGE_INTEGER): NTSTATUS; stdcall; external 'ntdll.dll' name 'NtExtendSection';
    2. ...
    3. h := CreateFileMapping(MAXDWORD, nil, PAGE_READWRITE, 0, 4096, 'File');
    4. p := MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    5. ...
    6. Работаю с файлом. Могу записать 4096 байт. Все пока что в норме.
    7. ...
    8. NewLength := 10000; // NewLength имеет тип Int64
    9. NtExtendSection(h, @NewLength);
    10. ...
    11. Возможно теперь мне выделилось 10000 байт под данные, но это не так. Размер секции не изменился.
    12. ...
    13. UnMapViewOfFile(p);
    14. CloseHandle(h);
     
  11. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Charm0nt кроме сорцов винды есть и другие источники. Например msdn, http://www.ozon.ru/context/detail/id/2734991/ ну и web.
    В вашем случае во-первых вставьте везде проверки на ошибки, и во-вторых как описано в той самой книжке
    И похоже что это работает только с файловыми проекциями.
     
  12. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Charm0nt
    CreateFileMapping при вызове NtCreateSection не ставит атрибут SECTION_EXTEND_SIZE, так что вам придётся использовать NtCreateSection вместо CreateFileMapping.
     
  13. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Я сам не смогу разобраться в этом пока что ((
    Не могли бы вы, по возможности, привести код?
    Есть другие способы решения поставленной задачи?
     
  14. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Charm0nt пробуйте, ничего сложного, документация по ф-циям есть, примеры использования в инете тоже есть.
    Опишите подробнее задачу. Почти всегда есть другие способы :)
     
  15. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Хорошо, но если будет возможность - приведите код для примера.

    В общем задача у меня следующая: я хочу реализовать неограниченную по размеру разделяемую секцию данных (то есть чтобы один или несколько процессов пишут некоторые данные в память, и остальные сразу же имеют доступ к этим данным). Я решил использовать файл маппинг. Большим неудобством есть то, что я не могу изменить размер секции. То есть если я задал секции размер 4096 байт, то мне не удастся его поменять в будущем (хотя как видим, с помощью сервисов Nt это как то можно сделать, но мне еще не получилось).

    С самого начала я хотел попробовать реализовать эту задачу следующим образом:
    1) Создаю некоторый класс-обертку над файл маппингом.
    2) В этом классе я создаю новый отображаемый в память файл с помощью CreateFileMapping некоторого размера. Например, все те же 4096 байт. В этом файле класс будет хранить необходимые данные для его правильной работы.
    3) Когда какая то программа, которая использует мой класс вызывает метод Write, то класс просматривает содержимое нашего отображаемого файла с настройками. В этом файле должны находиться имена новых отображаемых файлов с уже с нашими данными, размер уже записанных данных в каждый файл и максимально возможный размер записанных данных. Если в файле с параметрами нету вообще никакой записи, то есть пользователь впервые добавляет данные, тогда класс должен просто создать новый отображаемый файл в памяти с помощью CreateFileMapping, записать необходимую информацию в файл с настройками и добавить пользовательские данные в новый созданный файл.
    4) Тут же была следующая проблема: если какая нибудь программа создала файл маппинг и записала в него пользовательские данные и сразу же завершила свою работу, то, по идеи, этот файл с пользовательскими данными мы теряем, так как больше ни один процесс не открыл этот файл. Нормального решения этой проблемы я еще не нашел, по этому так сразу не стал реализовывать этот способ.

    Возможно я плохо объяснил свою первую мысль для реализации задачи, поэтому извините.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charm0nt
    Это инвалидное виньапишное название. Вы решили использовать секции. Вот и используйте сервисы ядра, а не виньапи. Вам ведь сказали в #12 что нужны соответствующие флажки, иначе референс на обьекте ядро не выполнит.
     
  17. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Clerk
    Хорошо, буду знать. Также буду что то предпринимать.