This macrolibrary syswin.htm
is MS Windows version of macroinstructions which encapsulate system calls in EuroAssembler.
List of services hired from Windows API:
CloseHandle
CreateDirectory
CreateFile
CreateFileMapping
ExitProcess
FileTimeToDosDateTime
FindClose
FindFirstFile
FindNextFile
GetCommandLine
GetEnvironmentVariable
GetLastError
GetModuleFileName
GetModuleFileName
GetModuleHandle
GetSystemInfo
GetSystemTime
GlobalFree
MapViewOfFile
MultiByteToWideChar
SetFilePointer
SystemTimeToFileTime
UnmapViewOfFile
VirtualAlloc
VirtualFree
WriteFile
In order to port EuroAssembler to a different operating system:
- Specify 1..4 character shortcut of the system, e.g.
Lin, BSD, OS2, Sol,....- Create source file
sys%^EuroasmOS.htm, similar to thissyswin.htm.- Rewrite all macros in this source file, exactly keeping their parameters, input, output and functionality.
- Rebuild EuroAssembler.
- Update documentation.
syswin HEAD ; Start of interface, which is included to other modules.
SysANSI2Wide %MACRO Codepage, ANSIPtr, ANSISize, WidePtr, WideSize
PUSH EAX,ECX,EDX
WinAPI MultiByteToWideChar, %Codepage, MB_PRECOMPOSED, %ANSIPtr, %ANSISize, %WidePtr, %WideSize
TEST EAX
POP EDX,ECX,EAX
%ENDMACRO SysANSI2Wide
SysAssignFile %MACRO File, FilenamePtr, FilenameSize
FileAssign %File, %FilenamePtr,Size=%FilenameSize, Unicode=0
%ENDMACRO SysAssignFile
SysCloseFile %MACRO File
FileClose %File
%ENDMACRO SysCloseFile
SysMkDir %MACRO theFile
FileMkDir %theFile
%ENDMACRO SysMkDir
SysCreateFile %MACRO File, FileName$
FileAssign %File,%FileName$
FileMkDir %File
FileCreate %File
%ENDMACRO SysCreateFile
SysEachFile %MACRO File, Callback
FileEach %File, %Callback
%ENDMACRO SysEachFile
SysExitProcess %MACRO Errorlevel
TerminateProgram %Errorlevel
%ENDMACRO SysExitProcess
SysGetArg %MACRO ArgNr
GetArg %ArgNr
%ENDMACRO SysGetArg
SysGetCurrentDirectory %MACRO DirNamePtr
PUSH EAX,ECX,EDX
WinAPI GetCurrentDirectoryA, MAX_PATH_SIZE, %DirNamePtr
CMP EAX,1 ; Set CF if EAX=0 on return.
POP EDX,ECX,EAX
%ENDMACRO SysGetCurrentDirectory
SysGetEnvironment %MACRO NamePtr, NameSize, OutEnvBuffer
PUSHD %OutEnvBuffer, %NameSize,%NamePtr
CALL SysGetEnvironment@RT:
SysGetEnvironment@RT: PROC1
PUSHAD
: Invoke EaBufferReserve::,SysGetEnvironment@RT
MOV EBX,EAX
MOV ESI,[ESP+36] ; NamePtr
MOV ECX,[ESP+40] ; NameSize
BufferStore EBX,ESI,ECX
Msg cc=C,'9314',SysGetEnvironment@RT ; Allocation error storing to buffer in !1H.
BufferStore EBX,=W(0),2
BufferRetrieve EBX
: Invoke EaBufferRelease::,EBX
; ESI is pointer to ASCIIZ variable name.
SUB ECX,ECX
WinAPI GetEnvironmentVariableA,ESI,ECX,ECX
MOV ECX,EAX ; Required value size.
TEST EAX
JZ .99:
MOV EDI,[ESP+44] ; OutEnvBuffer
BufferNew EDI,ECX
Msg cc=C,'9314',SysGetEnvironment@RT ; Allocation error storing to buffer in !1H.
JC .99:
WinAPI GetEnvironmentVariableA,ESI,EAX,ECX
BufferDecrement EDI
TEST EAX ; ZF=0 on success.
.99: POPAD
RET 12
ENDPROC1 SysGetEnvironment@RT:
%ENDMACRO SysGetEnvironment
Win (or Lin etc)
depending on OS which the EuroAssembler is compiled for.
SysGetEuroasmOS %MACRO EuroasmOSPtr
MOV EAX,"Win" ; OS version is hardwired here. Change it in ported versions.
%ENDMACRO SysGetEuroasmOS
Macro SysGetStackSize returns the amount of memory in bytes
reserved during linkage of the actually running euroasm.exe
. Obtained value will be used for protection from stack overflow error.
Stack in the loaded PECOFF executable is allocated in virtual address space somewhere below ImageBase but I didn't find a reliable way how to get its VA, so I read it from optional header in the loaded executable module.
SysGetStackSize %MACRO
PUSHAD
MOV EBX,1M ; Initialize SizeOfStackReserve with default value.
WinAPI GetModuleHandle,0
TEST EAX
STC
JZ .R%.:
CMPW [EAX+PFMZ_DOS_HEADER.e_magic],'MZ'
STC
JNE .R%.:
ADD EAX,[EAX+PFMZ_DOS_HEADER.e_lfanew] ; Get pointer to PE signature.
CMPD [EAX],'PE' ; EAX points to PE signature, file header and optional header.
STC
JNE .R%.:
CLC
MOV EBX,[EAX+4+SIZE#PFCOFF_FILE_HEADER+PFPE_OPTIONAL_HEADER32.SizeOfStackReserve]
.R%.: MOV [ESP+28],EBX ; %ReturnEAX.
POPAD
%ENDMACRO SysGetStackSize
SysGetUTC %MACRO
CALL SysGetUTC@RT:
SysGetUTC@RT: PROC1
PUSH ECX,EDX,ESI,EDI
SUB ESP,8 + 16 ; 8 + SIZE# SYSTEMTIME
MOV EDI,ESP ; EDI is pointer to FILETIME (QWORD).
LEA ESI,[ESP+8] ; ESI is pointer to SYSTEMTIME.
WinAPI GetSystemTime,ESI
WinAPI SystemTimeToFileTime,ESI,EDI
; FILETIME at EDI is now an unsigned integer QWORD with 100ns intervals elapsed since midnight 1.1.1601.
; 134774 days elapsed between 1.1.1601 and 1.1.1970,
; i.e. 134774*24*60*60*10000000=0x019DB1DE_D53E8000 must be subtracted from FILETIME at EDI.
MOV EAX,[EDI+0]
MOV EDX,[EDI+4]
SUB EAX,0xD53E8000
SBB EDX,0x019DB1DE
MOV ECX,10000000
DIV ECX
ADD ESP,8 + 16 ; 8 + SIZE# SYSTEMTIME
POP EDI,ESI,EDX,ECX
RET
ENDPROC1 SysGetUTC@RT:
%ENDMACRO SysGetUTC
SysOpenFileMap %MACRO File, FileNamePtr, FileNameSize=-1
FileAssign %File, %FileNamePtr, Size=%FileNameSize
FileMapOpen %File
%ENDMACRO SysOpenFileMap
SysWriteFile %MACRO File, DataPtr, DataSize
FileWrite %File,%DataPtr,%DataSize
%ENDMACRO SysWriteFile
SysGetFileTime %MACRO FileNamePtr
MOV EAX,%FileNamePtr
CALL SysGetFileTime@RT:
SysGetFileTime@RT: PROC1
PUSH EBX,ECX,EDX,EDI
SUB ESP,8 ; Make room for FILETIME structure (QWORD).
MOV EDI,ESP
WinAPI CreateFile,EAX,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
MOV EBX,EAX
WinAPI GetFileTime,EBX,0,0,EDI
TEST EAX
JZ .80:
; FILETIME at EDI is now an unsigned integer QWORD with 100ns since midnight 1.1.1601.
; 134774 days elapsed between 1.1.1601 and 1.1.1970,
; i.e. 134774*24*60*60*10_000_000=0x019D_B1DE_D53E_8000 must be subtracted from FileTime at EDI.
MOV EAX,[EDI+0]
MOV EDX,[EDI+4]
SUB EAX,0xD53_E8000
SBB EDX,0x019_DB1DE
MOV ECX,10_000_000
DIV ECX
.80: ADD ESP,8
PUSH EAX
WinAPI CloseHandle,EBX
POP EAX
POP EDI,EDX,ECX,EBX
RET
ENDP1 SysGetFileTime@RT:
%ENDMACRO SysGetFileTime
SysGetFileSize %MACRO FileNamePtr
MOV EAX,%FileNamePtr
CALL SysGetFileSize@RT:
SysGetFileSize@RT: PROC1
PUSH EBX,ECX,EDI
SUB ESP,8 ; Make room for FileSize (QWORD).
LEA EDI,[ESP+4]
WinAPI CreateFile,EAX,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
MOV EBX,EAX
WinAPI GetFileSize,EBX,EDI
SUB EDI,4
MOV [EDI],EAX
INC EAX
JNZ .80:
WinAPI GetLastError
TEST EAX
JZ .80:
SUB EAX,EAX
MOV [EDI+0],EAX
MOV [EDI+4],EAX
.80: WinAPI CloseHandle,EBX
MOV EAX,[EDI+0]
MOV EDX,[EDI+4]
ADD ESP,8
POP EDI,ECX,EBX
RET
ENDP1 SysGetFileSize@RT:
%ENDMACRO SysGetFileSize
ENDHEAD syswin