Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 187 → Rev 188

/kernel/trunk/core/dll.inc
295,8 → 295,9
 
mov eax, [sz_name]
test eax, eax
jz .fail
 
jnz @F
ret
@@:
mov [srv_ptr], srv_tab
mov [counter], 16
@@:
308,27 → 309,12
dec [counter]
jnz @B
.not_load:
 
stdcall find_service, [sz_name]
test eax, eax
jz .fail
 
stdcall load_lib, eax
test eax, eax
jz .fail
 
mov [srv_ptr], srv_tab
mov [counter], 16
jnz @F
ret
@@:
stdcall strncmp, [srv_ptr], [sz_name], 16
test eax, eax
je .ok
 
add [srv_ptr], SRV_SIZE
dec [counter]
jnz @B
.fail:
xor eax, eax
stdcall load_driver, eax
ret
.ok:
mov eax, [srv_ptr]
423,29 → 409,6
endp
 
align 4
proc link_dll stdcall, exp:dword, imp:dword
mov esi, [imp]
.next:
mov eax, [esi]
test eax, eax
jz .end
 
push esi
stdcall get_proc, [exp], eax
pop esi
 
test eax, eax
jz @F
 
mov [esi], eax
@@:
add esi, 4
jmp .next
.end:
ret
endp
 
align 4
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
 
@@:
464,143 → 427,387
endp
 
align 4
proc load_lib stdcall, name:dword
proc get_curr_task
mov eax,[CURRENT_TASK]
shl eax, 8
ret
endp
 
align 4
proc get_fileinfo stdcall, file_name:dword, info:dword
locals
lib dd ?
base dd ?
pSym dd ?
cmd dd ?
offset dd ?
dd ?
count dd ?
buff dd ?
db ?
name dd ?
endl
 
mov eax, [name]
mov ebx, 1 ;index of first block
mov ecx, 32 ;number of blocks
mov edx, TMP_BUFF ;temp area
mov esi, 12 ;file name length
xor eax, eax
mov ebx, [file_name]
sub ebx, new_app_base
mov ecx, [info]
sub ecx, new_app_base
 
call fileread ;read file from RD
mov [cmd], 5
mov [offset], eax
mov [offset+4], eax
mov [count], eax
mov [buff], ecx
mov byte [buff+4], al
mov [name], ebx
 
cmp eax,0
jne .err
mov eax, 70
lea ebx, [cmd]
sub ebx, new_app_base
int 0x40
ret
endp
 
; mov eax, [TMP_BUFF+CFH.pSymTable]
; add eax, TMP_BUFF
; mov [pSym], eax
align 4
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
bytes:dword
locals
cmd dd ?
offset dd ?
dd ?
count dd ?
buff dd ?
db ?
name dd ?
endl
 
; mov [TMP_BUFF+20+CFS.VirtualAddress], eax
xor eax, eax
mov ebx, [file_name]
mov ecx, [off]
mov edx, [bytes]
mov esi, [buffer]
sub ebx, new_app_base
sub esi, new_app_base
 
stdcall kernel_alloc, [TMP_BUFF+20+CFS.SizeOfRawData]
mov [base], eax
mov [cmd], eax
mov [offset], ecx
mov [offset+4], eax
mov [count], edx
mov [buff], esi
mov byte [buff+4], al
mov [name], ebx
 
test eax, eax
jnz @f
@@:
mov [TMP_BUFF+20+CFS.VirtualAddress], eax
mov ebx, [TMP_BUFF+CFH.pSymTable]
add ebx, TMP_BUFF
mov [pSym], ebx
mov eax, 70
lea ebx, [cmd]
sub ebx, new_app_base
int 0x40
ret
endp
 
stdcall LinkSection, TMP_BUFF, TMP_BUFF+20, ebx
align 4
proc load_file stdcall, file_name:dword
locals
attr dd ?
flags dd ?
cr_time dd ?
cr_date dd ?
acc_time dd ?
acc_date dd ?
mod_time dd ?
mod_date dd ?
file_size dd ?
 
mov edi, [base]
test edi, edi
jnz @f
@@:
mov esi, [TMP_BUFF+20+CFS.PtrRawData]
add esi, TMP_BUFF
mov ecx, [TMP_BUFF+20+CFS.SizeOfRawData]
rep movsb
file dd ?
endl
 
