forked from KolibriOS/kolibrios
Introduced new header version, that to serve STDIO through a IPC sockets mechanism. Some code cleanup and comments added.
git-svn-id: svn://kolibrios.org@3240 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
f88cc7c1af
commit
0d1c86e7bb
@ -31,6 +31,24 @@ struct APP_HEADER_01_
|
|||||||
ends
|
ends
|
||||||
|
|
||||||
|
|
||||||
|
hdrVersion1 = 1 ; it is the old version of the header, without console fields
|
||||||
|
hdrVersionConsole = 2 ; it is the new version of the header, containing 2 mode dword fields
|
||||||
|
|
||||||
|
struct APP_HEADER_02_
|
||||||
|
banner dq ? ; 'MENUET01'
|
||||||
|
version dd ? ;+8 ; == hdrVersionConsole
|
||||||
|
start dd ? ;+12
|
||||||
|
i_end dd ? ;+16
|
||||||
|
mem_size dd ? ;+20
|
||||||
|
stack_top dd ? ;+24
|
||||||
|
i_param dd ? ;+28
|
||||||
|
i_icon dd ? ;+32
|
||||||
|
|
||||||
|
stdio dd ?
|
||||||
|
stderr dd ?
|
||||||
|
ends
|
||||||
|
|
||||||
|
|
||||||
struct APP_PARAMS
|
struct APP_PARAMS
|
||||||
app_cmdline dd ? ;0x00
|
app_cmdline dd ? ;0x00
|
||||||
app_path dd ? ;0x04
|
app_path dd ? ;0x04
|
||||||
@ -39,28 +57,31 @@ struct APP_PARAMS
|
|||||||
app_mem dd ? ;0x10
|
app_mem dd ? ;0x10
|
||||||
ends
|
ends
|
||||||
|
|
||||||
macro _clear_ op
|
; not needed
|
||||||
{ mov ecx, op/4
|
;macro _clear_ op
|
||||||
xor eax, eax
|
;{ mov ecx, op/4
|
||||||
cld
|
; xor eax, eax
|
||||||
rep stosd
|
; cld
|
||||||
}
|
; rep stosd
|
||||||
|
;}
|
||||||
|
|
||||||
fs_execute_from_sysdir:
|
fs_execute_from_sysdir:
|
||||||
xor ebx, ebx
|
xor ebx, ebx ; command line arguments.
|
||||||
fs_execute_from_sysdir_param:
|
fs_execute_from_sysdir_param:
|
||||||
xor edx, edx
|
xor eax, eax ; no STDIO
|
||||||
|
xor ecx, ecx ; no STDERR
|
||||||
|
|
||||||
|
xor edx, edx ; flags (currently only debug flag).
|
||||||
mov esi, sysdir_path
|
mov esi, sysdir_path
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc fs_execute
|
proc fs_execute
|
||||||
|
; eax - STDIO handle
|
||||||
;fn_read:dword, file_size:dword, cluster:dword
|
; ecx - STDERR handle
|
||||||
|
|
||||||
; ebx - cmdline
|
; ebx - cmdline
|
||||||
; edx - flags
|
; edx - flags
|
||||||
; ebp - full filename
|
; ebp - full filename
|
||||||
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it
|
|
||||||
|
|
||||||
locals
|
locals
|
||||||
cmdline rd 64 ;256/4
|
cmdline rd 64 ;256/4
|
||||||
@ -80,18 +101,26 @@ proc fs_execute
|
|||||||
hdr_esp dd ? ;0x0C
|
hdr_esp dd ? ;0x0C
|
||||||
hdr_mem dd ? ;0x10
|
hdr_mem dd ? ;0x10
|
||||||
hdr_i_end dd ? ;0x14
|
hdr_i_end dd ? ;0x14
|
||||||
|
|
||||||
|
hdr_stdio dd ?
|
||||||
|
hdr_stderr dd ?
|
||||||
endl
|
endl
|
||||||
|
|
||||||
pushad
|
pushad
|
||||||
|
|
||||||
|
mov [hdr_stdio], eax
|
||||||
|
mov [hdr_stderr], ecx
|
||||||
|
|
||||||
cmp [SCR_MODE], word 0x13
|
cmp [SCR_MODE], word 0x13
|
||||||
jbe @f
|
jbe @f
|
||||||
|
|
||||||
pushad
|
pushad
|
||||||
stdcall set_cursor, [def_cursor_clock]
|
stdcall set_cursor, [def_cursor_clock]
|
||||||
mov [handle], eax
|
mov [handle], eax
|
||||||
mov [redrawmouse_unconditional], 1
|
mov [redrawmouse_unconditional], 1
|
||||||
call __sys_draw_pointer
|
call __sys_draw_pointer
|
||||||
popad
|
popad
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
mov [flags], edx
|
mov [flags], edx
|
||||||
|
|
||||||
@ -148,10 +177,28 @@ proc fs_execute
|
|||||||
|
|
||||||
lea ebx, [hdr_cmdline]
|
lea ebx, [hdr_cmdline]
|
||||||
call test_app_header
|
call test_app_header
|
||||||
mov esi, -0x1F
|
mov esi, -ERROR_INVALID_HEADER
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .err_hdr
|
jz .err_hdr
|
||||||
|
|
||||||
|
; The header is OK, so check for the version and if == hdrVersionConsole, patch the header with
|
||||||
|
; the handles of the console IO socket handlers.
|
||||||
|
mov edx, [hdr_stdio]
|
||||||
|
mov ecx, [hdr_stderr]
|
||||||
|
|
||||||
|
cmp [eax+APP_HEADER_02_.version], hdrVersionConsole
|
||||||
|
jae .patch_header
|
||||||
|
|
||||||
|
or edx, ecx
|
||||||
|
jz .wait_lock
|
||||||
|
|
||||||
|
mov esi, -ERROR_WRONG_HEADER_VERSION
|
||||||
|
jmp .err_hdr
|
||||||
|
|
||||||
|
.patch_header:
|
||||||
|
mov [eax+APP_HEADER_02_.stdio], edx
|
||||||
|
mov [eax+APP_HEADER_02_.stderr], ecx
|
||||||
|
|
||||||
.wait_lock:
|
.wait_lock:
|
||||||
cmp [application_table_status], 0
|
cmp [application_table_status], 0
|
||||||
je .get_lock
|
je .get_lock
|
||||||
@ -168,7 +215,7 @@ proc fs_execute
|
|||||||
|
|
||||||
call get_new_process_place
|
call get_new_process_place
|
||||||
test eax, eax
|
test eax, eax
|
||||||
mov esi, -0x20 ; too many processes
|
mov esi, -ERROR_TOO_MANY_PROCESSES
|
||||||
jz .err
|
jz .err
|
||||||
|
|
||||||
mov [slot], eax
|
mov [slot], eax
|
||||||
@ -176,7 +223,12 @@ proc fs_execute
|
|||||||
add eax, SLOT_BASE
|
add eax, SLOT_BASE
|
||||||
mov [slot_base], eax
|
mov [slot_base], eax
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
_clear_ 256 ;clean extended information about process
|
|
||||||
|
;_clear_ 256 ;clean extended information about process
|
||||||
|
mov ecx, 256/4
|
||||||
|
xor eax, eax
|
||||||
|
cld
|
||||||
|
rep stosd
|
||||||
|
|
||||||
; write application name
|
; write application name
|
||||||
lea eax, [filename]
|
lea eax, [filename]
|
||||||
@ -203,7 +255,7 @@ proc fs_execute
|
|||||||
mov [save_cr3], ebx
|
mov [save_cr3], ebx
|
||||||
|
|
||||||
stdcall create_app_space, [hdr_mem], [file_base], [file_size]
|
stdcall create_app_space, [hdr_mem], [file_base], [file_size]
|
||||||
mov esi, -30; no memory
|
mov esi, -ERROR_MEMORY_NOT_ENOUGH ; no memory
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .failed
|
jz .failed
|
||||||
|
|
||||||
@ -255,6 +307,7 @@ end if
|
|||||||
.failed:
|
.failed:
|
||||||
mov eax, [save_cr3]
|
mov eax, [save_cr3]
|
||||||
call set_cr3
|
call set_cr3
|
||||||
|
|
||||||
.err:
|
.err:
|
||||||
.err_hdr:
|
.err_hdr:
|
||||||
stdcall kernel_free, [file_base]
|
stdcall kernel_free, [file_base]
|
||||||
|
@ -21,9 +21,39 @@ ERROR_FS_FAIL = 9
|
|||||||
ERROR_ACCESS_DENIED = 10
|
ERROR_ACCESS_DENIED = 10
|
||||||
ERROR_DEVICE = 11
|
ERROR_DEVICE = 11
|
||||||
|
|
||||||
|
; Errors specific to fn.70.7 - program start
|
||||||
|
|
||||||
|
ERROR_MEMORY_NOT_ENOUGH = 30
|
||||||
|
ERROR_INVALID_HEADER = 31
|
||||||
|
ERROR_TOO_MANY_PROCESSES = 32
|
||||||
|
ERROR_WRONG_HEADER_VERSION = 33 ; the version of the header is lower than needed for specific feature.
|
||||||
|
|
||||||
image_of_eax EQU esp+32
|
image_of_eax EQU esp+32
|
||||||
image_of_ebx EQU esp+20
|
image_of_ebx EQU esp+20
|
||||||
|
|
||||||
|
|
||||||
|
struc FileInfoBlock {
|
||||||
|
.sub_fn dd ?
|
||||||
|
.offset dd ?
|
||||||
|
.flags dd ?
|
||||||
|
.size dd ?
|
||||||
|
.ptr_buff dd ?
|
||||||
|
.filename rb 1
|
||||||
|
.pFilename dd ?
|
||||||
|
|
||||||
|
; variants
|
||||||
|
|
||||||
|
label .execFlags dword at .offset
|
||||||
|
label .execPtrArg dword at .flags
|
||||||
|
label .execStdIO dword at .size
|
||||||
|
label .execStdErr dword at .ptr_buff
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual at 0
|
||||||
|
FileInfoBlock FileInfoBlock
|
||||||
|
end virtual
|
||||||
|
|
||||||
|
|
||||||
; System function 70 - files with long names (LFN)
|
; System function 70 - files with long names (LFN)
|
||||||
; diamond, 2006
|
; diamond, 2006
|
||||||
|
|
||||||
@ -103,6 +133,8 @@ fs_additional_handlers:
|
|||||||
dd 0
|
dd 0
|
||||||
|
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
|
||||||
file_system_lfn:
|
file_system_lfn:
|
||||||
; in: ebx->fileinfo block
|
; in: ebx->fileinfo block
|
||||||
; operation codes:
|
; operation codes:
|
||||||
@ -118,11 +150,11 @@ file_system_lfn:
|
|||||||
; 9 : create directory
|
; 9 : create directory
|
||||||
|
|
||||||
; parse file name
|
; parse file name
|
||||||
lea esi, [ebx+20]
|
lea esi, [ebx+FileInfoBlock.filename]
|
||||||
lodsb
|
lodsb
|
||||||
test al, al
|
test al, al
|
||||||
jnz @f
|
jnz @f
|
||||||
mov esi, [esi]
|
mov esi, [esi] ; FileInfoBlock.pFilename actually.
|
||||||
lodsb
|
lodsb
|
||||||
@@:
|
@@:
|
||||||
cmp al, '/'
|
cmp al, '/'
|
||||||
@ -142,13 +174,18 @@ file_system_lfn:
|
|||||||
call process_replace_file_name
|
call process_replace_file_name
|
||||||
.parse_normal:
|
.parse_normal:
|
||||||
cmp dword [ebx], 7
|
cmp dword [ebx], 7
|
||||||
jne @F
|
jne .not_execute
|
||||||
mov edx, [ebx+4]
|
|
||||||
mov ebx, [ebx+8]
|
mov eax, [ebx+FileInfoBlock.execStdIO] ; or NULL if not needed.
|
||||||
call fs_execute; esi+ebp, ebx, edx
|
mov ecx, [ebx+FileInfoBlock.execStdErr] ; or NULL if not needed.
|
||||||
|
mov edx, [ebx+FileInfoBlock.execFlags] ; now only debug flag
|
||||||
|
mov ebx, [ebx+FileInfoBlock.execPtrArg] ; pointer to string with command line arguments.
|
||||||
|
|
||||||
|
call fs_execute ; esi+ebp, ebx, edx
|
||||||
mov [image_of_eax], eax
|
mov [image_of_eax], eax
|
||||||
ret
|
ret
|
||||||
@@:
|
|
||||||
|
.not_execute:
|
||||||
mov edi, rootdirs-8
|
mov edi, rootdirs-8
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
push esi
|
push esi
|
||||||
@ -181,8 +218,8 @@ file_system_lfn:
|
|||||||
cmp dword [ebx], 1
|
cmp dword [ebx], 1
|
||||||
jnz .access_denied
|
jnz .access_denied
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov ebp, [ebx+12] ;количество блоков для считывания
|
mov ebp, [ebx+12] ; block count to be read.
|
||||||
mov edx, [ebx+16] ;куда записывать рузельтат
|
mov edx, [ebx+16] ; where to write the result.
|
||||||
; add edx, std_application_base_address
|
; add edx, std_application_base_address
|
||||||
push dword [ebx+4] ; first block
|
push dword [ebx+4] ; first block
|
||||||
mov ebx, [ebx+8] ; flags
|
mov ebx, [ebx+8] ; flags
|
||||||
|
@ -77,7 +77,7 @@ $Revision $
|
|||||||
USE_COM_IRQ equ 1 ; make irq 3 and irq 4 available for PCI devices
|
USE_COM_IRQ equ 1 ; make irq 3 and irq 4 available for PCI devices
|
||||||
|
|
||||||
; Enabling the next line will enable serial output console
|
; Enabling the next line will enable serial output console
|
||||||
;debug_com_base equ 0x2f8 ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used
|
debug_com_base equ 0x3f8 ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used
|
||||||
|
|
||||||
include "proc32.inc"
|
include "proc32.inc"
|
||||||
include "kglobals.inc"
|
include "kglobals.inc"
|
||||||
|
Loading…
Reference in New Issue
Block a user