Subversion Repositories Kolibri OS

Rev

Rev 6345 | Rev 6758 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6345 Rev 6502
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 6345 $
8
$Revision: 6502 $
Line 9... Line 9...
9
 
9
 
Line 39... Line 39...
39
        _emem           rd 1    ;0x14
39
        _emem           rd 1    ;0x14
40
        img_base        rd 1    ;0x18
40
        img_base        rd 1    ;0x18
41
        img_size        rd 1
41
        img_size        rd 1
42
        filename_size   rd 1
42
        filename_size   rd 1
43
        cmdline_size    rd 1
43
        cmdline_size    rd 1
-
 
44
        path_string     rd 1
44
ends
45
ends
Line 45... Line 46...
45
 
46
 
46
macro _clear_ op
47
macro _clear_ op
47
{  mov ecx, op/4
48
{  mov ecx, op/4
Line 64... Line 65...
64
 
65
 
65
fs_execute_from_sysdir:
66
fs_execute_from_sysdir:
66
        xor     ebx, ebx
67
        xor     ebx, ebx
67
fs_execute_from_sysdir_param:
68
fs_execute_from_sysdir_param:
68
        xor     edx, edx
-
 
69
 
-
 
70
align 4
69
        xor     edx, edx
71
proc fs_execute
70
proc fs_execute
72
; ebx - cmdline
71
; ebx - cmdline
73
; edx - flags
72
; edx - flags
74
; ebp - full filename
-
 
75
 
73
; ebp - full filename
76
       locals
-
 
77
         filename      rd 1
74
    locals
78
         cmdline       rd 1
75
        cmdline         rd  1
79
         flags         rd 1
-
 
80
 
76
        flags           rd  1
81
         slot          rd 1
77
        slot            rd  1
82
         slot_base     rd 1
-
 
83
 
78
        slot_base       rd  1
84
;app header data
-
 
85
 
79
; app header data
86
         hdr_cmdline   rd 1 ;0x00
80
        hdr_cmdline     rd  1
87
         hdr_path      rd 1 ;0x04
81
        hdr_path        rd  1
88
         hdr_eip       rd 1 ;0x08
82
        hdr_eip         rd  1
89
         hdr_esp       rd 1 ;0x0C
83
        hdr_esp         rd  1
90
         hdr_edata     rd 1 ;0x10
84
        hdr_edata       rd  1
91
         hdr_emem      rd 1 ;0x14
85
        hdr_emem        rd  1
92
         file_base     rd 1 ;0x18
86
        file_base       rd  1
93
         file_size     rd 1 ;0x1c
87
        file_size       rd  1
94
         filename_size rd 1 ;0x20
88
        filename_size   rd  1
95
         cmdline_size  rd 1 ;0x24
-
 
-
 
89
        cmdline_size    rd  1
96
 
90
        path_string     rd  1
Line 97... Line -...
97
       endl
-
 
98
 
91
    endl
99
        mov     eax, [ebp]
92
 
-
 
93
        mov     [flags], edx
100
        mov     [flags], edx
94
        mov     [cmdline], ebx
-
 
95
        stdcall kernel_alloc, maxPathLength
-
 
96
        mov     [path_string], eax
-
 
97
        mov     ebx, [ebp]
-
 
98
        stdcall get_full_file_name, eax, maxPathLength
Line 101... Line -...
101
        mov     [cmdline], ebx
-
 
102
        mov     [filename], eax
99
        test    eax, eax
103
 
100
        jz      .err_file
104
        mov     eax, [filename]
101
 
105
        stdcall load_file, eax
102
        stdcall load_file, [path_string]
Line 106... Line 103...
106
        mov     esi, -ERROR_FILE_NOT_FOUND
103
        mov     esi, -ERROR_FILE_NOT_FOUND
107
        test    eax, eax
104
        test    eax, eax
108
        jz      .err_file
-
 
109
 
105
        jz      .err_file
110
        mov     [file_base], eax
106
 
111
        mov     [file_size], ebx
107
        mov     [file_base], eax
112
 
108
        mov     [file_size], ebx
113
        lea     ebx, [hdr_cmdline]
109
        lea     ebx, [hdr_cmdline]
Line 114... Line 110...
114
        call    test_app_header
110
        call    test_app_header
115
        mov     esi, -0x1F
-
 
116
        test    eax, eax
111
        mov     esi, -0x1F
117
        jz      .err_hdr
112
        test    eax, eax
118
 
113
        jz      .err_hdr
119
        call    lock_application_table
114
 
Line 120... Line 115...
120
 
115
        call    lock_application_table
121
        call    alloc_thread_slot
116
        call    alloc_thread_slot
122
        mov     esi, -0x20 ; too many processes
117
        mov     esi, -0x20  ; too many processes
123
        test    eax, eax
118
        test    eax, eax
124
        jz      .err_0
-
 
125
 
119
        jz      .err_0
126
        mov     [slot], eax
120
 
127
        shl     eax, 8
121
        mov     [slot], eax
128
        lea     edi, [SLOT_BASE+eax]
122
        shl     eax, 8
129
        mov     [slot_base], edi
123
        lea     edi, [SLOT_BASE+eax]
130
 
-
 
131
;clean extended information about process
124
        mov     [slot_base], edi
132
        mov     ecx, 256/4
125
; clean extended information about process
133
        xor     eax, eax
-
 
134
        cld
126
        mov     ecx, 256/4
135
        rep stosd
127
        xor     eax, eax
136
 
-
 
137
; write application name
-
 
138
        stdcall strrchr, [filename], '/'  ; now eax points to name without path
-
 
139
 
-
 
140
        lea     esi, [eax+1]
128
        cld
-
 
129
        rep stosd
141
        test    eax, eax
130
; write application name
142
        jnz     @F
131
        stdcall strrchr, [path_string], '/'
143
        mov     esi, [filename]
132
        lea     esi, [eax+1]    ; -> name without path
144
@@:
133
        mov     ecx, 11
145
        mov     ecx, 11 ; 11 chars for name! 8 - is old value!
134
        mov     edi, [slot_base]
146
        mov     edi, [slot_base]
135
@@:
147
.copy_process_name_loop:
136
        call    utf8to16
148
        lodsb
137
        call    uni2ansi_char
149
        cmp     al, '.'
-
 
150
        jz      .copy_process_name_done
-
 
Line -... Line 138...
-
 
138
        cmp     al, '.'
151
        test    al, al
139
        jz      @f
152
        jz      .copy_process_name_done
140
        test    al, al
153
        stosb
141
        jz      @f
154
        loop    .copy_process_name_loop
142
        stosb
155
 
-
 
156
.copy_process_name_done:
143
        loop    @b
157
 
144
 
158
        mov     edi, [cmdline]
145
@@:
159
        xor     eax, eax
146
        mov     edi, [cmdline]
160
        test    edi, edi
147
        xor     eax, eax
161
        jz      @F
148
        test    edi, edi
162
 
149
        jz      @f
163
        mov     ecx, 65535
150
        mov     ecx, 65535
164
        call    _strnlen
-
 
165
        cmp     eax, 256
151
        call    _strnlen
166
        jb      @F
-
 
167
        lea     ebx, [eax+1]
152
        cmp     eax, 256
168
        add     [hdr_emem], ebx
153
        jb      @f
169
@@:
154
        lea     ebx, [eax+1]
Line 170... Line 155...
170
        mov     [cmdline_size], eax
155
        add     [hdr_emem], ebx
171
 
156
@@:
172
        stdcall create_process, [hdr_emem]
-
 
173
 
157
        mov     [cmdline_size], eax
174
        mov     esi, -30; no memory
158
        stdcall create_process, [hdr_emem]
175
        test    eax, eax
-
 
176
        jz      .err_hdr
159
        mov     esi, -30    ; no memory
177
 
160
        test    eax, eax
178
        mov     ebx, [sys_proc+LHEAD.prev]
-
 
179
        __list_add eax, ebx, sys_proc
161
        jz      .err_hdr
180
 
162
 
181
        mov     ebx, [hdr_emem]
163
        mov     ebx, [sys_proc+LHEAD.prev]
182
        mov     [eax+PROC.mem_used], ebx
-
 
183
 
-
 
184
        mov     ebx, [slot_base]
-
 
185
        mov     [ebx+APPDATA.process], eax
-
 
186
 
164
        __list_add eax, ebx, sys_proc
187
        lea     edx, [ebx+APPDATA.list]
165
        mov     ebx, [hdr_emem]
188
        lea     ecx, [eax+PROC.thr_list]
166
        mov     [eax+PROC.mem_used], ebx
189
        list_add_tail edx, ecx
-
 
190
 
167
        mov     ebx, [slot_base]
191
        mov     esi, sizeof.APP_HDR
-
 
-
 
168
        mov     [ebx+APPDATA.process], eax
-
 
169
        lea     edx, [ebx+APPDATA.list]
192
        add     esi, [cmdline_size]
170
        lea     ecx, [eax+PROC.thr_list]
193
 
171
        list_add_tail edx, ecx
194
        mov     edi, [filename]
172
        mov     edi, [path_string]
195
        mov     ecx, 1023
173
        mov     ecx, maxPathLength
196
        call    _strnlen
174
        call    _strnlen
197
        add     esi, eax
175
        mov     [filename_size], eax
198
        mov     [filename_size], eax
-
 
199
 
-
 
200
        stdcall kernel_alloc, esi
-
 
201
        mov     [ebx+APPDATA.exec_params], eax
-
 
202
        mov     edi, eax
176
        mov     eax, [cmdline_size]
203
        lea     esi, [hdr_cmdline]
177
        add     eax, sizeof.APP_HDR
204
        mov     ecx, sizeof.APP_HDR/4
178
        stdcall kernel_alloc, eax
205
        rep movsd
-
 
206
 
179
        mov     [ebx+APPDATA.exec_params], eax
207
        mov     esi, [filename]
180
        mov     edi, eax
208
        mov     ecx, [filename_size]
-
 
209
        rep movsb
181
        lea     esi, [hdr_cmdline]
210
        mov     ecx, [cmdline_size]
182
        mov     ecx, sizeof.APP_HDR/4
211
        mov     esi, [cmdline]
183
        rep movsd
Line 212... Line 184...
212
        rep movsb
184
        mov     ecx, [cmdline_size]
213
 
185
        mov     esi, [cmdline]
214
        lea     eax, [hdr_cmdline]
-
 
215
        stdcall set_app_params , [slot], eax, [flags]
186
        rep movsb
216
 
187
        lea     eax, [hdr_cmdline]
217
        mov     eax, [process_number]       ;set result
188
        stdcall set_app_params , [slot], eax, [flags]
-
 
189
        mov     eax, [process_number]   ;set result
218
        call    unlock_application_table
190
        call    unlock_application_table
219
        ret
191
        ret
220
 
192
 
Line 221... Line 193...
221
.err_0:
193
.err_0:
Line 846... Line 818...
846
        ret
818
        ret
847
endp
819
endp
Line 848... Line 820...
848
 
820
 
849
align 4
821
align 4
850
common_app_entry:
-
 
851
 
822
common_app_entry:
852
        mov     ebp, [current_slot]
823
        mov     ebp, [current_slot]
853
        mov     ebp, [ebp+APPDATA.exec_params]
824
        mov     ebp, [ebp+APPDATA.exec_params]
854
        test    ebp, ebp
825
        test    ebp, ebp
855
        jz      .exit
-
 
856
 
826
        jz      .exit
857
        stdcall map_process_image, [ebp+APP_HDR._emem],\
827
        stdcall map_process_image, [ebp+APP_HDR._emem],\
858
                [ebp+APP_HDR.img_base], [ebp+APP_HDR.img_size]
-
 
859
 
828
                [ebp+APP_HDR.img_base], [ebp+APP_HDR.img_size]
860
        xor     eax, eax
829
        mov     esi, [ebp+APP_HDR.path_string]
861
        mov     edi, [ebp+APP_HDR.path]
830
        mov     edi, [ebp+APP_HDR.path]
862
        lea     esi, [ebp+sizeof.APP_HDR]
-
 
863
        mov     ecx, [ebp+APP_HDR.filename_size]
831
        push    esi
864
        test    edi, edi
-
 
865
        jnz     .copy_filename
-
 
866
 
-
 
867
        add     esi, ecx
-
 
868
        jmp     .check_cmdline
-
 
869
 
-
 
870
.copy_full_path:
-
 
871
        mov     esi, [current_slot]
-
 
872
        mov     esi, [esi+APPDATA.cur_dir]
-
 
873
        mov     ebx, 1023
-
 
874
        mov     al, '/'
-
 
875
        stosb
-
 
876
 
-
 
877
.copy_path:
-
 
878
        dec     ebx
-
 
879
        jz      .finish_path
-
 
880
        lodsb
-
 
881
        stosb
-
 
882
        test    al, al
-
 
883
        jnz     .copy_path
-
 
884
        mov     byte [edi-1], '/'
-
 
885
 
-
 
886
        cmp     ecx, ebx
832
        test    edi, edi
887
        jbe     @F
-
 
888
        mov     ecx, ebx
-
 
889
@@:
833
        jz      @f
890
        lea     esi, [ebp+sizeof.APP_HDR]
-
 
891
        xor     eax, eax
-
 
892
        rep movsb
-
 
893
        stosb
-
 
894
        jmp     .check_cmdline
-
 
895
 
-
 
896
.finish_path:
-
 
897
        xor     eax, eax
-
 
898
        stosb
-
 
899
        jmp     .check_cmdline
-
 
900
 
-
 
901
.copy_filename:
-
 
902
        cmp     byte [esi], '/'
-
 
903
        jne     .copy_full_path
-
 
904
 
834
        mov     ecx, [ebp+APP_HDR.filename_size]
905
        rep movsb
835
        rep movsb
906
        stosb
836
        mov     byte [edi], 0
907
 
837
@@:
908
.check_cmdline:
838
        call    kernel_free
909
        mov     edi, [ebp+APP_HDR.cmdline]
-
 
910
        mov     ecx, [ebp+APP_HDR.cmdline_size]
839
        mov     edi, [ebp+APP_HDR.cmdline]
911
        test    edi, edi
840
        test    edi, edi
912
        jz      .check_tls_header
-
 
-
 
841
        jz      .check_tls_header
-
 
842
        lea     esi, [ebp+sizeof.APP_HDR]
913
 
843
        mov     ecx, [ebp+APP_HDR.cmdline_size]
914
        cmp     ecx, 256
844
        cmp     ecx, 256
915
        jb      .copy_cmdline
-
 
916
 
845
        jb      .copy_cmdline
917
        mov     edi, [ebp+APP_HDR._emem]
846
        mov     edi, [ebp+APP_HDR._emem]
918
        add     edi, 4095
847
        add     edi, 4095
919
        and     edi, -4096
848
        and     edi, -4096
920
        sub     edi, ecx
849
        sub     edi, ecx
921
        dec     edi
-
 
922
 
850
        dec     edi
923
        cmp     word [6], '00'
851
        cmp     word [6], '00'
924
        jne     @F
852
        jne     @f
925
        mov     [APP_HEADER_00_.i_param], edi
853
        mov     [APP_HEADER_00_.i_param], edi
926
        jmp     .copy_cmdline
854
        jmp     .copy_cmdline
927
@@:
855
@@:
928
        mov     [APP_HEADER_01_.i_param], edi
-
 
929
 
856
        mov     [APP_HEADER_01_.i_param], edi
930
.copy_cmdline:
857
.copy_cmdline:
931
        rep movsb
858
        rep movsb
932
        stosb
-
 
933
 
859
        mov     byte [edi], 0
934
.check_tls_header:
860
.check_tls_header:
935
        cmp     word [6], '02'
861
        cmp     word [6], '02'
936
        jne     .cleanup
-
 
937
 
862
        jne     .cleanup
938
        call    init_heap
863
        call    init_heap
939
        stdcall user_alloc, 4096
-
 
940
 
864
        stdcall user_alloc, 4096
941
        mov     edx, [current_slot]
865
        mov     edx, [current_slot]
942
        mov     [edx+APPDATA.tls_base], eax
866
        mov     [edx+APPDATA.tls_base], eax
943
        mov     [tls_data_l+2], ax
867
        mov     [tls_data_l+2], ax
944
        shr     eax, 16
868
        shr     eax, 16
945
        mov     [tls_data_l+4], al
869
        mov     [tls_data_l+4], al
946
        mov     [tls_data_l+7], ah
870
        mov     [tls_data_l+7], ah
947
        mov     dx, app_tls
871
        mov     dx, app_tls
948
        mov     fs, dx
-
 
949
 
872
        mov     fs, dx
950
.cleanup:
873
.cleanup:
951
        stdcall free_kernel_space, [ebp+APP_HDR.img_base]
874
        stdcall free_kernel_space, [ebp+APP_HDR.img_base]
952
        stdcall kernel_free, ebp
-
 
953
 
875
        stdcall kernel_free, ebp
954
        mov     ebx, [current_slot]
876
        mov     ebx, [current_slot]
955
        cmp     [ebx+APPDATA.debugger_slot], 0
877
        cmp     [ebx+APPDATA.debugger_slot], 0
956
        je      .exit
878
        je      .exit
957
        mov     eax, [TASK_BASE]
879
        mov     eax, [TASK_BASE]
Line 1016... Line 938...
1016
        mov     [SLOT_BASE+APPDATA.pl0_stack+ebx], eax
938
        mov     [SLOT_BASE+APPDATA.pl0_stack+ebx], eax
1017
        add     eax, RING0_STACK_SIZE
939
        add     eax, RING0_STACK_SIZE
1018
        mov     [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
940
        mov     [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
Line 1019... Line 941...
1019
 
941
 
1020
        push    ebx
942
        push    ebx
1021
        stdcall kernel_alloc, 0x1000
943
        stdcall kernel_alloc, maxPathLength
1022
        pop     ebx
944
        pop     ebx
1023
        mov     esi, [current_slot]
945
        mov     esi, [current_slot]
1024
        mov     esi, [esi+APPDATA.cur_dir]
946
        mov     esi, [esi+APPDATA.cur_dir]
1025
        mov     ecx, 0x1000/4
947
        mov     ecx, maxPathLength/4
1026
        mov     edi, eax
948
        mov     edi, eax
1027
        mov     [ebx+SLOT_BASE+APPDATA.cur_dir], eax
949
        mov     [ebx+SLOT_BASE+APPDATA.cur_dir], eax
Line 1028... Line 950...
1028
        rep movsd
950
        rep movsd