Работа с файлами
Доброго времени суток, уважаемые подписчики.
При написании программы-примера к сожалению понял, что нам не обойтись без использования функций Windows работы с памятью. Поэтому перед программой я кратко опишу все используемые функции, их не так уж и много, всего 4:
GlobalAlloc
Создаёт блок памяти. Вход:
- Размер запрашиваемой памяти
- Аттрибуты создаваемого блока памяти
Выход = handle блока памяти
GlobalLock
Отображает блок в памяти. Вход:
- Блок памяти для отображения
Выход = offset на начало отображённых данных
GlobalUnlock
Прекращает отображения блока в память. Вход:
Выход = не 0
GlobalFree
Уничтожает блок памяти. Вход:
- Handle блока для уничтожения
Выход = не 0
Как Вы уже успели заметить, в Windows мы должны не просто выделить программе блок памяти, а создать её блок виртуальной памяти и открыть его в память
А теперь сама программа:
include kernel32.inc
include user32.inc
include def32.inc
.386
.model flat
.data
error db 'Ошибка',0
error1 db 'Файл не найден,0
error2 db 'Заданный файл не существует',0
fileName dd 0
programHandle dd 0
fileHandle dd 0
memoryHandle dd 0
memoryOffset dd 0
SizeRW dd 0
.code
_start:
xor ebx,ebx
push ebx
call GetModuleHandle
mov programHandle,eax
call GetCommandLine
mov edi,eax
mov al,20h
mov ecx,-1
repne scasb
cmp byte ptr [edi],bl
jne File_OK
mov eax,offset error1
jmp program_error
File_OK:
repe scasb
dec edi
mov esi,edi
mov fileName,edi
push ebx
push FILE_ATTRIBUTE_ARCHIVE
push OPEN_EXISTING
push ebx
push FILE_SHARE_READ
push GENERIC_READ
push esi
call CreateFile
test eax,eax
jnz file_opened_OK
mov eax,offset error2
jmp program_error
file_opened_OK:
mov fileHandle,eax
push ebx
push eax
call GetFileSize
mov edi,eax
push eax
push GMEM_MOVEABLE or GMEM_ZEROINIT
call GlobalAlloc
mov memoryHandle,eax
push eax
call GlobalLock
mov memoryOffset,eax
push ebx
push offset SizeRW
push edi
push eax
push fileHandle
call ReadFile
push fileHandle
call CloseHandle
call CheckSymbol
push ebx
push FILE_ATTRIBUTE_ARCHIVE
push TRUNCATE_EXISTING
push ebx
push FILE_SHARE_WRITE
push GENERIC_WRITE
push fileName
call CreateFile
push ebx
push offset SizeRW
push edi
push memoryOffset
push FileHandle
call WriteFile
push fileHandle
call CloseHandle
program_end:
push memoryHandle
call GlobalUnlock
push memoryHandle
call GlobalFree
push ebx
call ExitProcess
program_error:
push MB_IconWarning
push offset error
push eax
push ebx
call MessageBox
jmp program_end
CheckSymbol proc
push edi
mov al,'s'
mov ecx,edi
inc ecx
mov edi,memoryOffset
loop_check:
repne scasb
test ecx,ecx
jz end_check
mov byte ptr [edi-1],'$'
jmp loop_check
end_check:
pop edi
ret
CheckSymbol endp
end _start
|
Программа заменяет все 's' на '$', использование:
имя_программы имя_файла
Обязательное содержимое файлов дополнений, допишите недостающие части:
kernel32.inc:
extrn __imp__ExitProcess@4:dword
extrn __imp__GetModuleHandleA@4:dword
extrn __imp__GetCommandLineA@0:dword
extrn __imp__CloseHandle@4:dword
extrn __imp__GlobalAlloc@8:dword
extrn __imp__GlobalLock@4:dword
extrn __imp__GlobalUnlock@4:dword
extrn __imp__GlobalFree@4:dword
extrn __imp__CreateFileA@28:dword
extrn __imp__ReadFile@20:dword
extrn __imp__WriteFile@20:dword
extrn __imp__GetFileSize@8:dword
ExitProcess equ __imp__ExitProcess@4
GetModuleHandle equ __imp__GetModuleHandleA@4
GetCommandLine equ __imp__GetCommandLineA@0
CloseHandle equ __imp__CloseHandle@4
GlobalAlloc equ __imp__GlobalAlloc@8
GlobalLock equ __imp__GlobalLock@4
GlobalUnlock equ __imp__GlobalUnlock@4
GlobalFree equ __imp__GlobalFree@4
CreateFile equ __imp__CreateFileA@28
ReadFile equ __imp__ReadFile@20
WriteFile equ __imp__WriteFile@20
GetFileSize equ __imp__GetFileSize@8
|
def32.inc:
OPEN_EXISTING equ 3
CREATE_ALWAYS equ 2
TRUNCATE_EXISTING equ 5
GMEM_MOVEABLE equ 2
GMEM_ZEROINIT equ 40h
GENERIC_READ equ 80000000h
GENERIC_WRITE equ 40000000h
FILE_SHARE_READ equ 1
FILE_SHARE_WRITE equ 2
FILE_ATTRIBUTE_ARCHIVE equ 20h
MB_ICONWARNING equ 30h
|
На сегодня это всё. Если есть какие вопросы, пишите, обязательно отвечу. В следующий раз мы рассмотрим написанную сегодня программу. Пишите, Dark_Lord@RusFAQ.ru, Dark_Lord@land.ru.