From 7e9ae9b030881dd2e5cdd19dc6a9ea113e353e32 Mon Sep 17 00:00:00 2001 From: CleverMouse Date: Fri, 19 Jul 2013 15:31:01 +0000 Subject: [PATCH] load_library: disable interrupts for smaller time git-svn-id: svn://kolibrios.org@3827 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/dll.inc | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/kernel/trunk/core/dll.inc b/kernel/trunk/core/dll.inc index e5fb4efe95..c084c1e8d0 100644 --- a/kernel/trunk/core/dll.inc +++ b/kernel/trunk/core/dll.inc @@ -1030,8 +1030,6 @@ proc load_library stdcall, file_name:dword img_base dd ? endl - cli - ; resolve file name mov ebx, [file_name] lea edi, [fullname+1] @@ -1042,6 +1040,8 @@ proc load_library stdcall, file_name:dword ; scan for required DLL in list of already loaded for this process, ; ignore timestamp + cli + mov esi, [CURRENT_TASK] shl esi, 8 lea edi, [fullname] @@ -1065,6 +1065,7 @@ proc load_library stdcall, file_name:dword mov eax, [ecx+DLLDESCR.exports] sub eax, [ecx+DLLDESCR.defaultbase] add eax, [esi+HDLL.base] + sti ret .next_in_process: mov esi, [esi+HDLL.fd] @@ -1072,10 +1073,12 @@ proc load_library stdcall, file_name:dword .not_in_process: ; scan in full list, compare timestamp + sti lea eax, [fileinfo] stdcall get_fileinfo, edi, eax test eax, eax jnz .fail + cli mov esi, [dll_list.fd] .scan_for_dlls: cmp esi, dll_list @@ -1097,6 +1100,7 @@ proc load_library stdcall, file_name:dword ; new DLL .load_new: + sti ; load file stdcall load_file, edi test eax, eax @@ -1124,13 +1128,6 @@ proc load_library stdcall, file_name:dword mov dword [esi+DLLDESCR.timestamp], eax mov eax, dword [fileinfo+28] mov dword [esi+DLLDESCR.timestamp+4], eax -; initialize DLLDESCR struct - and dword [esi+DLLDESCR.refcount], 0; no HDLLs yet; later it will be incremented - mov [esi+DLLDESCR.fd], dll_list - mov eax, [dll_list.bk] - mov [dll_list.bk], esi - mov [esi+DLLDESCR.bk], eax - mov [eax+DLLDESCR.fd], esi ; calculate size of loaded DLL mov edx, [coff] @@ -1300,6 +1297,14 @@ proc load_library stdcall, file_name:dword stdcall kernel_free, [coff] + cli +; initialize DLLDESCR struct + and dword [esi+DLLDESCR.refcount], 0; no HDLLs yet; later it will be incremented + mov [esi+DLLDESCR.fd], dll_list + mov eax, [dll_list.bk] + mov [dll_list.bk], esi + mov [esi+DLLDESCR.bk], eax + mov [eax+DLLDESCR.fd], esi .dll_already_loaded: inc [esi+DLLDESCR.refcount] push esi @@ -1372,6 +1377,7 @@ proc load_library stdcall, file_name:dword mov eax, [esi+DLLDESCR.exports] sub eax, [esi+DLLDESCR.defaultbase] add eax, [img_base] + sti ret .fail_and_free_data: stdcall kernel_free, [esi+DLLDESCR.data] @@ -1388,6 +1394,7 @@ proc load_library stdcall, file_name:dword .fail_and_dereference: mov eax, 1 ; delete 1 reference call dereference_dll + sti xor eax, eax ret endp