Вопрос по CreateFileMapping.

Тема в разделе "WASM.BEGINNERS", создана пользователем jaga, 7 янв 2009.

  1. jaga

    jaga Дмитрий

    Публикаций:
    0
    Регистрация:
    25 окт 2008
    Сообщения:
    33
    Адрес:
    Пермская обл.
    Хочу написать программу которая изменяет файл. Вродебы все правильно сделал. Посмотрел в Olly, программа загружает файл в память, но как раз в том месте где она должна перезаписать в файле какиенибудь данны она просто останавливается...
    Помогите если кто знает в чем проблема!
    Код (Text):
    1.                 ...
    2.                 invoke CreateFile,FileName,GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
    3.                 mov    [hFile],eax
    4.                 invoke CreateFileMapping,[hFile],NULL,PAGE_READONLY,0,0,NULL
    5.                 mov    [hFileMap],eax
    6.                 invoke MapViewOfFile,[hFileMap],FILE_MAP_READ,0,0,0
    7.                 mov    [nFile],eax
    8.                 ...
    Этим кодом я загружаю файл в память.
    Код (Text):
    1.                 ...
    2.                 mov     [nFile],eax
    3.                 ...
    А во сдесь программа и останавливается. и дальше никак...
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    и
    Это как?
     
  3. jaga

    jaga Дмитрий

    Публикаций:
    0
    Регистрация:
    25 окт 2008
    Сообщения:
    33
    Адрес:
    Пермская обл.
    Пробовал поставить PAGE_READWRITE, но так он вообще не загружет его. А в Olly пишет ERROR_ACCESS_DENIED (00000005)
    Вот и не знаю что делать.
     
  4. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Блин, ну так правильно. У тебя файл открыт только для чтения. =) Поставь ВЕЗДЕ права на запись!
     
  5. jaga

    jaga Дмитрий

    Публикаций:
    0
    Регистрация:
    25 окт 2008
    Сообщения:
    33
    Адрес:
    Пермская обл.
    Код (Text):
    1. include 'C:\asm\fasm\include\win32ax.inc'
    2.  
    3. hFile           dd      ?
    4. hFileMap        dd      ?
    5. nFile           dd      ?
    6. FileName        db      'Test.txt',0
    7.  
    8. section '.code' code executable readable writeable
    9.  
    10.  
    11. start:
    12.                 invoke CreateFile,FileName,GENERIC_WRITE ,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    13.                 mov    [hFile],eax
    14.                 invoke CreateFileMapping,[hFile],NULL,PAGE_READWRITE,0,0,0
    15.                 mov    [hFileMap],eax
    16.                 invoke MapViewOfFile,[hFileMap],FILE_MAP_WRITE,0,0,0
    17.                 mov    [nFile],eax
    18.                 invoke  ExitProcess,0
    19.  
    20. .end start
    Вот код. Вроде везде поставил права на запись везде... Неработает. Может я что ещё пропустил?
     
  6. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    пропустил, урок № 13
     
  7. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Какая-то каша у тебя. То на запись нет прав, то на чтение.
     
  8. jaga

    jaga Дмитрий

    Публикаций:
    0
    Регистрация:
    25 окт 2008
    Сообщения:
    33
    Адрес:
    Пермская обл.
    Его я уже читал. Код что я написал какраз взят оттуда. Что я неправильно щяс написал? Ктото может сказать?
     
  9. jaga

    jaga Дмитрий

    Публикаций:
    0
    Регистрация:
    25 окт 2008
    Сообщения:
    33
    Адрес:
    Пермская обл.
    Спасибо заработало))
    Исправил на
    Код (Text):
    1. invoke CreateFile,FileName,GENERIC_WRITE or GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    и все заработало))
     
  10. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    а в уроке написано, что размер файла изменять нельзя :dntknw:
     
  11. jaga

    jaga Дмитрий

    Публикаций:
    0
    Регистрация:
    25 окт 2008
    Сообщения:
    33
    Адрес:
    Пермская обл.
    Почему нельзя? ты измениш, а он просто допишет))
     
  12. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Ну да, нельзя - мы не ведь проецируем только существующие байты, так? Значит, мы не сможем проецировать отсутствующее пространство в конце файла. Или если мы спроецируем конец файла так, чтобы в конце его были нули вместо отсутствующих данных, и запишем в место них новые данные, то размер файла увеличится?
    И еще вопрос - если мы что-то через WriteFile пишем в объект, созданный функцией CreateFile, то произойдут ли те же изменения в проекциях этого файла, если объект будет открыт через CreateFileMapping? Или эти два объекта не связаны между собой?
     
  13. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    При открытии файла (CreateFile) он проецируется в память.
    Функции (ReadFilе/WriteFile) на самом деле читают/пишут в проекцию файла. Как известно никаких проблем с увеличением файла не происходит.
     
  14. Partner

    Partner Павел

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

    Уточнение.
    Mapped файлы и открытые через CreateFile могут быть когерентны, но не обязаны. Наверное дело в буферизации/кешировании.

    Более того, Microsoft не рекомендует так делать:
    File handles that have been used to create file-mapping objects must not be used in subsequent calls to file I/O functions, such as ReadFile and WriteFile. Generally, if a file handle has been used in a successful call to this function, do not use that handle unless you first close the corresponding file-mapping object.
     
  15. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Спасибо.
     
  16. gh05t

    gh05t New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    34
    Partner
    На память он проецируется только после вызова MapViewOfFile, а до этого (CreateFile, WriteFile) работа идет с файлом непосредственно на диске.

    jaga
    CloseHandle не забывай вызывать.
     
  17. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Я имел ввиду, что работа с файлом (чтение/запись) также происходит (под капотом, так сказать) через проецирование в память.
    Где-то встречал такую информацию, но к сожалению, сейчас подтвердить это не могу.
    Давайте подождем, что скажут более знающие люди.


    [Добавлено]
    О, подобная тема уже обсуждалась
    http://www.wasm.ru/forum/viewtopic.php?id=7623