Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6766 → Rev 6767

/programs/system/os/kolibri.asm
10,7 → 10,6
FS_STACK_MAX equ dword [fs:4]
FS_STACK_MIN equ dword [fs:8]
FS_SELF_PTR equ dword [fs:0x18]
FS_PROCESS_DATA equ dword [fs:0x30]
FS_ERRNO equ dword [fs:0x34]
FS_SYSCALL_PTR equ dword [fs:0xC0]
 
40,8 → 39,10
environment dd ?
ends
 
include 'sync.inc'
include 'malloc.inc'
include 'peloader.inc'
include 'modules.inc'
include 'cmdline.inc'
 
proc syscall_int40
75,10 → 76,6
epilogue@proc equ fpo_epilogue
 
proc start stdcall, dll_base, reason, reserved
locals
exe_base dd ?
exe_path_size dd ?
endl
; 1. Do nothing unless called by the kernel for DLL_PROCESS_ATTACH.
cmp [reason], DLL_PROCESS_ATTACH
jnz .nothing
112,15 → 109,8
call fixup_pe_relocations
pop ecx
jc .die
; 2d. Allocate process data.
mov eax, 68
mov ebx, 12
mov ecx, 0x1000
call FS_SYSCALL_PTR
mov FS_PROCESS_DATA, eax
; 2e. Initialize process heap.
; 2d. Initialize process heap.
mov eax, [ebp+kernel_init_data.exe_base]
mov [exe_base], eax
mov edx, [eax+STRIPPED_PE_HEADER.SizeOfHeapReserve]
cmp word [eax], 'MZ'
jnz @f
128,6 → 118,43
mov edx, [eax+IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeapReserve]
@@:
malloc_init
; 2e. Allocate and fill MODULE structs for main exe and kolibri.dll.
mov eax, [ebp+kernel_init_data.exe_path]
@@:
inc eax
cmp byte [eax-1], 0
jnz @b
sub eax, [ebp+kernel_init_data.exe_path]
push eax
add eax, sizeof.MODULE
stdcall malloc, eax
test eax, eax
jz .die
mov ebx, eax
stdcall malloc, sizeof.MODULE + kolibri_dll.size
test eax, eax
jz .die
mov edx, modules_list
mov [edx+MODULE.next], ebx
mov [ebx+MODULE.next], eax
mov [eax+MODULE.next], edx
mov [edx+MODULE.prev], eax
mov [eax+MODULE.prev], ebx
mov [ebx+MODULE.prev], edx
push esi
mov esi, kolibri_dll
mov ecx, kolibri_dll.size
lea edi, [eax+MODULE.path]
rep movsb
pop esi
call init_module_struct
mov eax, ebx
mov esi, [ebp+kernel_init_data.exe_path]
pop ecx
lea edi, [ebx+MODULE.path]
rep movsb
mov esi, [ebp+kernel_init_data.exe_base]
call init_module_struct
; 2f. Copy rest of init struct and free memory.
; Parse command line to argc/argv here and move arguments to the heap
; in order to save memory: init struct and heap use different pages,
138,13 → 165,6
mov FS_STACK_MIN, eax
add eax, [ebp+kernel_init_data.stack_size]
mov FS_STACK_MAX, eax
mov eax, [ebp+kernel_init_data.exe_path]
@@:
inc eax
cmp byte [eax-1], 0
jnz @b
sub eax, [ebp+kernel_init_data.exe_path]
mov [exe_path_size], eax
mov esi, [ebp+kernel_init_data.command_line]
xor edx, edx
xor edi, edi
156,16 → 176,16
mov [.argc], ebx
sub esi, [ebp+kernel_init_data.command_line]
lea esi, [esi+(ebx+1)*4]
add esi, [exe_path_size]
stdcall malloc, esi
test eax, eax
jz .die
mov [.argv], eax
mov edx, eax
lea edi, [eax+ebx*4]
mov esi, [ebp+kernel_init_data.exe_path]
mov [edx], edi
lea edi, [eax+(ebx+1)*4]
mov eax, [modules_list + MODULE.next]
add eax, MODULE.path
mov [edx], eax
add edx, 4
mov ecx, [exe_path_size]
rep movsb
mov esi, [ebp+kernel_init_data.command_line]
call parse_cmdline
and dword [edx], 0 ; argv[argc] = NULL
174,16 → 194,48
mov ebx, 13
mov ecx, ebp
call FS_SYSCALL_PTR
; 2g. Initialize mutex for list of MODULEs.
mov ecx, modules_mutex
call mutex_init
; 2h. For console applications, call console.dll!con_init with default parameters.
mov eax, [modules_list + MODULE.next]
mov esi, [eax+MODULE.base]
mov al, [esi+STRIPPED_PE_HEADER.Subsystem]
cmp byte [esi], 'M'
jnz @f
mov eax, [esi+3Ch]
mov al, byte [esi+eax+IMAGE_NT_HEADERS.OptionalHeader.Subsystem]
@@:
cmp al, IMAGE_SUBSYSTEM_WINDOWS_CUI
jnz .noconsole
stdcall dlopen, console_dll, 0
test eax, eax
jz .noconsole
stdcall dlsym, eax, con_init_str
test eax, eax
jz .noconsole
mov edx, [modules_list + MODULE.next]
stdcall eax, -1, -1, -1, -1, [edx+MODULE.filename]
.noconsole:
; 3. Configure modules: main EXE and possible statically linked DLLs.
mov esi, [exe_base]
mov eax, [.argv]
pushd [eax]
mov eax, [modules_list + MODULE.next]
mov esi, [eax+MODULE.base]
add eax, MODULE.path
push eax
call fixup_pe_relocations
pop ecx
jc .die
mutex_lock modules_mutex
mov esi, [modules_list + MODULE.next]
call resolve_pe_imports
mov ebx, eax
mutex_unlock modules_mutex
test ebx, ebx
jnz .die
; 4. Call exe entry point.
mov esi, [esi+MODULE.base]
mov edx, [esi+STRIPPED_PE_HEADER.AddressOfEntryPoint]
cmp word [esi], 'MZ'
cmp byte [esi], 'M'
jnz @f
mov ecx, [esi+IMAGE_DOS_HEADER.e_lfanew]
add ecx, esi
190,7 → 242,8
mov edx, [ecx+IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint]
@@:
add edx, esi
add esp, fpo_localsize+4
pop ecx
mov [process_initialized], 1
call edx
; If exe entry point has returned control, die.
jmp .die
246,18 → 299,46
, mspace_realloc, 'mspace_realloc' \
, mspace_realloc_in_place, 'mspace_realloc_in_place' \
, mspace_memalign, 'mspace_memalign' \
, dlopen, 'dlopen' \
, dlclose, 'dlclose' \
, dlsym, 'dlsym' \
 
