/kernel/trunk/core/dll.inc |
---|
899,7 → 899,7 |
ret |
align 4 |
proc load_library stdcall, file_name:dword |
proc load_library stdcall, file_name:dword, encoding:dword |
locals |
fullname dd ? |
fileinfo rb 40 |
910,8 → 910,12 |
; resolve file name |
stdcall kernel_alloc, maxPathLength |
mov [fullname], eax |
mov ebx, [file_name] |
stdcall get_full_file_name, eax, maxPathLength |
mov edi, eax |
mov esi, [file_name] |
mov eax, [encoding] |
push ebp |
call getFullPath |
pop ebp |
test eax, eax |
jz .fail |
; scan for required DLL in list of already loaded for this process, |
/kernel/trunk/core/memory.inc |
---|
1101,13 → 1101,11 |
f68: |
cmp ebx, 4 |
jbe sys_sheduler |
cmp ebx, 11 |
jb undefined_syscall |
cmp ebx, 27 |
ja undefined_syscall |
xor eax, eax |
jmp dword [f68call+ebx*4-11*4] |
.11: |
call init_heap |
1143,7 → 1141,7 |
.19: |
cmp ecx, OS_BASE |
jae .fail |
stdcall load_library, ecx |
stdcall load_library, ecx, eax |
mov [esp+SYSCALL_STACK._eax], eax |
ret |
.20: |
1155,10 → 1153,8 |
.21: |
cmp ecx, OS_BASE |
jae .fail |
cmp edx, OS_BASE |
jae .fail |
stdcall load_pe_driver, ecx, edx |
mov [esp+SYSCALL_STACK._eax], eax |
ret |
1165,16 → 1161,13 |
.22: |
cmp ecx, OS_BASE |
jae .fail |
stdcall shmem_open, ecx, edx, esi |
mov [esp+SYSCALL_STACK._edx], edx |
mov [esp+SYSCALL_STACK._eax], eax |
ret |
.23: |
cmp ecx, OS_BASE |
jae .fail |
stdcall shmem_close, ecx |
mov [esp+SYSCALL_STACK._eax], eax |
ret |
1195,16 → 1188,13 |
bts [eax+APPDATA.except_mask], ecx |
@@: |
ret |
.26: |
stdcall user_unmap, ecx, edx, esi |
mov [esp+SYSCALL_STACK._eax], eax |
ret |
.27: |
cmp ecx, OS_BASE |
jae .fail |
stdcall load_file_umode, ecx |
mov [esp+SYSCALL_STACK._edx], edx |
mov [esp+SYSCALL_STACK._eax], eax |
1211,11 → 1201,9 |
ret |
.fail: |
xor eax, eax |
mov [esp+SYSCALL_STACK._eax], eax |
ret |
align 4 |
f68call: ; keep this table closer to main code |
/kernel/trunk/core/taskman.inc |
---|
66,11 → 66,19 |
fs_execute_from_sysdir: |
xor ebx, ebx |
fs_execute_from_sysdir_param: |
stdcall kernel_alloc, maxPathLength |
push eax ebx |
mov esi, ebp |
mov edi, eax |
xor eax, eax |
call getFullPath |
pop ecx ebx |
xor edx, edx |
proc fs_execute |
; ebx - cmdline |
; edx - flags |
; ebp - full filename |
; edx = flags |
; ecx -> cmdline |
; ebx -> absolute file path |
; eax = string length |
locals |
cmdline rd 1 |
flags rd 1 |
91,16 → 99,13 |
endl |
mov [flags], edx |
mov [cmdline], ebx |
stdcall kernel_alloc, maxPathLength |
mov [path_string], eax |
mov ebx, [ebp] |
stdcall get_full_file_name, eax, maxPathLength |
mov [cmdline], ecx |
mov [path_string], ebx |
mov [filename_size], eax |
mov esi, -ERROR_FILE_NOT_FOUND |
test eax, eax |
jz .err_file |
stdcall load_file, [path_string] |
mov esi, -ERROR_FILE_NOT_FOUND |
stdcall load_file, ebx |
test eax, eax |
jz .err_file |
141,7 → 146,6 |
jz @f |
stosb |
loop @b |
@@: |
mov edi, [cmdline] |
xor eax, eax |
169,10 → 173,6 |
lea edx, [ebx+APPDATA.list] |
lea ecx, [eax+PROC.thr_list] |
list_add_tail edx, ecx |
mov edi, [path_string] |
mov ecx, maxPathLength |
call _strnlen |
mov [filename_size], eax |
mov eax, [cmdline_size] |
add eax, sizeof.APP_HDR |
stdcall kernel_alloc, eax |
/kernel/trunk/fs/fs_lfn.inc |
---|
40,17 → 40,6 |
file_system_lfn: |
; in: ebx -> parameter structure |
; operation codes: |
; 0 = read file |
; 1 = read folder |
; 2 = create/rewrite file |
; 3 = write/append to file |
; 4 = set file end |
; 5 = get file info |
; 6 = set file info |
; start application |
; 8 = delete file/folder |
; 9 = create folder |
lea ebp, [ebx+20] |
cmp byte [ebp], 0 |
jnz @f |
69,23 → 58,25 |
cmp word [ebp+3], 0 |
jz .rootdir |
@@: |
stdcall kernel_alloc, maxPathLength |
push eax ebx |
xchg eax, edi |
mov esi, ebp |
xor eax, eax |
call getFullPath |
pop ebx ebp |
test eax, eax |
jz .notfound |
cmp dword[ebx], 7 ; start application |
jnz @f |
mov edx, [ebx+4] |
mov ebx, [ebx+8] |
call fs_execute ; ebp, ebx, edx |
mov ecx, [ebx+8] |
mov ebx, ebp |
call fs_execute |
mov [image_of_eax], eax |
ret |
@@: |
stdcall kernel_alloc, maxPathLength |
push ebx |
mov ebx, ebp |
mov ebp, eax |
stdcall get_full_file_name, eax, maxPathLength |
pop ebx |
test eax, eax |
jz .notfound |
lea esi, [ebp+2] |
mov ax, [esi] |
or ax, 2020h |
491,40 → 482,42 |
ret |
.set: |
pop eax |
push maxPathLength |
push edi |
push eax |
mov ebx, ecx |
get_full_file_name: |
; in: ebx -> file name, [esp+4] -> destination, [esp+8] = max length |
; out: UTF-8 string, eax=0 -> out of length |
push ebp ebx |
cmp byte [ebx], 0 |
jz .set_relative |
mov esi, ebx |
cmp byte [ebx], 4 |
mov esi, ecx |
xor eax, eax |
getFullPath: |
; in: esi -> file path, eax = string encoding, edi -> destination |
; out: UTF-8 string (with marker), eax = length, 0 -> error |
test eax, eax |
jnz @f |
cmp byte [esi], 4 |
jnc @f |
inc esi |
cmp byte [esi], 0 |
jz @f |
lodsb |
@@: |
cmp byte [esi], '/' |
jnz .set_relative |
jnz .relative |
cmp eax, 2 |
jnz @f |
cmp word [esi], '/' |
jnz .relative |
inc esi |
inc esi |
jmp .start |
@@: |
inc esi |
cmp byte [esi], 4 |
jnc @f |
mov ebx, esi |
inc esi |
jnc .start |
lodsb |
cmp byte [esi], '/' |
jnz .start |
inc esi |
@@: |
cmp byte [ebx], 2 |
jnz .start |
inc esi |
.start: |
push eax edi |
call process_replace_file_name |
mov edi, [esp+12] |
mov ecx, [esp+16] |
mov edi, [esp] |
mov ecx, maxPathLength |
mov al, 3 |
mov ah, '/' |
stosw |
540,9 → 533,9 |
mov esi, ebp |
dec edi |
.absolute: |
cmp byte [ebx], 2 |
cmp byte [esp+4], 2 |
jz .utf16 |
cmp byte [ebx], 3 |
cmp byte [esp+4], 3 |
jz .utf8 |
call cp866toUTF8_string |
jns .end |
562,31 → 555,29 |
jns .end |
.fail: |
mov byte [edi], 0 |
pop eax eax |
xor eax, eax |
pop ebx ebp |
ret 8 |
ret |
.set_relative: |
.relative: |
push eax edi |
mov ebx, esi |
mov edi, [current_slot] |
mov edi, [edi+APPDATA.cur_dir] |
mov edx, edi |
mov ecx, [esp+16] |
mov ecx, maxPathLength |
xor eax, eax |
repnz scasb |
mov esi, edi |
dec esi |
mov edi, [esp+12] |
mov edi, [esp] |
jecxz .fail |
cmp byte [ebx], 0 |
jz .set_ok |
cmp byte [ebx], 4 |
jnc @f |
inc ebx |
@@: |
dec esi |
cmp edx, edi ; is destination equal to cur_dir? |
mov edi, esi |
jz @f |
mov edi, [esp+12] |
mov edi, [esp] |
mov ecx, esi |
sub ecx, edx |
mov esi, edx |
597,9 → 588,8 |
inc edi |
mov esi, ebx |
mov ecx, edx |
add ecx, [esp+16] |
add ecx, maxPathLength |
sub ecx, edi |
mov ebx, [esp] |
jmp .absolute |
.set_ok: |
609,15 → 599,16 |
sub ecx, edx |
mov esi, edx |
rep movsb |
mov byte [edi], 0 |
@@: |
mov al, 1 |
pop ebx ebp |
ret 8 |
pop eax |
sub edi, eax |
pop eax |
mov eax, edi |
ret |
.end: |
or ecx, -1 |
mov edi, [esp+12] |
mov edi, [esp] |
xor eax, eax |
push edi |
repnz scasb |
641,7 → 632,7 |
jnz @f |
mov edx, ecx |
mov ecx, edi |
sub ecx, [esp+12] |
sub ecx, [esp] |
sub ecx, 2 |
jc .fail |
sub edi, 2 |