forked from KolibriOS/kolibrios
kernel: kolibri-process merged into trunk. This is my little gift to myself for my birthday.
git-svn-id: svn://kolibrios.org@5130 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -918,10 +918,9 @@ proc load_library stdcall, file_name:dword
|
||||
; ignore timestamp
|
||||
cli
|
||||
|
||||
mov esi, [CURRENT_TASK]
|
||||
shl esi, 8
|
||||
mov esi, [current_process]
|
||||
lea edi, [fullname]
|
||||
mov ebx, [esi+SLOT_BASE+APPDATA.dlls_list_ptr]
|
||||
mov ebx, [esi+PROC.dlls_list_ptr]
|
||||
test ebx, ebx
|
||||
jz .not_in_process
|
||||
mov esi, [ebx+HDLL.fd]
|
||||
@@ -1281,28 +1280,21 @@ endp
|
||||
; out: eax = APPDATA.dlls_list_ptr if all is OK,
|
||||
; NULL if memory allocation failed
|
||||
init_dlls_in_thread:
|
||||
mov ebx, [current_slot]
|
||||
mov eax, [ebx+APPDATA.dlls_list_ptr]
|
||||
mov ebx, [current_process]
|
||||
mov eax, [ebx+PROC.dlls_list_ptr]
|
||||
test eax, eax
|
||||
jnz .ret
|
||||
push [ebx+APPDATA.dir_table]
|
||||
|
||||
mov eax, 8
|
||||
call malloc
|
||||
pop edx
|
||||
call malloc ; FIXME
|
||||
test eax, eax
|
||||
jz .ret
|
||||
|
||||
mov [eax], eax
|
||||
mov [eax+4], eax
|
||||
mov ecx, [TASK_COUNT]
|
||||
mov ebx, SLOT_BASE+256
|
||||
.set:
|
||||
cmp [ebx+APPDATA.dir_table], edx
|
||||
jnz @f
|
||||
mov [ebx+APPDATA.dlls_list_ptr], eax
|
||||
@@:
|
||||
add ebx, 256
|
||||
dec ecx
|
||||
jnz .set
|
||||
|
||||
mov ebx, [current_process]
|
||||
mov [ebx+PROC.dlls_list_ptr], eax
|
||||
.ret:
|
||||
ret
|
||||
|
||||
@@ -1323,59 +1315,10 @@ dereference_dll:
|
||||
|
||||
destroy_hdll:
|
||||
push ebx ecx esi edi
|
||||
push eax
|
||||
mov ebx, [eax+HDLL.base]
|
||||
mov esi, [eax+HDLL.parent]
|
||||
mov edx, [esi+DLLDESCR.size]
|
||||
; The following actions require the context of application where HDLL is mapped.
|
||||
; However, destroy_hdll can be called in the context of OS thread when
|
||||
; cleaning up objects created by the application which is destroyed.
|
||||
; So remember current cr3 and set it to page table of target.
|
||||
mov eax, [ecx+APPDATA.dir_table]
|
||||
; Because we cheat with cr3, disable interrupts: task switch would restore
|
||||
; page table from APPDATA of current thread.
|
||||
; Also set [current_slot] because it is used by user_free.
|
||||
pushf
|
||||
cli
|
||||
push [current_slot]
|
||||
mov [current_slot], ecx
|
||||
mov ecx, cr3
|
||||
push ecx
|
||||
mov cr3, eax
|
||||
push ebx ; argument for user_free
|
||||
mov eax, ebx
|
||||
shr ebx, 12
|
||||
push ebx
|
||||
mov esi, [esi+DLLDESCR.data]
|
||||
shr esi, 12
|
||||
.unmap_loop:
|
||||
push eax
|
||||
mov eax, 2
|
||||
xchg eax, [page_tabs+ebx*4]
|
||||
mov ecx, [page_tabs+esi*4]
|
||||
and eax, not 0xFFF
|
||||
and ecx, not 0xFFF
|
||||
cmp eax, ecx
|
||||
jz @f
|
||||
call free_page
|
||||
@@:
|
||||
pop eax
|
||||
invlpg [eax]
|
||||
add eax, 0x1000
|
||||
inc ebx
|
||||
inc esi
|
||||
sub edx, 0x1000
|
||||
ja .unmap_loop
|
||||
pop ebx
|
||||
and dword [page_tabs+(ebx-1)*4], not DONT_FREE_BLOCK
|
||||
call user_free
|
||||
; Restore context.
|
||||
pop eax
|
||||
mov cr3, eax
|
||||
pop [current_slot]
|
||||
popf
|
||||
; Ok, cheating is done.
|
||||
pop eax
|
||||
|
||||
push eax
|
||||
mov esi, [eax+HDLL.parent]
|
||||
mov eax, [eax+HDLL.refcount]
|
||||
|
Reference in New Issue
Block a user