For DLL autoload

git-svn-id: svn://kolibrios.org@8671 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Coldy 2021-04-17 08:52:27 +00:00
parent e44d2d93da
commit cb3d4656b9
2 changed files with 57 additions and 3 deletions

View File

@ -881,7 +881,7 @@ common_app_entry:
mov byte [edi], 0 mov byte [edi], 0
.check_tls_header: .check_tls_header:
cmp word [6], '02' cmp word [6], '02'
jne .cleanup jne .try_load_dll ;.cleanup
call init_heap call init_heap
stdcall user_alloc, 4096 stdcall user_alloc, 4096
mov edx, [current_slot] mov edx, [current_slot]
@ -892,6 +892,57 @@ common_app_entry:
mov [tls_data_l+7], ah mov [tls_data_l+7], ah
mov dx, app_tls mov dx, app_tls
mov fs, dx mov fs, dx
; { Patch by Coldy, For DLL autoload
; if APP_HEADER.version = 2 => lib/load dll.obj & change eip to APP_START_THUNK)
.try_load_dll:
; TODO: It;s app, not thread?
; Test app header version (
mov ecx, dword[ebp+APP_HDR.img_base]
;DEBUGF 1, "K : ecx = %d\n", [ecx+8]
cmp dword[ecx+8], 2
jne .cleanup
DEBUGF 1, 'K : App header version 2\n'
;DEBUGF 1, "K : DLL.OBJ path: %s\n", dll_lib_path
stdcall load_library, dll_lib_path, 0
;DEBUGF 1, "K : DLL.OBJ exp ptr: %x\n", eax
;test eax, eax
;jnz @f
cmp eax, 0
jne @f
; Something went wrong
stdcall free_kernel_space, [ebp+APP_HDR.img_base]
stdcall kernel_free, ebp
DEBUGF 1, 'K : DLL.OBJ not found! Terminate application!'
mov ebx, dll_error_msg
mov ebp, notifyapp
call fs_execute_from_sysdir_param
; Terminate process
call sys_end
@@:
; Find base of DLL.OBJ
;mov ebx, eax
;cdq
;mov ecx, 0x00000400
;div ecx
;sub ebx, edx
sub eax, 4
mov eax, [eax]
;DEBUGF 1, "K : DLL.OBJ base ptr: %x\n", eax
; load_library don't map coff header,
; so we may change entry point for app APP_START_THUNK
; to base of DLL.OBJ
;.change_eip:
mov ecx, [current_slot]
mov ecx, [ecx+APPDATA.pl0_stack]
;DEBUGF 1, "K : EIP = %x\n", ebx
mov [ecx+REG_EIP], eax
; } End patch by Coldy, For DLL autoload
.cleanup: .cleanup:
stdcall free_kernel_space, [ebp+APP_HDR.img_base] stdcall free_kernel_space, [ebp+APP_HDR.img_base]
stdcall kernel_free, ebp stdcall kernel_free, ebp

View File

@ -177,7 +177,10 @@ kernel_file_load:
db '/sys/KERNEL.MNT',0 db '/sys/KERNEL.MNT',0
dev_data_path db '/RD/1/DRIVERS/DEVICES.DAT',0 dev_data_path db '/RD/1/DRIVERS/DEVICES.DAT',0
; { Patch by Coldy, For DLL autoload
dll_lib_path db '/RD/1/LIB/DLL.OBJ',0
dll_error_msg db '"DLL.OBJ not found!\nTerminate application!" -dE',0
; } End patch by Coldy, For DLL autoload
align 4 align 4
shmem_list: shmem_list: