Хочу написать программу которая изменяет файл. Вродебы все правильно сделал. Посмотрел в Olly, программа загружает файл в память, но как раз в том месте где она должна перезаписать в файле какиенибудь данны она просто останавливается... Помогите если кто знает в чем проблема! Code (Text): ... invoke CreateFile,FileName,GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL mov [hFile],eax invoke CreateFileMapping,[hFile],NULL,PAGE_READONLY,0,0,NULL mov [hFileMap],eax invoke MapViewOfFile,[hFileMap],FILE_MAP_READ,0,0,0 mov [nFile],eax ... Этим кодом я загружаю файл в память. Code (Text): ... mov [nFile],eax ... А во сдесь программа и останавливается. и дальше никак...
Пробовал поставить PAGE_READWRITE, но так он вообще не загружет его. А в Olly пишет ERROR_ACCESS_DENIED (00000005) Вот и не знаю что делать.
Code (Text): include 'C:\asm\fasm\include\win32ax.inc' hFile dd ? hFileMap dd ? nFile dd ? FileName db 'Test.txt',0 section '.code' code executable readable writeable start: invoke CreateFile,FileName,GENERIC_WRITE ,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL mov [hFile],eax invoke CreateFileMapping,[hFile],NULL,PAGE_READWRITE,0,0,0 mov [hFileMap],eax invoke MapViewOfFile,[hFileMap],FILE_MAP_WRITE,0,0,0 mov [nFile],eax invoke ExitProcess,0 .end start Вот код. Вроде везде поставил права на запись везде... Неработает. Может я что ещё пропустил?
Его я уже читал. Код что я написал какраз взят оттуда. Что я неправильно щяс написал? Ктото может сказать?
Спасибо заработало)) Исправил на Code (Text): invoke CreateFile,FileName,GENERIC_WRITE or GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL и все заработало))
Ну да, нельзя - мы не ведь проецируем только существующие байты, так? Значит, мы не сможем проецировать отсутствующее пространство в конце файла. Или если мы спроецируем конец файла так, чтобы в конце его были нули вместо отсутствующих данных, и запишем в место них новые данные, то размер файла увеличится? И еще вопрос - если мы что-то через WriteFile пишем в объект, созданный функцией CreateFile, то произойдут ли те же изменения в проекциях этого файла, если объект будет открыт через CreateFileMapping? Или эти два объекта не связаны между собой?
При открытии файла (CreateFile) он проецируется в память. Функции (ReadFilе/WriteFile) на самом деле читают/пишут в проекцию файла. Как известно никаких проблем с увеличением файла не происходит.
Да, все проекции когерентны, даже если они находятся в разных процессах, если только файл не на сетевом диске. Уточнение. 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.
Partner На память он проецируется только после вызова MapViewOfFile, а до этого (CreateFile, WriteFile) работа идет с файлом непосредственно на диске. jaga CloseHandle не забывай вызывать.
Я имел ввиду, что работа с файлом (чтение/запись) также происходит (под капотом, так сказать) через проецирование в память. Где-то встречал такую информацию, но к сожалению, сейчас подтвердить это не могу. Давайте подождем, что скажут более знающие люди. [Добавлено] О, подобная тема уже обсуждалась http://www.wasm.ru/forum/viewtopic.php?id=7623