Размер файла = 28 Гб. Как с ним работать?

Тема в разделе "WASM.BEGINNERS", создана пользователем Magnum, 9 янв 2008.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    САБЖ
    нужно спроецировать файл в память и считать участок кода размером в несколько метров.

    Но до этого участка есть еще 12 Гб мусора.

    Как мне получить доступ к файлу, а точнее к тому месту, которое находится после 12 Гб...

    читал мсдн про функцию MapViewOfFile (можно там типа указать с какого смещения спроецировать), но функция каждый раз возвращает ноль.

    У кого есть кусок кода для работы с большими файлами - приведите плз...
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А какая ошибка? Как вызываешь? Что передавал CreateFileMapping?
     
  3. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Код (Text):
    1. hFile=CreateFile("HDD_IMAGE.ISO", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0,0);
    2. hMap=CreateFileMapping(hFile, 0, PAGE_READONLY, 7, 0, 0);    //получаем хэндл
    3. pMap=MapViewOfFile(hMap, FILE_MAP_READ, 3, 0, 0x100000); //хз, но возвращает 0
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    GetLastError() == ??
     
  5. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    0xC0000005
     
  6. Clerk

    Clerk Забанен

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

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    видимо как раз указанный c0000005, то бишь STATUS_ACCESS_VIOLATION
     
  8. Clerk

    Clerk Забанен

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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Magnum
    В CreateFileMapping передавай полный размер файла, а проецируй только нужную часть (не забыв выровнять смещение по гранулярности выделения памяти).
     
  10. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    еще есть _lseek или SetFilePointer :)
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Bugaga - это не катит.
    После ZwMapViewOfSection, в случае ошибки вызывается RtlNtStatusToDosError().
    Если NTSTATUS=STATUS_ACCESS_VIOLATION, то RtlNtStatusToDosError()=ERROR_NOACCESS(3E6h).
    Непонятно.
    Посмотри NTSTATUS:
    Код (Text):
    1. assume fs:nothing
    2. mov eax,fs:[TEB.LastStatusValue]
     
  12. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Все
    разобрался
    тема закрыта

    По непонятным причинам, смэпить файл не давало стороннее приложение
    (которым собсна и создавался откат)
    Сперва закрыл резидента
    потом в рку снял перехваты
    и все заработало

    всем спасибо за ответы
     
  13. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Clerk
    Почему это не катит? Не маппировать файл, а просто открыть его, поставить указатель на начало нужного блока и прочитать ReadFile.
     
  14. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    rmn
    то же самое

    Резидент не давал считывать файло.