8,8 → 8,11 |
dd 0 |
dd 0 |
|
REQ_DLL_VER = 2 |
DLL_ENTRY = 1 |
; useful includes |
include '../../../../macros.inc' |
purge mov,add,sub |
include '../../../../proc32.inc' |
include '../../../../dll.inc' |
|
start: |
; First 3 steps are intended to load/init console DLL |
16,55 → 19,10 |
; and are identical for all console programs |
|
; load DLL |
mov eax, 68 |
mov ebx, 19 |
mov ecx, dll_name |
int 0x40 |
stdcall dll.Load, @IMPORT |
test eax, eax |
jz exit |
jnz exit |
|
; initialize import |
mov edx, eax |
mov esi, myimport |
import_loop: |
lodsd |
test eax, eax |
jz import_done |
push edx |
import_find: |
mov ebx, [edx] |
test ebx, ebx |
jz exit;import_not_found |
push eax |
@@: |
mov cl, [eax] |
cmp cl, [ebx] |
jnz import_find_next |
test cl, cl |
jz import_found |
inc eax |
inc ebx |
jmp @b |
import_find_next: |
pop eax |
add edx, 8 |
jmp import_find |
import_found: |
pop eax |
mov eax, [edx+4] |
mov [esi-4], eax |
pop edx |
jmp import_loop |
import_done: |
|
; check version |
cmp word [dll_ver], REQ_DLL_VER |
jb exit |
cmp word [dll_ver+2], REQ_DLL_VER |
ja exit |
push DLL_ENTRY |
call [dll_start] |
|
; yes! Now do some work (say helloworld in this case). |
push caption |
push -1 |
80,27 → 38,21 |
or eax, -1 |
int 0x40 |
|
dll_name db '/sys/lib/console.obj',0 |
caption db 'Console test',0 |
aHelloWorld db 'Hello, World!',10,0 |
|
align 4 |
myimport: |
dll_start dd aStart |
dll_ver dd aVersion |
con_init dd aConInit |
con_write_asciiz dd aConWriteAsciiz |
con_exit dd aConExit |
dd 0 |
@IMPORT: |
library console, 'console.obj' |
import console, \ |
con_start, 'START', \ |
con_init, 'con_init', \ |
con_write_asciiz, 'con_write_asciiz', \ |
con_exit, 'con_exit', \ |
con_gets, 'con_gets' |
i_end: |
|
aStart db 'START',0 |
aVersion db 'version',0 |
aConInit db 'con_init',0 |
aConWriteAsciiz db 'con_write_asciiz',0 |
aConExit db 'con_exit',0 |
|
i_end: |
|
align 4 |
rb 2048 ; stack |
mem: |