0,0 → 1,868 |
; ------------------------------------------------------------- ; |
; KWINE is a fork of program PELoad written by 0CodErr |
; author - rgimad |
; ------------------------------------------------------------- ; |
; standard device (Winbase.h) |
%define STD_INPUT_HANDLE -10 |
%define STD_OUTPUT_HANDLE -11 |
%define STD_ERROR_HANDLE -12 |
|
; starting point for file pointer move (Winbase.h) |
%define FILE_BEGIN 0 ; zero or beginning of file |
%define FILE_CURRENT 1 ; current value of file pointer |
%define FILE_END 2 ; current end-of-file position |
|
; file system operation codes (kernel/trunk/fs/fs_lfn.inc) |
%define F70_READ_F 0 ; read file |
%define F70_READ_D 1 ; read folder |
%define F70_CREATE_F 2 ; create/rewrite file |
%define F70_WRITE_F 3 ; write/append to file |
%define F70_SETSIZE_F 4 ; set end of file |
%define F70_GETATTR_FD 5 ; get file/directory attributes structure |
%define F70_SETATTR_FD 6 ; set file/directory attributes structure |
%define F70_START_F 7 ; start application |
%define F70_DELETE_FD 8 ; delete file |
%define F70_CREATE_D 9 ; create directory |
|
; action to take on file that exists or does not exist (Winbase.h) |
%define CREATE_NEW 1 ; creates a new file, only if it does not already exist |
%define CREATE_ALWAYS 2 ; creates new file, always |
%define OPEN_EXISTING 3 ; opens file, only if it exists |
%define OPEN_ALWAYS 4 ; opens file, always |
%define TRUNCATE_EXISTING 5 ; opens file and truncates it so that its size is zero bytes, only if it exists |
|
%define INVALID_HANDLE_VALUE -1 |
%define INVALID_FILE_SIZE -1 |
|
GLOBAL EXPORTS |
section '.exprt' align 16 |
;********************************************************************************** |
EXPORTS: ;///////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
dd sz_ExitProcess, ExitProcess |
dd sz_GetStdHandle, GetStdHandle |
dd sz_SetConsoleMode, SetConsoleMode |
dd sz_WriteFile, WriteFile |
dd sz_ReadFile, ReadFile |
dd sz_GetCommandLineA, GetCommandLineA |
dd sz_GlobalAlloc, GlobalAlloc |
dd sz_GlobalFree, GlobalFree |
dd sz_GlobalReAlloc, GlobalReAlloc |
dd sz_Sleep, Sleep |
dd sz_FlushConsoleInputBuffer, FlushConsoleInputBuffer |
dd sz_CloseHandle, CloseHandle |
dd sz_GetFileSize, GetFileSize |
dd sz_CreateFileA, CreateFileA |
dd sz_SetFilePointer, SetFilePointer |
dd sz_VirtualAlloc, VirtualAlloc |
dd sz_VirtualFree, VirtualFree |
dd sz_SetConsoleCursorPosition, SetConsoleCursorPosition |
dd sz_DeleteFileA, DeleteFileA |
dd sz_FindClose, FindClose |
dd sz_FindFirstFileA, FindFirstFileA |
dd sz_GetLocalTime, GetLocalTime |
dd sz_GetLastError, GetLastError |
dd sz_GetProcessHeap, GetProcessHeap |
dd sz_HeapAlloc, HeapAlloc |
dd sz_HeapFree, HeapFree |
dd sz_HeapReAlloc, HeapReAlloc |
dd 0 |
sz_ExitProcess db "ExitProcess",0 |
sz_GetStdHandle db "GetStdHandle",0 |
sz_SetConsoleMode db "SetConsoleMode",0 |
sz_WriteFile db "WriteFile",0 |
sz_ReadFile db "ReadFile",0 |
sz_GetCommandLineA db "GetCommandLineA",0 |
sz_GlobalAlloc db "GlobalAlloc",0 |
sz_GlobalFree db "GlobalFree",0 |
sz_GlobalReAlloc db "GlobalReAlloc",0 |
sz_Sleep db "Sleep",0 |
sz_FlushConsoleInputBuffer db "FlushConsoleInputBuffer",0 |
sz_CloseHandle db "CloseHandle",0 |
sz_GetFileSize db "GetFileSize",0 |
sz_CreateFileA db "CreateFileA",0 |
sz_SetFilePointer db "SetFilePointer",0 |
sz_VirtualAlloc db "VirtualAlloc",0 |
sz_VirtualFree db "VirtualFree",0 |
sz_SetConsoleCursorPosition db "SetConsoleCursorPosition",0 |
sz_DeleteFileA db "DeleteFileA",0 |
sz_FindClose db "FindClose",0 |
sz_FindFirstFileA db "FindFirstFileA",0 |
sz_GetLocalTime db "GetLocalTime",0 |
sz_GetLastError db "GetLastError",0 |
sz_GetProcessHeap db "GetProcessHeap",0 |
sz_HeapAlloc db "HeapAlloc",0 |
sz_HeapFree db "HeapFree",0 |
sz_HeapReAlloc db "HeapReAlloc",0 |
|
|
|
|
|
|
|
|
section '.code' align 16 |
align 16 |
;********************************************************************************** |
ExitProcess: ;///////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
xor eax, eax |
dec eax |
int 64 |
; ret not need |
align 16 |
;********************************************************************************** |
GetStdHandle: ;//////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
push ebx |
push esi |
push edi |
; 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_write_asciiz |
call ebx |
mov [con_write_asciiz], eax |
push ecx |
push sz_con_exit |
call ebx |
mov [con_exit], eax |
push ecx |
push sz_con_gets |
call ebx |
mov [con_gets], eax |
push ecx |
push sz_con_write_string |
call ebx |
mov [con_write_string], eax |
push ecx |
push sz_con_set_flags |
call ebx |
mov [con_set_flags], eax |
push ecx |
push sz_con_set_cursor_pos |
call ebx |
mov [con_set_cursor_pos], eax |
push ecx |
push sz_con_printf |
call ebx |
mov [con_printf], eax |
|
mov eax, [28] |
cmp [eax], byte 34 ; quote |
jne .no_quote |
inc eax |
.no_quote: |
push eax |
push -1 |
push -1 |
push -1 |
push -1 |
call [con_init] |
.do_nothing: |
|
mov eax, con_handle ; return pointer to console descriptor |
|
pop edi |
pop esi |
pop ebx |
ret 4 |
align 16 |
;********************************************************************************** |
WriteFile: ;/////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hFile [ebp + 8] ; handle to the file |
%define lpBuffer [ebp + 12] ; pointer to buffer containing data |
%define nNumberOfBytesToWrite [ebp + 16] ; number of bytes to be written |
%define lpNumberOfBytesWritten [ebp + 20] ; pointer to variable that receives number of bytes written |
%define lpOverlapped [ebp + 24] ; pointer to OVERLAPPED structure |
push ebp |
mov ebp, esp |
push ebx |
push esi |
push edi |
;--------- |
mov eax, hFile |
cmp [eax + 8], dword "CON" |
je .con |
lea edx, [eax + 8] |
push edx ;filepath |
dec esp |
mov [esp], byte 0 |
push dword lpBuffer ;buffer |
push dword nNumberOfBytesToWrite;count |
push dword 0 |
push dword [eax + 4];position ; in InternalFileInfo in libio |
push dword F70_WRITE_F |
mov ebx, esp |
mov eax, 70 |
int 64 |
add esp, 25 ; restore stack |
mov edx, lpNumberOfBytesWritten |
mov [edx], ebx |
mov edx, hFile |
add [edx + 4], ebx |
jmp .exit |
.con: |
|
; push dword lpBuffer |
; call [con_printf] |
; add esp, 4 |
|
push dword nNumberOfBytesToWrite |
push dword lpBuffer |
call [con_write_string] |
|
; push dword lpBuffer |
; call [con_write_asciiz] |
|
.exit: |
;--------- |
pop edi |
pop esi |
pop ebx |
pop ebp |
ret 20 |
%undef hFile |
%undef lpBuffer |
%undef nNumberOfBytesToWrite |
%undef lpNumberOfBytesWritten |
%undef lpOverlapped |
align 16 |
;********************************************************************************** |
ReadFile: ;//////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hFile [ebp + 8] ; handle to the file |
%define lpBuffer [ebp + 12] ; pointer to buffer that receives data |
%define nNumberOfBytesToRead [ebp + 16] ; maximum number of bytes to read |
%define lpNumberOfBytesRead [ebp + 20] ; pointer to variable that receives number of bytes read |
%define lpOverlapped [ebp + 24] ; pointer to OVERLAPPED structure |
push ebp |
mov ebp, esp |
push ebx |
push esi |
push edi |
|
; push dword 0 |
; call GetStdHandle |
|
;--------- |
mov eax, hFile |
cmp [eax + 8], dword "CON" |
je .con |
|
|
|
; lea eax, [eax + 8] |
; push eax |
; call [con_write_asciiz] |
|
lea edx, [eax + 8] |
push edx ;filepath |
dec esp |
mov [esp], byte 0 |
push dword lpBuffer ;buffer |
push dword nNumberOfBytesToRead;count |
push dword 0 |
push dword [eax + 4];position ; in InternalFileInfo in libio |
push dword F70_READ_F |
mov ebx, esp |
mov eax, 70 |
int 64 |
add esp, 25 ; restore stack |
mov edx, lpNumberOfBytesRead |
mov [edx], ebx |
mov edx, hFile |
add [edx + 4], ebx |
jmp .exit |
.con: |
push dword nNumberOfBytesToRead |
push dword lpBuffer |
call [con_gets] |
.exit: |
;--------- |
pop edi |
pop esi |
pop ebx |
pop ebp |
ret 20 |
%undef hFile |
%undef lpBuffer |
%undef nNumberOfBytesToRead |
%undef lpNumberOfBytesRead |
%undef lpOverlapped |
align 16 |
;********************************************************************************** |
SetConsoleMode: ;////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
; ignore input parameters |
xor eax, eax |
dec eax |
ret 8 |
align 16 |
;********************************************************************************** |
GetCommandLineA: ;///////////////////////////////////////////////////////////////// |
;********************************************************************************** |
push edi |
mov edi, [28] |
xor al, al |
xor ecx, ecx |
dec ecx |
repne scasb |
mov eax, edi |
pop edi |
ret |
align 16 |
;********************************************************************************** |
GlobalAlloc: ;///////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define uFlags [esp + 4 +1*4] ; memory allocation attributes |
%define dwBytes [esp + 8 +1*4] ; number of bytes to allocate |
push ebx |
; uFlags ignored |
mov eax, 68 |
mov ebx, 12 |
mov ecx, dwBytes |
int 64 |
|
pop ebx |
ret 8 |
%undef uFlags |
%undef dwBytes |
align 16 |
;********************************************************************************** |
GlobalFree: ;////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hMem [esp + 4 +1*4] ; handle to global memory object |
push ebx |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, hMem |
int 64 |
|
pop ebx |
ret 4 |
%undef hMem |
align 16 |
;********************************************************************************** |
GlobalReAlloc: ;/////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hMem [esp + 4 +1*4] ; handle to global memory object |
%define dwBytes [esp + 8 +1*4] ; new size of memory block in bytes |
%define uFlags [esp + 12 +1*4] ; reallocation options |
push ebx |
; uFlags ignored |
mov eax, 68 |
mov ebx, 20 |
mov ecx, dwBytes |
mov edx, hMem |
int 64 |
|
pop ebx |
ret 12 |
%undef hMem |
%undef dwBytes |
%undef uFlags |
align 16 |
;********************************************************************************** |
Sleep: ;/////////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define dwMilliseconds [esp + 4 +1*4] ; time interval |
push ebx |
|
mov eax, dwMilliseconds |
mov ebx, 10 |
cmp eax, ebx |
jae .ae |
add eax, 10 ; avoid zero result if dwMilliseconds < 10 |
.ae: |
xor edx, edx |
div ebx |
mov ebx, eax |
|
mov eax, 5 |
int 64 |
|
pop ebx |
ret 4 |
%undef dwMilliseconds |
align 16 |
;********************************************************************************** |
FlushConsoleInputBuffer: ;///////////////////////////////////////////////////////// |
;********************************************************************************** |
; not implemented correctly |
xor eax, eax |
dec eax |
ret 4 |
align 16 |
;********************************************************************************** |
CloseHandle: ;///////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hObject [esp + 4 +1*4] |
push ebx |
mov eax, 68 |
mov ebx, 13 |
mov ecx, hObject |
int 64 |
pop ebx |
ret 4 |
%undef hObject |
align 16 |
;********************************************************************************** |
GetFileSize: ;///////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hFile [esp + 4 +3*4] |
%define lpFileSizeHigh [esp + 8 +3*4] |
push ebx |
push esi |
push edi |
; lpFileSizeHigh ignored |
mov [esp - (25 + 40) + 0], dword F70_GETATTR_FD |
mov [esp - (25 + 40) + 8], dword 0 |
mov [esp - (25 + 40) + 20], byte 0 |
lea eax, [esp - 40] |
mov [esp - (25 + 40) + 16], eax |
lea ebx, [esp - (25 + 40)] |
mov eax, hFile |
lea eax, [eax + 8] ; as in InternalFileInfo in libio |
mov [esp - (25 + 40) + 21], eax |
mov eax, 70 |
int 64 |
test eax, eax |
jz .no_error |
mov eax, INVALID_FILE_SIZE |
jmp .exit |
.no_error: |
mov eax, [esp - (25 + 40) + 25 + 32] ; file.size |
.exit: |
pop edi |
pop esi |
pop ebx |
ret 8 |
%undef hFile |
%undef lpFileSizeHigh |
align 16 |
;********************************************************************************** |
CreateFileA: ;////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define lpFileName [esp + 4 +3*4] |
%define dwDesiredAccess [esp + 8 +3*4] |
%define dwShareMode [esp + 12 +3*4] |
%define lpSecurityAttributes [esp + 16 +3*4] |
%define dwCreationDisposition [esp + 20 +3*4] |
%define dwFlagsAndAttributes [esp + 24 +3*4] |
%define hTemplateFile [esp + 28 +3*4] |
push ebx |
push esi |
push edi |
;--------- |
|
; push dword 0 |
; call GetStdHandle |
|
; push dword lpFileName |
; call [con_write_asciiz] |
|
|
|
mov eax, 68 |
mov ebx, 12 |
mov ecx, 4096 |
int 64 |
|
mov edx, eax |
|
lea edi, [eax + 8] ; as in InternalFileInfo in libio |
mov esi, lpFileName |
.copy_name: |
lodsb |
stosb |
test al, al |
jnz .copy_name |
|
mov eax, dwCreationDisposition |
cmp eax, CREATE_ALWAYS |
je .create_always |
cmp eax, OPEN_EXISTING |
je .open_existing |
mov eax, INVALID_HANDLE_VALUE |
jmp .exit |
.open_existing: |
lea eax, [edx + 8] |
push eax ;filepath |
dec esp |
mov [esp], byte 0 |
push dword 0 ; buffer |
push dword 0 ; count |
push dword 0 |
push dword 0 |
push dword F70_READ_F |
mov ebx, esp |
mov eax, 70 |
int 64 |
add esp, 25 ; restore stack |
test eax, eax |
jz .no_error |
mov eax, INVALID_HANDLE_VALUE |
jmp .exit |
.no_error: |
mov eax, edx ; return pointer to file descriptor |
jmp .exit |
.create_always: |
lea eax, [edx + 8] |
push eax ;filepath |
dec esp |
mov [esp], byte 0 |
push dword 0 ; buffer |
push dword 0 ; count |
push dword 0 |
push dword 0 |
push dword F70_CREATE_F |
mov ebx, esp |
mov eax, 70 |
int 64 |
add esp, 25 ; restore stack |
mov eax, edx ; return pointer to file descriptor |
jmp .exit |
|
.exit: |
;--------- |
pop edi |
pop esi |
pop ebx |
ret 28 |
%undef lpFileName |
%undef dwDesiredAccess |
%undef dwShareMode |
%undef lpSecurityAttributes |
%undef dwCreationDisposition |
%undef dwFlagsAndAttributes |
%undef hTemplateFile |
align 16 |
;********************************************************************************** |
SetFilePointer: ;////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hFile [esp + 4 +3*4] |
%define lDistanceToMove [esp + 8 +3*4] |
%define lpDistanceToMoveHigh [esp + 12 +3*4] |
%define dwMoveMethod [esp + 16 +3*4] |
push ebx |
push esi |
push edi |
;--------- |
mov eax, hFile |
cmp dwMoveMethod, dword FILE_BEGIN |
je .FILE_BEGIN |
cmp dwMoveMethod, dword FILE_CURRENT |
je .FILE_CURRENT |
jmp .FILE_END |
.FILE_BEGIN: |
mov edx, lDistanceToMove |
mov [eax + 4], edx |
jmp .exit |
.FILE_CURRENT: |
mov edx, lDistanceToMove |
add [eax + 4], edx |
jmp .exit |
.FILE_END: |
push dword 0 |
push eax |
call GetFileSize |
mov edx, eax |
|
mov eax, hFile |
mov [eax + 4], edx |
mov edx, lDistanceToMove |
add [eax + 4], edx |
.exit: |
mov eax, [eax + 4] |
;--------- |
pop edi |
pop esi |
pop ebx |
ret 16 |
%undef hFile |
%undef lDistanceToMove |
%undef lpDistanceToMoveHigh |
%undef dwMoveMethod |
align 16 |
;********************************************************************************** |
VirtualAlloc: ;//////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define lpAddress [esp + 4 +1*4] |
%define dwSize [esp + 8 +1*4] |
%define flAllocationType [esp + 12 +1*4] |
%define flProtect [esp + 16 +1*4] |
push ebx |
|
mov eax, 68 |
mov ebx, 12 |
mov ecx, dwSize |
int 64 |
|
pop ebx |
ret 16 |
%undef lpAddress |
%undef dwSize |
%undef flAllocationType |
%undef flProtect |
align 16 |
;********************************************************************************** |
VirtualFree: ;///////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define lpAddress [esp + 4 +1*4] |
%define dwSize [esp + 8 +1*4] |
%define dwFreeType [esp + 12 +1*4] |
push ebx |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, lpAddress |
int 64 |
|
pop ebx |
ret 12 |
%undef lpAddress |
%undef dwSize |
%undef dwFreeType |
align 16 |
;********************************************************************************** |
SetConsoleCursorPosition: ;//////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hConsoleOutput [esp + 4 +3*4] |
%define dwCursorPosition [esp + 8 +3*4] |
push ebx |
push esi |
push edi |
|
mov edx, dwCursorPosition |
shld eax, edx, 16 |
shr edx, 16 |
|
push eax |
push edx |
call [con_set_cursor_pos] |
|
pop edi |
pop esi |
pop ebx |
ret 8 |
%undef hConsoleOutput |
%undef dwCursorPosition |
align 16 |
;********************************************************************************** |
DeleteFileA: ;///////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define lpFileName [esp + 4 +1*4] ; name of file |
push ebx |
|
mov [esp - (25 + 40) + 0], dword F70_DELETE_FD |
mov [esp - (25 + 40) + 8], dword 0 |
mov [esp - (25 + 40) + 20], byte 0 |
lea eax, [esp - 40] |
mov [esp - (25 + 40) + 16], eax |
lea ebx, [esp - (25 + 40)] |
mov eax, lpFileName |
mov [esp - (25 + 40) + 21], eax |
mov eax, 70 |
int 64 |
|
pop ebx |
ret 4 |
%undef lpFileName |
align 16 |
;********************************************************************************** |
FindClose: ;/////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hFindFile [esp + 4 +1*4] ; file search handle |
|
ret 4 |
%undef hFindFile |
align 16 |
;********************************************************************************** |
FindFirstFileA: ;////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define lpFileName [esp + 4 +3*4] ; name of file |
%define lpFindFileData [esp + 8 +3*4] ; pointer to WIN32_FIND_DATA structure |
push ebx |
push esi |
push edi |
|
pop edi |
pop esi |
pop ebx |
ret 8 |
%undef lpFileName |
%undef lpFindFileData |
align 16 |
;********************************************************************************** |
GetLocalTime: ;/////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define lpSystemTime [esp + 4] ; pointer to SYSTEMTIME structure |
; yet not implemented |
; mov eax, lpSystemTime |
; mov [eax + 0], dword 12345678H |
; mov [eax + 4], dword 12345678H |
; mov [eax + 8], dword 12345678H |
; mov [eax + 12], dword 12345678H |
; MSDN: This function does not return a value. |
ret 4 |
%undef lpSystemTime |
align 16 |
;********************************************************************************** |
GetLastError: ;//////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
xor eax, eax |
ret |
align 16 |
;********************************************************************************** |
GetProcessHeap: ;//////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
xor eax, eax |
dec eax |
ret |
align 16 |
;********************************************************************************** |
HeapAlloc: ;/////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hHeap [esp + 4 +1*4] |
%define dwFlags [esp + 8 +1*4] |
%define dwBytes [esp + 12 +1*4] |
push ebx |
|
mov eax, 68 |
mov ebx, 12 |
mov ecx, dwBytes |
int 64 |
|
pop ebx |
ret 12 |
%undef hHeap |
%undef dwFlags |
%undef dwBytes |
align 16 |
;********************************************************************************** |
HeapFree: ;//////////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hHeap [esp + 4 +1*4] |
%define dwFlags [esp + 8 +1*4] |
%define lpMem [esp + 12 +1*4] |
push ebx |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, lpMem |
int 64 |
|
pop ebx |
ret 12 |
%undef hHeap |
%undef dwFlags |
%undef lpMem |
align 16 |
;********************************************************************************** |
HeapReAlloc: ;///////////////////////////////////////////////////////////////////// |
;********************************************************************************** |
%define hHeap [esp + 4 +1*4] |
%define dwFlags [esp + 8 +1*4] |
%define lpMem [esp + 12 +1*4] |
%define dwBytes [esp + 16 +1*4] |
push ebx |
|
mov eax, 68 |
mov ebx, 20 |
mov ecx, dwBytes |
mov edx, lpMem |
int 64 |
|
pop ebx |
ret 16 |
%undef hHeap |
%undef dwFlags |
%undef lpMem |
%undef dwBytes |
|
|
|
|
|
|
; ------------------------------------------------------------- ; |
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_init dd 0 |
con_write_asciiz dd 0 |
con_exit dd 0 |
con_gets dd 0 |
con_write_string dd 0 |
con_set_flags dd 0 |
con_set_cursor_pos dd 0 |
con_printf dd 0 |
console dd 0 |
sz_con_init db "con_init",0 |
sz_con_write_asciiz db "con_write_asciiz",0 |
sz_con_exit db "con_exit",0 |
sz_con_gets db "con_gets",0 |
sz_con_write_string db "con_write_string",0 |
sz_console db "/sys/lib/console.obj",0 |
sz_con_set_flags db "con_set_flags",0 |
sz_con_set_cursor_pos db "con_set_cursor_pos",0 |
sz_con_printf db "con_printf",0 |
|
con_handle: |
dd 0 |
dd 0 |
dd "CON" |
|
|