call alloc_dll
lea eax, [attr]
stdcall get_fileinfo, [file_name], eax
test eax, eax
jnz @f
@@:
mov [lib], eax
jnz .fail
 
mov edi, eax
mov esi, [name]
mov ecx, 16
rep movsb
stdcall kernel_alloc, [file_size]
mov [file], eax
 
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols],szSTART
mov edi, [lib]
add eax, [base]
mov [edi+LIB.lib_start], eax
mov ebx, [base]
mov [edi+LIB.lib_base], ebx
stdcall read_file, [file_name], eax, dword 0, [file_size]
cmp ebx, [file_size]
jne .cleanup
mov eax, [file]
ret
.cleanup:
stdcall kernel_free, [file]
.fail:
xor eax, eax
ret
endp
 
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szEXPORTS
mov edi, [lib]
add eax, [base]
mov [edi+LIB.export], eax
align 4
proc get_proc_ex stdcall, proc_name:dword, imports:dword
 
stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szIMPORTS
mov edi, [lib]
add eax, [base]
mov [edi+LIB.import], eax
.look_up:
mov edx, [imports]
mov edx, [edx]
test edx, edx
jz .end
.next:
mov eax, [edx]
test eax, eax
jz .next_table
 
stdcall link_dll, kernel_export, eax
push edx
stdcall strncmp, eax, [proc_name], 16
pop edx
test eax, eax
jz .ok
 
mov edi, [lib]
call [edi+LIB.lib_start]
 
mov eax, [lib]
add edx,8
jmp .next
.next_table:
add [imports], 4
jmp .look_up
.ok:
mov eax, [edx+4]
ret
.err:
.end:
xor eax, eax
ret
endp
 
align 4
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
sym_count:dword, strings:dword, imports:dword
locals
retval dd ?
endl
 
mov edi, [symbols]
mov [retval], 1
.fix:
movzx ebx, [edi+CSYM.SectionNumber]
test ebx, ebx
jnz .internal
mov eax, dword [edi+CSYM.Name]
test eax, eax
jnz @F
 
mov edi, [edi+4]
add edi, [strings]
@@:
push edi
stdcall get_proc_ex, edi,[imports]
pop edi
 
xor ebx, ebx
test eax, eax
jnz @F
 
mov esi, msg_unresolved
call sys_msg_board_str
mov esi, edi
call sys_msg_board_str
mov esi, msg_CR
call sys_msg_board_str
 
mov [retval],0
@@:
mov edi, [symbols]
mov [edi+CSYM.Value], eax
jmp .next
.internal:
dec ebx
shl ebx, 3
lea ebx, [ebx+ebx*4]
add ebx, [sec]
 
mov eax, [ebx+CFS.VirtualAddress]
add [edi+CSYM.Value], eax
.next:
add edi, CSYM_SIZE
mov [symbols], edi
dec [sym_count]
jnz .fix
mov eax, [retval]
ret
endp
 
align 4
proc LinkSection stdcall, pCoff:dword, pSec:dword, pSym:dword
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
locals
pCode dd ?
n_sec dd ?
endl
 
mov esi, [pSec]
mov eax, [esi+CFS.PtrRawData]
add eax, [pCoff]
mov [pCode], eax
 
mov eax, [coff]
movzx ebx, [eax+CFH.nSections]
mov [n_sec], ebx
.fix_sec:
mov esi, [sec]
mov edi, [esi+CFS.PtrReloc]
add edi, [pCoff]
add edi, [coff]
 
movzx edx, [esi+CFS.NumReloc]
mov eax, edx
lea edx, [edx+edx*8]
add edx, eax
add edx, edi
.l_0:
cmp edi, edx
jae .exit
 
movzx ecx, [esi+CFS.NumReloc]
test ecx, ecx
jz .next
.next_reloc:
mov ebx, [edi+CRELOC.SymIndex]
add ebx,ebx
lea ebx,[ebx+ebx*8]
add ebx, [sym]
 
add ebx, [pSym]
mov edx, [ebx+CSYM.Value]
 
