Rustem Gimadutdinov (rgimad)
81120905e2
git-svn-id: svn://kolibrios.org@7873 a494cfbc-eb01-0410-851d-a64ba20cac60
243 lines
6.7 KiB
NASM
243 lines
6.7 KiB
NASM
; ------------------------------------------------------------- ;
|
|
; KWINE is a fork of program PELoad written by 0CodErr
|
|
; author of fork - rgimad
|
|
; ------------------------------------------------------------- ;
|
|
GLOBAL EXPORTS
|
|
section '.exprt' align 16
|
|
;**********************************************************************************
|
|
EXPORTS: ;/////////////////////////////////////////////////////////////////////////
|
|
;**********************************************************************************
|
|
dd sz__getch, _getch
|
|
dd sz__kbhit, _kbhit
|
|
dd sz_printf, printf
|
|
dd sz_puts, puts
|
|
dd sz_gets, gets
|
|
dd sz_strlen, strlen
|
|
dd 0
|
|
sz__getch db "_getch",0
|
|
sz__kbhit db "_kbhit",0
|
|
sz_printf db "printf",0
|
|
sz_puts db "puts",0
|
|
sz_gets db "gets",0
|
|
sz_strlen db "strlen",0
|
|
|
|
section '.code' align 16
|
|
align 16
|
|
;**********************************************************************************
|
|
_getch: ;//////////////////////////////////////////////////////////////////////////
|
|
;**********************************************************************************
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
|
|
call load_console_lib
|
|
pop ecx
|
|
call [con_getch]
|
|
push ecx
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
align 16
|
|
;**********************************************************************************
|
|
_kbhit: ;//////////////////////////////////////////////////////////////////////////
|
|
;**********************************************************************************
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
|
|
call load_console_lib
|
|
pop ecx
|
|
call [con_kbhit]
|
|
push ecx
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
align 16
|
|
;**********************************************************************************
|
|
printf: ;//////////////////////////////////////////////////////////////////////////
|
|
;**********************************************************************************
|
|
;pushad
|
|
;push ebx
|
|
;push esi
|
|
;push edi
|
|
call load_console_lib
|
|
;popad
|
|
pop ecx
|
|
call [con_printf]
|
|
push ecx
|
|
|
|
;pop edi
|
|
;pop esi
|
|
;pop ebx
|
|
|
|
ret
|
|
align 16
|
|
;**********************************************************************************
|
|
puts: ;////////////////////////////////////////////////////////////////////////// cdecl
|
|
;**********************************************************************************
|
|
;push ebx
|
|
;push esi
|
|
;push edi
|
|
|
|
call load_console_lib
|
|
pop ecx ; pop return address
|
|
call [con_write_asciiz]
|
|
push ecx ; push return address again
|
|
|
|
;pop edi
|
|
;pop esi
|
|
;pop ebx
|
|
ret
|
|
align 16
|
|
;**********************************************************************************
|
|
gets: ;////////////////////////////////////////////////////////////////////////// cdecl
|
|
;**********************************************************************************
|
|
;push ebx
|
|
;push esi
|
|
;push edi
|
|
|
|
call load_console_lib
|
|
pop ecx
|
|
pop edx
|
|
push 25 ;; second arg of con_gets assume by default
|
|
push edx
|
|
call [con_gets]
|
|
push ecx
|
|
|
|
;pop edi
|
|
;pop esi
|
|
;pop ebx
|
|
ret
|
|
align 16
|
|
;**********************************************************************************
|
|
strlen: ;//////////////////////////////////////////////////////////////////////////
|
|
;**********************************************************************************
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
|
|
call load_console_lib
|
|
xor eax,eax
|
|
mov edi, dword [esp + 4 + 4 + 4 + 4]
|
|
.while1:
|
|
inc eax
|
|
cmp byte [eax + edi], 0
|
|
jnz .while1
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret
|
|
|
|
|
|
load_console_lib: ;; stdcall ?
|
|
; if already loaded then do nothing
|
|
cmp [console], dword 0
|
|
jne .do_nothing
|
|
push sz_console
|
|
call load.library
|
|
mov [console], eax
|
|
mov ecx, eax
|
|
mov ebx, getprocaddress
|
|
;;
|
|
push ecx
|
|
push sz_con_init
|
|
call ebx
|
|
mov [con_init], eax
|
|
;;
|
|
push ecx
|
|
push sz_con_getch
|
|
call ebx
|
|
mov [con_getch], eax
|
|
;;
|
|
push ecx
|
|
push sz_con_kbhit
|
|
call ebx
|
|
mov [con_kbhit], eax
|
|
;;
|
|
push ecx
|
|
push sz_con_printf
|
|
call ebx
|
|
mov [con_printf], eax
|
|
;;
|
|
push ecx
|
|
push sz_con_write_asciiz
|
|
call ebx
|
|
mov [con_write_asciiz], eax
|
|
;;
|
|
push ecx
|
|
push sz_con_gets
|
|
call ebx
|
|
mov [con_gets], eax
|
|
|
|
push ecx
|
|
push sz_con_init
|
|
call ebx
|
|
mov [con_init], eax
|
|
push con_caption
|
|
push -1
|
|
push -1
|
|
push -1
|
|
push -1
|
|
call [con_init]
|
|
|
|
|
|
.do_nothing:
|
|
ret
|
|
|
|
; ------------------------------------------------------------- ; stdcall
|
|
load.library:
|
|
mov eax, 68
|
|
mov ebx, 19
|
|
mov ecx, [esp + 4]
|
|
int 64
|
|
ret 4
|
|
; ------------------------------------------------------------- ;
|
|
getprocaddress:
|
|
mov edx, [esp + 8]
|
|
xor eax, eax
|
|
test edx, edx
|
|
jz .end
|
|
.next:
|
|
xor eax, eax
|
|
cmp [edx], dword 0
|
|
jz .end
|
|
mov esi, [edx]
|
|
mov edi, [esp + 4]
|
|
.next_:
|
|
lodsb
|
|
scasb
|
|
jne .fail
|
|
or al, al
|
|
jnz .next_
|
|
jmp .ok
|
|
.fail:
|
|
add edx, 8
|
|
jmp .next
|
|
.ok:
|
|
mov eax, [edx + 4]
|
|
.end:
|
|
ret 8
|
|
; ------------------------------------------------------------- ;
|
|
|
|
section '.data' align 16
|
|
|
|
con_caption db "test!",0
|
|
con_init dd 0
|
|
con_getch dd 0
|
|
con_kbhit dd 0
|
|
con_printf dd 0
|
|
con_write_asciiz dd 0
|
|
con_gets dd 0
|
|
console dd 0
|
|
sz_con_init db "con_init",0
|
|
sz_con_getch db "con_getch",0
|
|
sz_con_kbhit db "con_kbhit",0
|
|
sz_con_printf db "con_printf",0
|
|
sz_con_write_asciiz db "con_write_asciiz",0
|
|
sz_con_gets db "con_gets",0
|
|
sz_console db "/sys/lib/console.obj",0 |