как прочитать кусок из CreateFileMapping...

Тема в разделе "WASM.BEGINNERS", создана пользователем sheef_ad, 27 янв 2010.

  1. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    То есть я промепировал весь файл(invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,0,NULL), затем пытаюсь прочитать кусок из этого файла и тут возникают проблемы. Например строчка invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0 - работает так как надо, но она весь файл читает, а мне нужен кусок. Третий и четвертый параметр в MapViewOfFile якобы смещение, а пятый кол-во байт. Но когда я делаю что то в этом роде:MapViewOfFile,hMapFile,FILE_MAP_READ,0,2,0 - перестает вообще что либо выводить из файла. Еще один момент - конструкция типа MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,5 у меня все равно читает ВЕСЬ файл, а не 5 байт как я хочу.
    С чем это связано и как это правильно делается?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Тамизвращения, но ответы на твой вопрос среди них есть. Только рассуждения про предел в 2Гб там потом не подтвердились - просто у меня на диске места не хватало, так что всё работает и с файлами любого размера.
     
  3. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    это точно, попробую что то полезное от туда вытянуть...
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Маппинг производится страницами по 4Кб, поэтому, во-первых, смещение должно быть кратно 4К иначе "the function fails", во-вторых, если размер файла меньше 4К, то он ес-но маппится целиком, если же больше, то 4К, но ни как не 5 байт "как ты хочешь" :)
     
  5. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Ну это уже как то проясняет ситуацию. Тогда такой вопрос: А как тогда мне "вырезать" из памяти именно 5 байт по нужному мне смещению (размер файла меньше 4Кб)?
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Прибавь к указателю MapView нужное смещение и получишь указатель на свои 5 байт. Если хочешь можешь их скопировать в свой буфер через movsb
     
  7. Clerk

    Clerk Забанен

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

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Я "смещу" толко начало, и файл все равно будет читаться от нового начала ДО КОНЦА (чего как раз мне ненадо).

    а вариант с movsb неработает. Может я чегото здесь недопонимаю? Вот код:

    Код (Text):
    1. mas db " "
    2.  
    3.                                                         invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0
    4.                     mov mMemory,eax
    5.                     lea di,mas
    6.                     lea si,mMemory
    7.                     movsb
    8.  
    9.                     invoke SetWindowText,hSuma,mas
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если не надо, то вместо маппинга юзай обычное чтение файла SetFilePointer + ReadFile

    Видимо да :)
    Код (Text):
    1. mas db 8 dup (0)
    2.  
    3. invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0
    4. mov mMemory,eax
    5. mov esi,eax
    6. lea edi,[mas]
    7. mov [edi+5],0 ;замык.ноль
    8. mov ecx,5
    9. rep movsb
     
  10. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Наконец-то! Заработало именно так как я и хотел. Спасибо большое!

    п.с.
    mov [edi+5],0 - здесь я прокоментировал(убрал строку), потому что компилятор на нее ругался "invalid instruction operand"
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    sheef_ad
    Дык и используй соответствующие функции SetFilePointer, ReadFile, а файловый маппинг придуман совсем не для твоих целей :).

    А прибавить смещение тебе leo советовал после прочтения страницы, а не чтобы "сместить чтение", и в movsb используй esi, edi, а не их 16 разрядные версии.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    опоздал пока писал
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    угу, нужно
    mov byte ptr [edi+5],0
     
  14. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    MapViewOfFile не читает весь файл. она вообще не читает файлы. для чтения файлов юзается ReadFile.