Rev 2166 | Rev 2465 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
||
4 | ;; Distributed under terms of the GNU General Public License ;; |
||
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
593 | mikedld | 8 | $Revision: 2434 $ |
9 | |||
10 | |||
357 | serge | 11 | GREEDY_KERNEL equ 0 |
164 | serge | 12 | |
2434 | Serge | 13 | struct APP_HEADER_00_ |
14 | banner dq ? |
||
15 | version dd ? ;+8 |
||
16 | start dd ? ;+12 |
||
17 | i_end dd ? ;+16 |
||
18 | mem_size dd ? ;+20 |
||
19 | i_param dd ? ;+24 |
||
20 | ends |
||
164 | serge | 21 | |
2434 | Serge | 22 | struct APP_HEADER_01_ |
23 | banner dq ? |
||
24 | version dd ? ;+8 |
||
25 | start dd ? ;+12 |
||
26 | i_end dd ? ;+16 |
||
27 | mem_size dd ? ;+20 |
||
28 | stack_top dd ? ;+24 |
||
29 | i_param dd ? ;+28 |
||
30 | i_icon dd ? ;+32 |
||
31 | ends |
||
164 | serge | 32 | |
237 | serge | 33 | |
2434 | Serge | 34 | struct APP_PARAMS |
35 | app_cmdline dd ? ;0x00 |
||
36 | app_path dd ? ;0x04 |
||
37 | app_eip dd ? ;0x08 |
||
38 | app_esp dd ? ;0x0C |
||
39 | app_mem dd ? ;0x10 |
||
40 | ends |
||
237 | serge | 41 | |
42 | macro _clear_ op |
||
43 | { mov ecx, op/4 |
||
2434 | Serge | 44 | xor eax, eax |
45 | cld |
||
46 | rep stosd |
||
237 | serge | 47 | } |
48 | |||
521 | diamond | 49 | fs_execute_from_sysdir: |
2434 | Serge | 50 | xor ebx, ebx |
2010 | serge | 51 | fs_execute_from_sysdir_param: |
2434 | Serge | 52 | xor edx, edx |
53 | mov esi, sysdir_path |
||
363 | serge | 54 | |
164 | serge | 55 | align 4 |
363 | serge | 56 | proc fs_execute |
57 | |||
58 | ;fn_read:dword, file_size:dword, cluster:dword |
||
59 | |||
60 | ; ebx - cmdline |
||
61 | ; edx - flags |
||
62 | ; ebp - full filename |
||
63 | ; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it |
||
64 | |||
1074 | Galkov | 65 | locals |
66 | cmdline rd 64 ;256/4 |
||
67 | filename rd 256 ;1024/4 |
||
68 | flags dd ? |
||
363 | serge | 69 | |
1074 | Galkov | 70 | save_cr3 dd ? |
71 | slot dd ? |
||
72 | slot_base dd ? |
||
73 | file_base dd ? |
||
74 | file_size dd ? |
||
75 | ;app header data |
||
76 | hdr_cmdline dd ? ;0x00 |
||
77 | hdr_path dd ? ;0x04 |
||
78 | hdr_eip dd ? ;0x08 |
||
79 | hdr_esp dd ? ;0x0C |
||
80 | hdr_mem dd ? ;0x10 |
||
81 | hdr_i_end dd ? ;0x14 |
||
82 | endl |
||
164 | serge | 83 | |
2434 | Serge | 84 | pushad |
363 | serge | 85 | |
2434 | Serge | 86 | mov [flags], edx |
363 | serge | 87 | |
88 | ; [ebp] pointer to filename |
||
89 | |||
2434 | Serge | 90 | lea edi, [filename] |
91 | lea ecx, [edi+1024] |
||
92 | mov al, '/' |
||
93 | stosb |
||
521 | diamond | 94 | @@: |
2434 | Serge | 95 | cmp edi, ecx |
96 | jae .bigfilename |
||
97 | lodsb |
||
98 | stosb |
||
99 | test al, al |
||
100 | jnz @b |
||
101 | mov esi, [ebp] |
||
102 | test esi, esi |
||
103 | jz .namecopied |
||
104 | mov byte [edi-1], '/' |
||
521 | diamond | 105 | @@: |
2434 | Serge | 106 | cmp edi, ecx |
107 | jae .bigfilename |
||
108 | lodsb |
||
109 | stosb |
||
110 | test al, al |
||
111 | jnz @b |
||
112 | jmp .namecopied |
||
521 | diamond | 113 | .bigfilename: |
2434 | Serge | 114 | popad |
115 | mov eax, -ERROR_FILE_NOT_FOUND |
||
116 | ret |
||
1220 | serge | 117 | |
521 | diamond | 118 | .namecopied: |
363 | serge | 119 | |
2434 | Serge | 120 | mov [cmdline], ebx |
121 | test ebx, ebx |
||
122 | jz @F |
||
519 | serge | 123 | |
2434 | Serge | 124 | lea eax, [cmdline] |
125 | mov dword [eax+252], 0 |
||
126 | stdcall strncpy, eax, ebx, 255 |
||
519 | serge | 127 | @@: |
2434 | Serge | 128 | lea eax, [filename] |
129 | stdcall load_file, eax |
||
130 | mov esi, -ERROR_FILE_NOT_FOUND |
||
131 | test eax, eax |
||
132 | jz .err_file |
||
237 | serge | 133 | |
2434 | Serge | 134 | mov [file_base], eax |
135 | mov [file_size], ebx |
||
237 | serge | 136 | |
2434 | Serge | 137 | lea ebx, [hdr_cmdline] |
138 | call test_app_header |
||
139 | mov esi, -0x1F |
||
140 | test eax, eax |
||
141 | jz .err_hdr |
||
237 | serge | 142 | |
143 | .wait_lock: |
||
2434 | Serge | 144 | cmp [application_table_status], 0 |
145 | je .get_lock |
||
146 | call change_task |
||
147 | jmp .wait_lock |
||
237 | serge | 148 | |
149 | .get_lock: |
||
2434 | Serge | 150 | mov eax, 1 |
151 | xchg eax, [application_table_status] |
||
152 | test eax, eax |
||
153 | jnz .wait_lock |
||
237 | serge | 154 | |
2434 | Serge | 155 | call set_application_table_status |
237 | serge | 156 | |
2434 | Serge | 157 | call get_new_process_place |
158 | test eax, eax |
||
159 | mov esi, -0x20 ; too many processes |
||
160 | jz .err |
||
237 | serge | 161 | |
2434 | Serge | 162 | mov [slot], eax |
163 | shl eax, 8 |
||
164 | add eax, SLOT_BASE |
||
165 | mov [slot_base], eax |
||
166 | mov edi, eax |
||
1074 | Galkov | 167 | _clear_ 256 ;clean extended information about process |
237 | serge | 168 | |
169 | ; write application name |
||
2434 | Serge | 170 | lea eax, [filename] |
171 | stdcall strrchr, eax, '/' ; now eax points to name without path |
||
237 | serge | 172 | |
2434 | Serge | 173 | lea esi, [eax+1] |
174 | test eax, eax |
||
175 | jnz @F |
||
176 | lea esi, [filename] |
||
237 | serge | 177 | @@: |
2434 | Serge | 178 | mov ecx, 8; 8 chars for name |
179 | mov edi, [slot_base] |
||
237 | serge | 180 | .copy_process_name_loop: |
2434 | Serge | 181 | lodsb |
182 | cmp al, '.' |
||
183 | jz .copy_process_name_done |
||
184 | test al, al |
||
185 | jz .copy_process_name_done |
||
186 | stosb |
||
187 | loop .copy_process_name_loop |
||
237 | serge | 188 | .copy_process_name_done: |
189 | |||
2434 | Serge | 190 | mov ebx, cr3 |
191 | mov [save_cr3], ebx |
||
269 | serge | 192 | |
2434 | Serge | 193 | stdcall create_app_space, [hdr_mem], [file_base], [file_size] |
194 | mov esi, -30; no memory |
||
195 | test eax, eax |
||
196 | jz .failed |
||
237 | serge | 197 | |
2434 | Serge | 198 | mov ebx, [slot_base] |
199 | mov [ebx+APPDATA.dir_table], eax |
||
200 | mov eax, [hdr_mem] |
||
201 | mov [ebx+APPDATA.mem_size], eax |
||
237 | serge | 202 | |
2434 | Serge | 203 | xor edx, edx |
204 | cmp word [6], '02' |
||
205 | jne @f |
||
1220 |