Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Мэпирование файла в память

Вопрос:
Недавно начал изучать assembler и не могу справиться с простой задачей:
1) промэпировать файл в память ничего с ним не делая
2) Научиться правильно пользоваться функцией GetLastError
Если не трудно найдите ошибку в коде.
includelib import32.lib
.386
.model flat

extrn ExitProcess : near
extrn CreateFileA : near
extrn MessageBoxA : near
extrn CreateFileMappingA : near
extrn UnmapViewOfFile : near
extrn CloseHandle : near
extrn MapViewOfFile : near

FILE_EXIST equ 3
GEN equ 80000000h or 40000000h
OPEN_NEW equ 0
READWRITE equ 00000004h

.data
FileName db '000.bat', 0
HFile    dd ?
HFM	 dd ?
PHFM	 dd ?
szTitle  db '123', 0
szMessage db 'ERROR'

.code
start:

       push 00h
       push 00h
       push offset FILE_EXIST
       push 00h
       push 00h
       push GEN
       push offset FileName
       call CreateFileA
       cmp ax,-1
       je ERROR
       mov HFile, eax       

С_MAP:
        xor eax,eax
	push eax
	push eax
	push eax
	push READWRITE
	push eax
	push offset HFile
	call CreateFileMappingA
	test eax,eax
	jz ERROR
	mov HFM, eax

MAPPING:
	xor eax,eax
	push eax
	push eax
	push eax
	push 00000002h
	push offset HFM
	call MapViewOfFile
	test eax,eax
	jz ERROR
	mov PHFM,eax

UNMAP:
	push offset PHFM
	call UnmapViewOfFile

ClOSEF:
	push offset HFile
	call CloseHandle
		

	jmp Exit

ERROR:
        xor eax,eax
        push 30h
        push offset szTitle
        push offset szMessage
        push eax
        call MessageBoxA


Exit:
       push 0
       call ExitProcess

       end start
Ответ:
различайте
push OFFSET x
и
push x

в первом случае в стек помещается смещение переменной в сегменте данных, т.е. при выполнении программы в стек занесется адрес переменной во втором случае в стек помещается непосредственно значение переменной суть идеи аналогична указателям в языке С, которые трактуются по-разному в зависимости от наличия или отсутствия '*'

по поводу GetLastError отладчик OllyDebugger отображает значение результата вызова этой функции справа под регистрами
includelib import32.lib
.386
.model flat

extrn ExitProcess : near
extrn CreateFileA : near
extrn MessageBoxA : near
extrn CreateFileMappingA : near
extrn UnmapViewOfFile : near
extrn CloseHandle : near
extrn MapViewOfFile : near

OPEN_EXISTING = 3
FILE_ATTRIBUTE_NORMAL = 80h
GENERIC_READ		  = 80000000h
GENERIC_WRITE		  = 40000000h
PAGE_READWRITE = 00000004h
FILE_MAP_WRITE = 02h

;--------------------------------------
.data
FileName	db '000.bat', 0
HFile		dd ?
HFM			dd ?
addr_of_the_mapped_view		dd ?

szTitle  db '123',0
szMessage db 'ERROR',0

;--------------------------------------
.code
_start:
    push 00h
    push FILE_ATTRIBUTE_NORMAL
    push OPEN_EXISTING
    push 00h
    push 00h
    push GENERIC_READ or GENERIC_WRITE
    push offset FileName
    call CreateFileA
    cmp eax,-1
    je ERROR
    mov HFile,eax

CREATE_MAPPING:
	xor eax,eax
	push eax			;lpName
	push eax			;dwMaximumSizeLow
	push eax			;dwMaximumSizeHigh
	push PAGE_READWRITE
	push eax
	push HFile
	call CreateFileMappingA
	test eax,eax
	jz ERROR
	mov HFM, eax

MAP:
	xor eax,eax
	push eax				;dwNumberOfBytesToMap
	push eax				;dwFileOffsetLow
	push eax				;dwFileOffsetHigh
	push FILE_MAP_WRITE		;dwDesiredAccess
	push HFM
	call MapViewOfFile
	test eax,eax
	jz ERROR
	mov addr_of_the_mapped_view,eax

UNMAP:
	push addr_of_the_mapped_view
	call UnmapViewOfFile

CLOSEMAP:
	push HFM
	call CloseHandle

ClOSEF:
	push HFile
	call CloseHandle
		
	jmp Exit

ERROR:
        xor eax,eax
        push 30h
        push offset szTitle
        push offset szMessage
        push eax
        call MessageBoxA


Exit:
       push 0
       call ExitProcess

end _start

   Вперёд
   Содержание