mov ecx, [ebx+CSYM.Value]
add ecx, [esi+CFS.VirtualAddress]
cmp [edi+CRELOC.Type], 6
je .dir_32
 
cmp [edi+CRELOC.Type], 20
jne .next_reloc
.rel_32:
mov eax, [edi+CRELOC.VirtualAddress]
add eax, [pCode]
add [eax], ecx
add eax, [esi+CFS.VirtualAddress]
sub edx, eax
sub edx, 4
jmp .fix
.dir_32:
mov eax, [edi+CRELOC.VirtualAddress]
add eax, [esi+CFS.VirtualAddress]
.fix:
add [eax], edx
add edi, 10
jmp .l_0
 
dec ecx
jnz .next_reloc
.next:
add [sec], 40
dec [n_sec]
jnz .fix_sec
.exit:
ret
endp
 
proc get_curr_task
mov eax,[CURRENT_TASK]
shl eax, 8
align 4
proc load_driver stdcall, file_name:dword
locals
coff dd ?
sym dd ?
strings dd ?
img_size dd ?
img_base dd ?
start dd ?
 
exports dd ? ;fake exports table
dd ?
endl
 
stdcall load_file, [file_name]
test eax, eax
jz .fail
 
mov [coff], eax
 
movzx ecx, [eax+CFH.nSections]
xor ebx, ebx
 
lea edx, [eax+20]
@@:
add ebx, [edx+CFS.SizeOfRawData]
add ebx, 15
and ebx, not 15
add edx, 18
dec ecx
jnz @B
mov [img_size], ebx
 
stdcall kernel_alloc, ebx
test eax, eax
jz .fail
mov [img_base], eax
 
mov edi, eax
xor eax, eax
mov ecx, [img_size]
add ecx, 4095
and ecx, not 4095
shr ecx, 2
cld
rep stosd
 
mov edx, [coff]
movzx ebx, [edx+CFH.nSections]
mov edi, [img_base]
lea eax, [edx+20]
@@:
mov [eax+CFS.VirtualAddress], edi
mov esi, [eax+CFS.PtrRawData]
test esi, esi
jnz .copy
add edi, [eax+CFS.SizeOfRawData]
jmp .next
.copy:
add esi, edx
mov ecx, [eax+CFS.SizeOfRawData]
cld
rep movsb
.next:
add edi, 15
and edi, not 15
add eax, 40
dec ebx
jnz @B
 
mov ebx, [edx+CFH.pSymTable]
add ebx, edx
mov [sym], ebx
mov ecx, [edx+CFH.nSymbols]
add ecx,ecx
lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
add ecx, [sym]
mov [strings], ecx
 
lea ebx, [exports]
mov dword [ebx], kernel_export
mov dword [ebx+4], 0
lea eax, [edx+20]
 
stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
[strings], ebx
test eax, eax
jnz @F
 
mov esi, msg_module
call sys_msg_board_str
mov esi, [file_name]
call sys_msg_board_str
mov esi, msg_CR
call sys_msg_board_str
 
stdcall kernel_free,[coff]
xor eax, eax
ret
@@:
mov ebx, [coff]
add ebx, 20
stdcall fix_coff_relocs, [coff], ebx, [sym]
 
mov ebx, [coff]
stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
mov [start], eax
 
stdcall kernel_free, [coff]
 
mov ebx, [start]
call ebx
test eax, eax
jnz .ok
 
stdcall kernel_free, [img_base]
xor eax, eax
ret
.ok:
mov ebx, [img_base]
mov [eax+SRV.base], ebx
ret
.fail:
xor eax, eax
ret
endp
 
drv_sound db 'UNISOUNDOBJ', 0
drv_infinity db 'INFINITYOBJ', 0
drv_sound db '/rd/1/unisound.obj', 0
drv_infinity db '/rd/1/infinity.obj', 0
 
szSound db 'SOUND',0
szInfinity db 'INFINITY',0
609,6 → 816,10
szEXPORTS db 'EXPORTS',0
szIMPORTS db 'IMPORTS',0
 
msg_unresolved db 'unresolved ',0
msg_module db 'in module ',0
msg_CR db 13,10,0
 
align 16
services:
dd szSound, drv_sound