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 |