Как правильно выставить параметры в функции MapViewOfFile

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 5 окт 2011.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    Как правильно выставить параметры в функции MapViewOfFile если нужно только часть файла

    В одном из уроков Iczelion'а Win32 API. Урок 13. Memory Mapped файлы
    Расказывается как можно пpомэппиpовать файл при помощи функции CreateFileMapping

    Код (Text):
    1. invoke CreateFileMapping,hFileRead,NULL,PAGE_READONLY,0,0,NULL
    Там же пишется что сpазу же после создания выходного файла, мы вызываем MapViewOfFile,
    чтобы пpомэппиpовать желаемую поpцию MMF в память.

    Код (Text):
    1. invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0
    В последних трёх параметрах выставлены нули
    Что означает что в этом примере файл читается весь
    После вызова MapViewOfFile получаете указатель на блок памяти, котоpый содеpжит данные из файла.
    Пробывал у себя протестировать всё получается нормально функция возвращает адрес как и положено
    Но если мне нужен не весь файл а только его часть (например начиная с пятисотого байта)
    Как я не пытался подставлять в последних параметрах числа
    Например вот так:

    Код (Text):
    1. invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,500,0
    Всё равно функция возвращает ноль
    Подскажите пожалуйста как правильно нужно записывать последнии три параметра
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Размер должен быть кратен AllocationGranularity.
    Узнать гранулярность можно с помощью GetSystemInfo
     
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    AllocationGranularity = 65536
    Только как и что записать в параметрах чтобы загнал в память именно с пятисотого байта честно говоря не понял
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    C пятисотого не получится. Только блоками кратными granularity.
    А в чем проблема адресовать пятисотый байт в блоке?
     
  5. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    Partner Спасибо за подсказки.
    Более менее с твоей помощью разобрался.
    Отображать файл только блоками кратными granularity это не слишком удобно (хотя не исключено что я ошибаюсь).
    В принцыпи я так понял что (например для моих целей) лучше не заморачиватся, а ставить последними параметрами одни нули,
    то есть отображать в память весь файл, ну и работать с ней как с обычной памятью стандартными средствами.

    Например так:

    Код (Text):
    1. invoke CreateFileMapping,hFileRead,NULL,PAGE_READONLY,0,0,NULL
    2. mov  hMapFile,eax
    3. invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0
    4. mov pMemory,eax
    5. mov esi,pMemory
    6. add esi,500
    Ещё раз спасибо.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В отображении файла в память вообще только одно "удобство" - автоматическая подгрузка данных с диска по мере обращения к ним. Если ты собираешься обрабатывать не часть(части) файла, а весь целиком, то и маппинг тут по большому счету не нужен - проще самому выделить память и считать в нее файл целиком
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    leo
    В свете "последних событий" такими советами лучше просто так не бросаться. :)
    Мегабайта по четыре за раз с отключённой буферизацией, как Вы сами когда-то советовали. И ну не в кучу же.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    l_inc
    Ну если речь идет о копировании больших файлов, то ес-но незачем ими засорять память ;)

    А вот насчет "не в кучу же" - не понял, или я, или ты :)
    Непосредственно в куче выделяются блоки размером не более 512К (и смысла нет, и структура виндовой кучи не позволяет), а все, что больше по любому выделяется отдельно через VirtualAlloc и в куче хранится только список адресов этих виртуал-блоков
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    leo
    Речь не совсем об этом. Даже если бы эти четыре метра выделялись в самой куче, это не особо бы повлияло на её фрагментацию. Тут скорее проблема в том, что создаются дополнительные структуры данных для нового блока (например, в том же выделенном через VirtualAlloc блоке), а указатель возвращается не особо-то выравненный, что, например, важно для небуферизованного чтения. Ну и к тому же на страницу больше нужного выделяется.
     
  10. Thread81

    Thread81 New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    1
    Как сделать что бы из большого файла на определенном куске памяти читался кусками файл.
     
  11. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    Ответ в заголовке темы.