forked from KolibriOS/kolibrios
Dll autoload
Kernel - removed unnecessary and rewrote/add some comments, no code changes User (lib/dll.obj) - Introduced new KX header as extension for existing formats - Added staring KX header processing - Improved import table test logic, no reason to kill app for import absence - skip import processing (tnx ProMiNick) - Add ReadMe.txt git-svn-id: svn://kolibrios.org@8709 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -834,6 +834,8 @@ common_app_entry:
|
||||
mov ebp, [ebp+APPDATA.exec_params]
|
||||
test ebp, ebp
|
||||
jz .exit
|
||||
; APPDATA.exec_params have first thread only,
|
||||
; so second and next threads don't get here (they jump to .exit)
|
||||
stdcall map_process_image, [ebp+APP_HDR._emem],\
|
||||
[ebp+APP_HDR.img_base], [ebp+APP_HDR.img_size]
|
||||
mov esi, [ebp+APP_HDR.path_string]
|
||||
@@ -892,54 +894,35 @@ common_app_entry:
|
||||
mov [tls_data_l+7], ah
|
||||
mov dx, app_tls
|
||||
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 (
|
||||
; { Patch by Coldy, For DLL autoload
|
||||
.try_load_dll:
|
||||
; 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
|
||||
;if APP_HEADER.version = 2 => load lib/dll.obj & change eip to APP_STARTUP_THUNK
|
||||
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
|
||||
; Something went wrong (TODO: Next 2 line is code copy after .cleanup)
|
||||
stdcall free_kernel_space, [ebp+APP_HDR.img_base]
|
||||
stdcall kernel_free, ebp
|
||||
DEBUGF 1, 'K : DLL.OBJ not found! Terminate application!'
|
||||
DEBUGF 1, 'K : DLL.OBJ not found! Terminate application!\n'
|
||||
mov ebx, dll_error_msg
|
||||
mov ebp, notifyapp
|
||||
call fs_execute_from_sysdir_param
|
||||
; Terminate process
|
||||
; Terminate process (TODO: Need jump to .cleanup after sys_end ?)
|
||||
call sys_end
|
||||
|
||||
@@:
|
||||
; Find base of DLL.OBJ
|
||||
;mov ebx, eax
|
||||
;cdq
|
||||
;mov ecx, 0x00000400
|
||||
;div ecx
|
||||
;sub ebx, edx
|
||||
; Find APP_STARTUP_THUNK in DLL.OBJ
|
||||
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
|
||||
mov eax, [eax]
|
||||
|
||||
;.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
|
||||
|
Reference in New Issue
Block a user