Запрос подготовки ядра к нововведениям
Posted: Sun Nov 22, 2020 2:54 pm
изменяемый хедер - (root)/kernel/trunk/core/taskman.inc
затрагиваемая процедура - fs_execute
Что процедура должна научиться делать - чистить за собой сущности созданные между lock_application_table и unlock_application_table (не трогать esi во время этой очистки)
примерный набросок
собственно ядерщики нужен код по метке .err_with_cleanup_needance
try_to_load_imports_if_any пока можно реализовать в виде заглушки
затрагиваемая процедура - fs_execute
Что процедура должна научиться делать - чистить за собой сущности созданные между lock_application_table и unlock_application_table (не трогать esi во время этой очистки)
примерный набросок
Code: Select all
proc fs_execute
; edx = flags
; ecx -> cmdline
; ebx -> absolute file path
; eax = string length
locals
cmdline rd 1
flags rd 1
slot rd 1
slot_base rd 1
; app header data
hdr_cmdline rd 1
hdr_path rd 1
hdr_eip rd 1
hdr_esp rd 1
hdr_edata rd 1
hdr_emem rd 1
file_base rd 1
file_size rd 1
filename_size rd 1
cmdline_size rd 1
path_string rd 1
endl
mov [flags], edx
mov [cmdline], ecx
mov [path_string], ebx
mov [filename_size], eax
mov esi, -ERROR_FILE_NOT_FOUND
test eax, eax
jz .err_file
stdcall load_file, ebx
test eax, eax
jz .err_file
mov [file_base], eax
mov [file_size], ebx
lea ebx, [hdr_cmdline]
call test_app_header
mov esi, -0x1F
test eax, eax
jz .err_hdr
call lock_application_table
call alloc_thread_slot
mov esi, -0x20 ; too many processes
test eax, eax
jz .err_0
mov [slot], eax
shl eax, 8
lea edi, [SLOT_BASE+eax]
mov [slot_base], edi
; clean extended information about process
mov ecx, sizeof.APPDATA/4
xor eax, eax
cld
rep stosd
; write application name
stdcall strrchr, [path_string], '/'
lea esi, [eax+1] ; -> name without path
mov ecx, 11
mov edi, [slot_base]
@@:
call utf8to16
call uni2ansi_char
cmp al, '.'
jz @f
test al, al
jz @f
stosb
loop @b
@@:
mov edi, [cmdline]
xor eax, eax
test edi, edi
jz @f
mov ecx, 65535
call _strnlen
cmp eax, 256
jb @f
lea ebx, [eax+1]
add [hdr_emem], ebx
@@:
mov [cmdline_size], eax
stdcall create_process, [hdr_emem]
mov esi, -30 ; no memory
test eax, eax
jz .err_hdr
mov ebx, [sys_proc+LHEAD.prev]
__list_add eax, ebx, sys_proc
mov ebx, [hdr_emem]
mov [eax+PROC.mem_used], ebx
mov ebx, [slot_base]
mov [ebx+APPDATA.process], eax
lea edx, [ebx+APPDATA.list]
lea ecx, [eax+PROC.thr_list]
list_add_tail edx, ecx
mov eax, [cmdline_size]
add eax, sizeof.APP_HDR
stdcall kernel_alloc, eax
mov [ebx+APPDATA.exec_params], eax
mov edi, eax
lea esi, [hdr_cmdline]
mov ecx, sizeof.APP_HDR/4
rep movsd
mov ecx, [cmdline_size]
mov esi, [cmdline]
rep movsb
lea eax, [hdr_cmdline]
stdcall set_app_params , [slot], eax, [flags]
call try_to_load_imports_if_any
test esi,esi
js .err_with_cleanup_needance
mov eax, [process_number] ;set result
call unlock_application_table
ret
.err_with_cleanup_needance:
; we must free all entities that created since lock_application_table
; and make slot back freed
.err_0:
call unlock_application_table
.err_hdr:
stdcall kernel_free, [file_base]
.err_file:
stdcall kernel_free, [path_string]
mov eax, esi
ret
endp
try_to_load_imports_if_any пока можно реализовать в виде заглушки
Code: Select all
align 4
try_to_load_imports_if_any:
xor esi,esi
ret