end data
 
kolibri_dll db 'kolibri.dll',0
kolibri_dll db '/rd/1/lib/kolibri.dll',0
.size = $ - kolibri_dll
 
console_dll db 'console.dll',0
con_init_str db 'con_init',0
 
msg_version_mismatch db 'S : Version mismatch between kernel and kolibri.dll',13,10,0
msg_bad_relocation1 db 'S : Bad relocation type in ',0
msg_bad_relocation db 'Bad relocation type in ',0
msg_newline db 13,10,0
msg_relocated1 db 'S : fixups for ',0
msg_relocated2 db ' applied',13,10,0
msg_noreloc1 db 'Module ',0
msg_noreloc2 db ' is not at preferred base and has no fixups',0
loader_debugboard_prefix db 'S : ',0
notify_program db '/rd/1/@notify',0
msg_cannot_open db 'Cannot open ',0
msg_paths_begin db ' in any of '
 
module_path1 db '/rd/1/lib/'
.size = $ - module_path1
db ', '
module_path2 db '/kolibrios/lib/'
.size = $ - module_path2
db ', ',0
msg_export_name_not_found db 'Exported function ',0
msg_export_ordinal_not_found db 'Exported ordinal #',0
msg_export_not_found db ' not found in module ',0
msg_unknown db '<unknown>',0
 
section '.data' data readable writable
if FOOTERS
section '.data' data readable writable
malloc_magic dd ?
end if
default_heap dd ?
modules_list rd 2
modules_mutex MUTEX
process_initialized db ?