Ассемблер под Windows №10

Работа с файлами


Доброго времени суток, уважаемые подписчики.
При написании программы-примера к сожалению понял, что нам не обойтись без использования функций 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.

Сайт управляется системой uCoz