Subversion Repositories Kolibri OS

Rev

Rev 4423 | Rev 5565 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4423 Rev 5201
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 4423 $
8
$Revision: 5201 $
9
 
9
 
10
 
10
 
11
GREEDY_KERNEL  equ 0
11
GREEDY_KERNEL  equ 0
12
 
12
 
13
struct  APP_HEADER_00_
13
struct  APP_HEADER_00_
14
        banner          dq ?
14
        banner          dq ?
15
        version         dd ?    ;+8
15
        version         dd ?    ;+8
16
        start           dd ?    ;+12
16
        start           dd ?    ;+12
17
        i_end           dd ?    ;+16
17
        i_end           dd ?    ;+16
18
        mem_size        dd ?    ;+20
18
        mem_size        dd ?    ;+20
19
        i_param         dd ?    ;+24
19
        i_param         dd ?    ;+24
20
ends
20
ends
21
 
21
 
22
struct  APP_HEADER_01_
22
struct  APP_HEADER_01_
23
        banner          dq ?
23
        banner          dq ?
24
        version         dd ?    ;+8
24
        version         dd ?    ;+8
25
        start           dd ?    ;+12
25
        start           dd ?    ;+12
26
        i_end           dd ?    ;+16
26
        i_end           dd ?    ;+16
27
        mem_size        dd ?    ;+20
27
        mem_size        dd ?    ;+20
28
        stack_top       dd ?    ;+24
28
        stack_top       dd ?    ;+24
29
        i_param         dd ?    ;+28
29
        i_param         dd ?    ;+28
30
        i_icon          dd ?    ;+32
30
        i_icon          dd ?    ;+32
31
ends
31
ends
32
 
32
 
33
 
33
 
34
struct  APP_PARAMS
34
struct  APP_PARAMS
35
        app_cmdline     dd ?    ;0x00
35
        app_cmdline     dd ?    ;0x00
36
        app_path        dd ?    ;0x04
36
        app_path        dd ?    ;0x04
37
        app_eip         dd ?    ;0x08
37
        app_eip         dd ?    ;0x08
38
        app_esp         dd ?    ;0x0C
38
        app_esp         dd ?    ;0x0C
39
        app_mem         dd ?    ;0x10
39
        app_mem         dd ?    ;0x10
40
ends
40
ends
41
 
41
 
42
macro _clear_ op
42
macro _clear_ op
43
{  mov ecx, op/4
43
{  mov ecx, op/4
44
        xor     eax, eax
44
        xor     eax, eax
45
        cld
45
        cld
46
        rep stosd
46
        rep stosd
47
}
47
}
48
 
48
 
49
fs_execute_from_sysdir:
49
fs_execute_from_sysdir:
50
        xor     ebx, ebx
50
        xor     ebx, ebx
51
fs_execute_from_sysdir_param:
51
fs_execute_from_sysdir_param:
52
        xor     edx, edx
52
        xor     edx, edx
53
        mov     esi, sysdir_path
53
        mov     esi, sysdir_path
54
 
54
 
55
align 4
55
align 4
56
proc fs_execute
56
proc fs_execute
57
 
57
 
58
;fn_read:dword, file_size:dword, cluster:dword
58
;fn_read:dword, file_size:dword, cluster:dword
59
 
59
 
60
; ebx - cmdline
60
; ebx - cmdline
61
; edx - flags
61
; edx - flags
62
; ebp - full filename
62
; ebp - full filename
63
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it
63
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it
64
 
64
 
65
       locals
65
       locals
66
         cmdline_size  dd ? ; +0 ; cmdline -12
66
         cmdline_size  dd ? ; +0 ; cmdline -12
67
         cmdline_adr   dd ? ; +4 ; cmdline -8
67
         cmdline_adr   dd ? ; +4 ; cmdline -8
68
         cmdline_flag  dd ? ; +8 ; cmdline -4
68
         cmdline_flag  dd ? ; +8 ; cmdline -4
69
         cmdline       rd 64    ;256/4
69
         cmdline       rd 64    ;256/4
70
         filename      rd 256   ;1024/4
70
         filename      rd 256   ;1024/4
71
         flags         dd ?
71
         flags         dd ?
72
 
72
 
73
         save_cr3      dd ?
73
         save_proc     dd ?
74
         slot          dd ?
74
         slot          dd ?
75
         slot_base     dd ?
75
         slot_base     dd ?
76
         file_base     dd ?
76
         file_base     dd ?
77
         file_size     dd ?
77
         file_size     dd ?
78
         handle        dd ? ;temp. for default cursor handle for curr. thread
78
         handle        dd ? ;temp. for default cursor handle for curr. thread
79
                      ;app header data
79
                      ;app header data
80
         hdr_cmdline   dd ? ;0x00
80
         hdr_cmdline   dd ? ;0x00
81
         hdr_path      dd ? ;0x04
81
         hdr_path      dd ? ;0x04
82
         hdr_eip       dd ? ;0x08
82
         hdr_eip       dd ? ;0x08
83
         hdr_esp       dd ? ;0x0C
83
         hdr_esp       dd ? ;0x0C
84
         hdr_mem       dd ? ;0x10
84
         hdr_mem       dd ? ;0x10
85
         hdr_i_end     dd ? ;0x14
85
         hdr_i_end     dd ? ;0x14
86
       endl
86
       endl
87
 
87
 
88
        pushad
88
        pushad
89
 
89
 
90
        cmp     [SCR_MODE], word 0x13
90
        cmp     [SCR_MODE], word 0x13
91
        jbe     @f
91
        jbe     @f
92
        pushad
92
        pushad
93
        stdcall set_cursor, [def_cursor_clock]
93
        stdcall set_cursor, [def_cursor_clock]
94
        mov     [handle], eax
94
        mov     [handle], eax
95
        mov     [redrawmouse_unconditional], 1
95
        mov     [redrawmouse_unconditional], 1
96
        call    wakeup_osloop
96
        call    wakeup_osloop
97
        popad
97
        popad
98
@@:
98
@@:
99
        mov     [flags], edx
99
        mov     [flags], edx
100
 
100
 
101
; [ebp]  pointer to filename
101
; [ebp]  pointer to filename
102
 
102
 
103
        lea     edi, [filename]
103
        lea     edi, [filename]
104
        lea     ecx, [edi+1024]
104
        lea     ecx, [edi+1024]
105
        mov     al, '/'
105
        mov     al, '/'
106
        stosb
106
        stosb
107
@@:
107
@@:
108
        cmp     edi, ecx
108
        cmp     edi, ecx
109
        jae     .bigfilename
109
        jae     .bigfilename
110
        lodsb
110
        lodsb
111
        stosb
111
        stosb
112
        test    al, al
112
        test    al, al
113
        jnz     @b
113
        jnz     @b
114
        mov     esi, [ebp]
114
        mov     esi, [ebp]
115
        test    esi, esi
115
        test    esi, esi
116
        jz      .namecopied
116
        jz      .namecopied
117
        mov     byte [edi-1], '/'
117
        mov     byte [edi-1], '/'
118
@@:
118
@@:
119
        cmp     edi, ecx
119
        cmp     edi, ecx
120
        jae     .bigfilename
120
        jae     .bigfilename
121
        lodsb
121
        lodsb
122
        stosb
122
        stosb
123
        test    al, al
123
        test    al, al
124
        jnz     @b
124
        jnz     @b
125
        jmp     .namecopied
125
        jmp     .namecopied
126
.bigfilename:
126
.bigfilename:
127
        popad
127
        popad
128
        mov     eax, -ERROR_FILE_NOT_FOUND
128
        mov     eax, -ERROR_FILE_NOT_FOUND
129
 
129
 
130
        jmp     .final
130
        jmp     .final
131
 
131
 
132
.namecopied:
132
.namecopied:
133
        xor     eax, eax
133
        xor     eax, eax
134
        mov     [cmdline_flag], eax
134
        mov     [cmdline_flag], eax
135
        mov     [cmdline_adr], eax
135
        mov     [cmdline_adr], eax
136
        mov     [cmdline_size], eax
136
        mov     [cmdline_size], eax
137
 
137
 
138
        mov     [cmdline], ebx
138
        mov     [cmdline], ebx
139
        test    ebx, ebx
139
        test    ebx, ebx
140
        jz      .no_copy
140
        jz      .no_copy
141
;--------------------------------------
141
;--------------------------------------
142
        pushad
142
        pushad
143
        pushfd
143
        pushfd
144
        mov     esi, ebx
144
        mov     esi, ebx
145
        mov     ecx, 65536 ; 64 Kb max for ext.cmdline
145
        mov     ecx, 65536 ; 64 Kb max for ext.cmdline
146
        cld
146
        cld
147
@@:
147
@@:
148
        dec     ecx
148
        dec     ecx
149
        jz      .end_string
149
        jz      .end_string
150
 
150
 
151
        lodsb
151
        lodsb
152
        test    al, al
152
        test    al, al
153
        jnz     @b
153
        jnz     @b
154
 
154
 
155
.end_string:
155
.end_string:
156
        mov     eax, 65536 ; 64 Kb max for ext.cmdline
156
        mov     eax, 65536 ; 64 Kb max for ext.cmdline
157
        sub     eax, ecx
157
        sub     eax, ecx
158
        mov     [cmdline_size], eax
158
        mov     [cmdline_size], eax
159
        cmp     eax, 255
159
        cmp     eax, 255
160
        ja      @f
160
        ja      @f
161
 
161
 
162
        popfd
162
        popfd
163
        popad
163
        popad
164
        jmp     .old_copy
164
        jmp     .old_copy
165
 
165
 
166
@@:
166
@@:
167
        xor     eax, eax
167
        xor     eax, eax
168
        dec     eax
168
        dec     eax
169
        mov     [cmdline_flag], eax
169
        mov     [cmdline_flag], eax
170
        popfd
170
        popfd
171
        popad
171
        popad
172
; get memory for the extended command line
172
; get memory for the extended command line
173
        stdcall kernel_alloc, [cmdline_size] ;eax
173
        stdcall kernel_alloc, [cmdline_size] ;eax
174
        test    eax, eax
174
        test    eax, eax
175
        jz      .old_copy ; get memory failed
175
        jz      .old_copy ; get memory failed
176
 
176
 
177
        mov     [cmdline_adr], eax
177
        mov     [cmdline_adr], eax
178
 
178
 
179
        pushad
179
        pushad
180
        pushfd
180
        pushfd
181
        mov     esi, ebx
181
        mov     esi, ebx
182
        mov     edi, eax
182
        mov     edi, eax
183
        mov     ecx, [cmdline_size]
183
        mov     ecx, [cmdline_size]
184
        cld
184
        cld
185
        rep movsb
185
        rep movsb
186
        popfd
186
        popfd
187
        popad
187
        popad
188
        jmp     .no_copy
188
        jmp     .no_copy
189
 
189
 
190
.old_copy:
190
.old_copy:
191
; clear flag because old method with 256 bytes
191
; clear flag because old method with 256 bytes
192
        xor     eax, eax
192
        xor     eax, eax
193
        mov     [cmdline_flag], eax
193
        mov     [cmdline_flag], eax
194
;--------------------------------------
194
;--------------------------------------
195
        lea     eax, [cmdline]
195
        lea     eax, [cmdline]
196
        mov     dword [eax+252], 0
196
        mov     dword [eax+252], 0
197
.copy:
197
.copy:
198
        stdcall strncpy, eax, ebx, 255
198
        stdcall strncpy, eax, ebx, 255
199
.no_copy:
199
.no_copy:
200
        lea     eax, [filename]
200
        lea     eax, [filename]
201
        stdcall load_file, eax
201
        stdcall load_file, eax
202
 
202
 
203
        mov     esi, -ERROR_FILE_NOT_FOUND
203
        mov     esi, -ERROR_FILE_NOT_FOUND
204
        test    eax, eax
204
        test    eax, eax
205
        jz      .err_file
205
        jz      .err_file
206
 
206
 
207
        mov     [file_base], eax
207
        mov     [file_base], eax
208
        mov     [file_size], ebx
208
        mov     [file_size], ebx
209
 
209
 
210
        lea     ebx, [hdr_cmdline]
210
        lea     ebx, [hdr_cmdline]
211
        call    test_app_header
211
        call    test_app_header
212
        mov     esi, -0x1F
212
        mov     esi, -0x1F
213
        test    eax, eax
213
        test    eax, eax
214
        jz      .err_hdr
214
        jz      .err_hdr
215
 
215
 
216
        call    lock_application_table
216
        call    lock_application_table
217
 
217
 
218
        call    get_new_process_place
218
        call    alloc_thread_slot
219
        test    eax, eax
219
        test    eax, eax
220
        mov     esi, -0x20 ; too many processes
220
        mov     esi, -0x20 ; too many processes
221
        jz      .err
221
        jz      .err
222
 
222
 
223
        mov     [slot], eax
223
        mov     [slot], eax
224
        shl     eax, 8
224
        shl     eax, 8
225
        add     eax, SLOT_BASE
225
        add     eax, SLOT_BASE
226
        mov     [slot_base], eax
226
        mov     [slot_base], eax
227
        mov     edi, eax
227
        mov     edi, eax
228
       _clear_ 256     ;clean extended information about process
228
       _clear_ 256     ;clean extended information about process
229
 
229
 
230
; write application name
230
; write application name
231
        lea     eax, [filename]
231
        lea     eax, [filename]
232
        stdcall strrchr, eax, '/'  ; now eax points to name without path
232
        stdcall strrchr, eax, '/'  ; now eax points to name without path
233
 
233
 
234
        lea     esi, [eax+1]
234
        lea     esi, [eax+1]
235
        test    eax, eax
235
        test    eax, eax
236
        jnz     @F
236
        jnz     @F
237
        lea     esi, [filename]
237
        lea     esi, [filename]
238
@@:
238
@@:
239
        mov     ecx, 11 ; 11 chars for name! 8 - is old value!
239
        mov     ecx, 11 ; 11 chars for name! 8 - is old value!
240
        mov     edi, [slot_base]
240
        mov     edi, [slot_base]
241
.copy_process_name_loop:
241
.copy_process_name_loop:
242
        lodsb
242
        lodsb
243
        cmp     al, '.'
243
        cmp     al, '.'
244
        jz      .copy_process_name_done
244
        jz      .copy_process_name_done
245
        test    al, al
245
        test    al, al
246
        jz      .copy_process_name_done
246
        jz      .copy_process_name_done
247
        stosb
247
        stosb
248
        loop    .copy_process_name_loop
248
        loop    .copy_process_name_loop
249
.copy_process_name_done:
249
.copy_process_name_done:
250
 
250
 
251
        mov     ebx, cr3
251
        mov     ebx, [current_process]
252
        mov     [save_cr3], ebx
252
        mov     [save_proc], ebx
253
 
253
 
254
        stdcall create_app_space, [hdr_mem], [file_base], [file_size]
254
        stdcall create_process, [hdr_mem], [file_base], [file_size]
255
        mov     esi, -30; no memory
255
        mov     esi, -30; no memory
256
        test    eax, eax
256
        test    eax, eax
257
        jz      .failed
257
        jz      .failed
-
 
258
 
-
 
259
        mov     ebx, [hdr_mem]
-
 
260
        mov     [eax+PROC.mem_used], ebx
258
 
261
 
259
        mov     ebx, [slot_base]
262
        mov     ebx, [slot_base]
-
 
263
        mov     [ebx+APPDATA.process], eax
260
        mov     [ebx+APPDATA.dir_table], eax
264
 
261
        mov     eax, [hdr_mem]
265
        lea     edx, [ebx+APPDATA.list]
-
 
266
        lea     ecx, [eax+PROC.thr_list]
262
        mov     [ebx+APPDATA.mem_size], eax
267
        list_add_tail edx, ecx
263
 
268
 
264
        xor     edx, edx
269
        xor     edx, edx
265
        cmp     word [6], '02'
270
        cmp     word [6], '02'
266
        jne     @f
271
        jne     @f
267
 
272
 
268
        not     edx
273
        not     edx
269
@@:
274
@@:
270
        mov     [ebx+APPDATA.tls_base], edx
275
        mov     [ebx+APPDATA.tls_base], edx
271
 
276
 
272
if GREEDY_KERNEL
277
if GREEDY_KERNEL
273
else
278
else
274
        mov     ecx, [hdr_mem]
279
        mov     ecx, [hdr_mem]
275
        mov     edi, [file_size]
280
        mov     edi, [file_size]
276
        add     edi, 4095
281
        add     edi, 4095
277
        and     edi, not 4095
282
        and     edi, not 4095
278
        sub     ecx, edi
283
        sub     ecx, edi
279
        jna     @F
284
        jna     @F
280
 
285
 
281
        xor     eax, eax
286
        xor     eax, eax
282
        cld
287
        cld
283
        rep stosb
288
        rep stosb
284
@@:
289
@@:
285
end if
290
end if
286
 
291
 
287
; release only virtual space, not phisical memory
292
; release only virtual space, not phisical memory
288
 
293
 
289
        stdcall free_kernel_space, [file_base]
294
        stdcall free_kernel_space, [file_base]
290
        lea     eax, [hdr_cmdline]
295
        lea     eax, [hdr_cmdline]
291
        lea     ebx, [cmdline]
296
        lea     ebx, [cmdline]
292
        lea     ecx, [filename]
297
        lea     ecx, [filename]
293
        stdcall set_app_params , [slot], eax, ebx, ecx, [flags]
298
        stdcall set_app_params , [slot], eax, ebx, ecx, [flags]
294
 
299
 
295
        mov     eax, [save_cr3]
300
        mov     eax, [save_proc]
296
        call    set_cr3
301
        call    set_cr3
297
 
302
 
298
        mov     eax, [process_number];set result
303
        mov     eax, [process_number];set result
299
        call    unlock_application_table
304
        call    unlock_application_table
300
 
305
 
301
        jmp     .final
306
        jmp     .final
302
 
307
 
303
.failed:
308
.failed:
304
        mov     eax, [save_cr3]
309
        mov     eax, [save_proc]
305
        call    set_cr3
310
        call    set_cr3
306
.err:
311
.err:
307
.err_hdr:
312
.err_hdr:
308
        stdcall kernel_free, [file_base]
313
        stdcall kernel_free, [file_base]
309
.err_file:
314
.err_file:
310
        call    unlock_application_table
315
        call    unlock_application_table
311
        mov     eax, esi
316
        mov     eax, esi
312
.final:
317
.final:
313
        cmp     [SCR_MODE], word 0x13
318
        cmp     [SCR_MODE], word 0x13
314
        jbe     @f
319
        jbe     @f
315
        pushad
320
        pushad
316
        stdcall set_cursor, [handle]
321
        stdcall set_cursor, [handle]
317
        mov     [redrawmouse_unconditional], 1
322
        mov     [redrawmouse_unconditional], 1
318
        call    wakeup_osloop
323
        call    wakeup_osloop
319
        popad
324
        popad
320
@@:
325
@@:
321
        ret
326
        ret
322
endp
327
endp
323
 
328
 
324
align 4
329
align 4
325
test_app_header:
330
test_app_header:
326
       virtual at eax
331
       virtual at eax
327
         APP_HEADER_00 APP_HEADER_00_
332
         APP_HEADER_00 APP_HEADER_00_
328
       end virtual
333
       end virtual
329
       virtual at eax
334
       virtual at eax
330
         APP_HEADER_01 APP_HEADER_01_
335
         APP_HEADER_01 APP_HEADER_01_
331
       end virtual
336
       end virtual
332
 
337
 
333
        cmp     dword [eax], 'MENU'
338
        cmp     dword [eax], 'MENU'
334
        jne     .fail
339
        jne     .fail
335
        cmp     word [eax+4], 'ET'
340
        cmp     word [eax+4], 'ET'
336
        jne     .fail
341
        jne     .fail
337
 
342
 
338
        cmp     [eax+6], word '00'
343
        cmp     [eax+6], word '00'
339
        jne     .check_01_header
344
        jne     .check_01_header
340
 
345
 
341
        mov     ecx, [APP_HEADER_00.start]
346
        mov     ecx, [APP_HEADER_00.start]
342
        mov     [ebx+0x08], ecx             ;app_eip
347
        mov     [ebx+0x08], ecx             ;app_eip
343
        mov     edx, [APP_HEADER_00.mem_size]
348
        mov     edx, [APP_HEADER_00.mem_size]
344
        mov     [ebx+0x10], edx             ;app_mem
349
        mov     [ebx+0x10], edx             ;app_mem
345
        shr     edx, 1
350
        shr     edx, 1
346
        sub     edx, 0x10
351
        sub     edx, 0x10
347
        mov     [ebx+0x0C], edx             ;app_esp
352
        mov     [ebx+0x0C], edx             ;app_esp
348
        mov     ecx, [APP_HEADER_00.i_param]
353
        mov     ecx, [APP_HEADER_00.i_param]
349
        mov     [ebx], ecx                  ;app_cmdline
354
        mov     [ebx], ecx                  ;app_cmdline
350
        mov     [ebx+4], dword 0            ;app_path
355
        mov     [ebx+4], dword 0            ;app_path
351
        mov     edx, [APP_HEADER_00.i_end]
356
        mov     edx, [APP_HEADER_00.i_end]
352
        mov     [ebx+0x14], edx
357
        mov     [ebx+0x14], edx
353
        ret
358
        ret
354
 
359
 
355
 .check_01_header:
360
 .check_01_header:
356
 
361
 
357
        cmp     [eax+6], word '01'
362
        cmp     [eax+6], word '01'
358
        je      @f
363
        je      @f
359
        cmp     [eax+6], word '02'
364
        cmp     [eax+6], word '02'
360
        jne     .fail
365
        jne     .fail
361
@@:
366
@@:
362
        mov     ecx, [APP_HEADER_01.start]
367
        mov     ecx, [APP_HEADER_01.start]
363
        mov     [ebx+0x08], ecx             ;app_eip
368
        mov     [ebx+0x08], ecx             ;app_eip
364
        mov     edx, [APP_HEADER_01.mem_size]
369
        mov     edx, [APP_HEADER_01.mem_size]
365
 
370
 
366
; \begin{diamond}[20.08.2006]
371
; \begin{diamond}[20.08.2006]
367
; sanity check (functions 19,58 load app_i_end bytes and that must
372
; sanity check (functions 19,58 load app_i_end bytes and that must
368
; fit in allocated memory to prevent kernel faults)
373
; fit in allocated memory to prevent kernel faults)
369
        cmp     edx, [APP_HEADER_01.i_end]
374
        cmp     edx, [APP_HEADER_01.i_end]
370
        jb      .fail
375
        jb      .fail
371
; \end{diamond}[20.08.2006]
376
; \end{diamond}[20.08.2006]
372
 
377
 
373
        mov     [ebx+0x10], edx             ;app_mem
378
        mov     [ebx+0x10], edx             ;app_mem
374
        mov     ecx, [APP_HEADER_01.stack_top]
379
        mov     ecx, [APP_HEADER_01.stack_top]
375
        mov     [ebx+0x0C], ecx             ;app_esp
380
        mov     [ebx+0x0C], ecx             ;app_esp
376
        mov     edx, [APP_HEADER_01.i_param]
381
        mov     edx, [APP_HEADER_01.i_param]
377
        mov     [ebx], edx                  ;app_cmdline
382
        mov     [ebx], edx                  ;app_cmdline
378
        mov     ecx, [APP_HEADER_01.i_icon]
383
        mov     ecx, [APP_HEADER_01.i_icon]
379
        mov     [ebx+4], ecx                ;app_path
384
        mov     [ebx+4], ecx                ;app_path
380
        mov     edx, [APP_HEADER_01.i_end]
385
        mov     edx, [APP_HEADER_01.i_end]
381
        mov     [ebx+0x14], edx
386
        mov     [ebx+0x14], edx
382
        ret
387
        ret
383
.fail:
388
.fail:
384
        xor     eax, eax
389
        xor     eax, eax
385
        ret
390
        ret
386
 
391
 
387
align 4
392
align 4
388
proc get_new_process_place
393
alloc_thread_slot:
389
;input:
394
;input:
390
;  none
395
;  none
391
;result:
396
;result:
392
;  eax=[new_process_place]<>0 - ok
397
;  eax=[new_thread_slot]<>0 - ok
393
;      0 - failed.
398
;      0 - failed.
394
;This function find least empty slot.
399
;This function find least empty slot.
395
;It doesn't increase [TASK_COUNT]!
400
;It doesn't increase [TASK_COUNT]!
396
        mov     eax, CURRENT_TASK
-
 
-
 
401
 
-
 
402
 
397
        mov     ebx, [TASK_COUNT]
403
        mov     edx, thr_slot_map
398
        inc     ebx
404
        pushfd
399
        shl     ebx, 5
405
        cli
400
        add     ebx, eax    ;ebx - address of process information for (last+1) slot
-
 
401
.newprocessplace:
406
.l1:
402
;eax = address of process information for current slot
-
 
403
        cmp     eax, ebx
407
        bsf     eax, [edx]
404
        jz      .endnewprocessplace ;empty slot after high boundary
-
 
405
        add     eax, 0x20
408
        jnz     .found
406
        cmp     word [eax+0xa], 9;check process state, 9 means that process slot is empty
-
 
407
        jnz     .newprocessplace
-
 
408
.endnewprocessplace:
-
 
409
        mov     ebx, eax
409
        add     edx, 4
410
        sub     eax, CURRENT_TASK
410
        cmp     edx, thr_slot_map+32
411
        shr     eax, 5      ;calculate slot index
-
 
412
        cmp     eax, 256
411
        jb      .l1
413
        jge     .failed     ;it should be <256
-
 
414
        mov     word [ebx+0xa], 9;set process state to 9 (for slot after hight boundary)
-
 
-
 
412
 
415
        ret
413
        popfd
416
.failed:
-
 
417
        xor     eax, eax
414
        xor     eax, eax
418
        ret
415
        ret
419
endp
416
.found:
-
 
417
        btr     [edx], eax
-
 
418
        sub     edx, thr_slot_map
-
 
419
        lea     eax, [eax+edx*8]
-
 
420
        popfd
-
 
421
        ret
-
 
422
 
420
 
423
 
421
align 4
424
align 4
422
proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
425
proc create_process stdcall, app_size:dword,img_base:dword,img_size:dword
423
       locals
426
       locals
424
         app_pages   dd ?
427
         app_pages   dd ?
425
         img_pages   dd ?
428
         img_pages   dd ?
426
         dir_addr    dd ?
429
         process     dd ?
427
         app_tabs    dd ?
430
         app_tabs    dd ?
428
       endl
431
       endl
-
 
432
 
-
 
433
        push    ebx
-
 
434
        push    esi
-
 
435
        push    edi
429
 
436
 
430
        mov     ecx, pg_data.mutex
437
        mov     ecx, pg_data.mutex
431
        call    mutex_lock
438
        call    mutex_lock
432
 
439
 
433
        xor     eax, eax
440
        xor     eax, eax
434
        mov     [dir_addr], eax
441
        mov     [process], eax
435
 
442
 
436
        mov     eax, [app_size]
443
        mov     eax, [app_size]
437
        add     eax, 4095
444
        add     eax, 4095
438
        and     eax, NOT(4095)
445
        and     eax, NOT(4095)
439
        mov     [app_size], eax
446
        mov     [app_size], eax
440
        mov     ebx, eax
447
        mov     ebx, eax
441
        shr     eax, 12
448
        shr     eax, 12
442
        mov     [app_pages], eax
449
        mov     [app_pages], eax
443
 
450
 
444
        add     ebx, 0x3FFFFF
451
        add     ebx, 0x3FFFFF
445
        and     ebx, NOT(0x3FFFFF)
452
        and     ebx, NOT(0x3FFFFF)
446
        shr     ebx, 22
453
        shr     ebx, 22
447
        mov     [app_tabs], ebx
454
        mov     [app_tabs], ebx
448
 
455
 
449
        mov     ecx, [img_size]
456
        mov     ecx, [img_size]
450
        add     ecx, 4095
457
        add     ecx, 4095
451
        and     ecx, NOT(4095)
458
        and     ecx, NOT(4095)
452
 
459
 
453
        mov     [img_size], ecx
460
        mov     [img_size], ecx
454
        shr     ecx, 12
461
        shr     ecx, 12
455
        mov     [img_pages], ecx
462
        mov     [img_pages], ecx
456
 
-
 
457
if GREEDY_KERNEL
-
 
458
        lea     eax, [ecx+ebx+2];only image size
-
 
459
else
463
 
460
        lea     eax, [eax+ebx+2];all requested memory
464
        lea     eax, [eax+ebx+2];all requested memory
461
end if
465
 
462
        cmp     eax, [pg_data.pages_free]
466
        cmp     eax, [pg_data.pages_free]
463
        ja      .fail
467
        ja      .fail
464
 
468
 
465
        call    alloc_page
469
        stdcall kernel_alloc, 0x2000
466
        test    eax, eax
470
        test    eax, eax
467
        jz      .fail
471
        jz      .fail
-
 
472
        mov     [process], eax
-
 
473
 
468
        mov     [dir_addr], eax
474
        lea     edi, [eax+PROC.heap_lock]
-
 
475
        mov     ecx, (PROC.ht_next-PROC.heap_lock)/4
-
 
476
 
-
 
477
        list_init eax
-
 
478
        add     eax, PROC.thr_list
469
        stdcall map_page, [tmp_task_pdir], eax, dword PG_SW
-
 
470
 
-
 
471
        mov     edi, [tmp_task_pdir]
479
        list_init eax
472
        mov     ecx, (OS_BASE shr 20)/4
480
 
473
        xor     eax, eax
481
        xor     eax, eax
474
        cld
482
        cld
475
        rep stosd
483
        rep stosd
-
 
484
 
-
 
485
        mov     ecx, (PROC.pdt_0 - PROC.htab)/4
-
 
486
@@:
-
 
487
        stosd
-
 
488
        inc     eax
-
 
489
        cmp     eax, ecx
-
 
490
        jbe     @B
-
 
491
 
-
 
492
        mov     [edi-4096+PROC.ht_next], 1      ;reserve handle 0
-
 
493
        mov     eax, edi
-
 
494
        call    get_pg_addr
-
 
495
        mov     [edi-4096+PROC.pdt_0_phys], eax
-
 
496
 
-
 
497
        mov     ecx, (OS_BASE shr 20)/4
-
 
498
        xor     eax, eax
-
 
499
        rep stosd
476
 
500
 
477
        mov     ecx, (OS_BASE shr 20)/4
501
        mov     ecx, (OS_BASE shr 20)/4
478
        mov     esi, sys_pgdir+(OS_BASE shr 20)
502
        mov     esi, sys_proc+PROC.pdt_0+(OS_BASE shr 20)
479
        rep movsd
503
        rep movsd
480
 
504
 
481
        mov     eax, [dir_addr]
505
        mov     eax, [edi-8192+PROC.pdt_0_phys]
482
        or      eax, PG_SW
506
        or      eax, PG_SW
483
        mov     [edi-4096+(page_tabs shr 20)], eax
507
        mov     [edi-4096+(page_tabs shr 20)], eax
484
 
508
 
485
        and     eax, -4096
509
        lea     eax, [edi-8192]
486
        call    set_cr3
510
        call    set_cr3
-
 
511
 
-
 
512
        mov     ecx, [app_tabs]
-
 
513
        test    ecx, ecx
487
 
514
        jz      .done
488
        mov     edx, [app_tabs]
515
 
489
        mov     edi, new_app_base
516
        xor     edi, edi
490
@@:
517
@@:
491
        call    alloc_page
518
        call    alloc_page
492
        test    eax, eax
519
        test    eax, eax
493
        jz      .fail
520
        jz      .fail
494
 
521
 
495
        stdcall map_page_table, edi, eax
522
        stdcall map_page_table, edi, eax
496
        add     edi, 0x00400000
523
        add     edi, 0x00400000
497
        dec     edx
-
 
498
        jnz     @B
524
        loop    @B
499
 
-
 
500
        mov     edi, new_app_base
-
 
501
        shr     edi, 10
525
 
502
        add     edi, page_tabs
526
        mov     edi, page_tabs
503
 
527
 
504
        mov     ecx, [app_tabs]
528
        mov     ecx, [app_tabs]
505
        shl     ecx, 10
529
        shl     ecx, 10
506
        xor     eax, eax
530
        xor     eax, eax
507
        rep stosd
531
        rep stosd
-
 
532
 
508
 
533
        xor     edx, edx
-
 
534
        mov     ecx, [img_pages]
-
 
535
        jcxz    .bss
-
 
536
 
-
 
537
        sub     [app_pages], ecx
509
        mov     ecx, [img_pages]
538
 
510
        mov     ebx, PG_UW
-
 
511
        mov     edx, new_app_base
539
        mov     ebx, PG_UW
512
        mov     esi, [img_base]
-
 
513
        mov     edi, new_app_base
540
        mov     esi, [img_base]
514
        shr     esi, 10
-
 
515
        shr     edi, 10
541
        shr     esi, 10
516
        add     esi, page_tabs
542
        add     esi, page_tabs
517
        add     edi, page_tabs
543
        mov     edi, page_tabs
518
.remap:
544
.remap:
519
        lodsd
545
        lodsd
520
        and     eax, 0xFFFFF000
546
        and     eax, 0xFFFFF000
521
        or      eax, ebx; force user level r/w access
547
        or      eax, ebx; force user level r/w access
522
        stosd
548
        stosd
523
        add     edx, 0x1000
549
        add     edx, 0x1000
524
        dec     [app_pages]
-
 
525
        dec     ecx
-
 
526
        jnz     .remap
550
        loop    .remap
527
 
551
.bss:
528
        mov     ecx, [app_pages]
552
        mov     ebx, [app_pages]
529
        test    ecx, ecx
553
        test    ebx, ebx
530
        jz      .done
554
        jz      .done
531
 
-
 
532
if GREEDY_KERNEL
-
 
533
        mov     eax, 0x02
-
 
534
        rep stosd
-
 
535
else
-
 
536
 
555
 
537
.alloc:
556
.map_bss:
538
        call    alloc_page
557
        call    alloc_page
539
        test    eax, eax
558
        test    eax, eax
540
        jz      .fail
559
        jz      .fail
541
 
560
 
542
        stdcall map_page, edx, eax, dword PG_UW
561
        stdcall map_page, edx, eax, dword PG_UW
543
        add     edx, 0x1000
562
        add     edx, 0x1000
544
        dec     [app_pages]
563
        dec     ebx
545
        jnz     .alloc
564
        jnz     .map_bss
546
end if
-
 
547
 
565
 
548
.done:
-
 
549
        stdcall map_page, [tmp_task_pdir], dword 0, dword PG_UNMAP
-
 
550
 
566
.done:
551
        mov     ecx, pg_data.mutex
567
        mov     ecx, pg_data.mutex
552
        call    mutex_unlock
568
        call    mutex_unlock
-
 
569
        mov     eax, [process]
-
 
570
 
-
 
571
        pop     edi
-
 
572
        pop     esi
553
        mov     eax, [dir_addr]
573
        pop     ebx
554
        ret
574
        ret
555
.fail:
575
.fail:
556
        mov     ecx, pg_data.mutex
576
        mov     ecx, pg_data.mutex
557
        call    mutex_unlock
577
        call    mutex_unlock
558
        cmp     [dir_addr], 0
578
        cmp     [process], 0
559
        je      @f
579
        je      @f
560
        stdcall destroy_app_space, [dir_addr], 0
580
;;        stdcall destroy_app_space, [dir_addr], 0
561
@@:
581
@@:
562
        xor     eax, eax
582
        xor     eax, eax
-
 
583
        pop     edi
-
 
584
        pop     esi
-
 
585
        pop     ebx
563
        ret
586
        ret
564
endp
587
endp
565
 
588
 
566
align 4
589
align 4
567
set_cr3:
590
set_cr3:
-
 
591
        pushfd
568
 
592
        cli
569
        mov     ebx, [current_slot]
593
        mov     ebx, [current_slot]
-
 
594
        mov     [current_process], eax
570
        mov     [ebx+APPDATA.dir_table], eax
595
        mov     [ebx+APPDATA.process], eax
-
 
596
        mov     eax, [eax+PROC.pdt_0_phys]
571
        mov     cr3, eax
597
        mov     cr3, eax
-
 
598
        popfd
572
        ret
599
        ret
573
 
600
 
574
align 4
601
align 4
575
proc destroy_page_table stdcall, pg_tab:dword
602
proc destroy_page_table stdcall, pg_tab:dword
576
 
603
 
577
        push    esi
604
        push    esi
578
 
605
 
579
        mov     esi, [pg_tab]
606
        mov     esi, [pg_tab]
580
        mov     ecx, 1024
607
        mov     ecx, 1024
581
.free:
608
.free:
582
        mov     eax, [esi]
609
        mov     eax, [esi]
583
        test    eax, 1
610
        test    eax, 1
584
        jz      .next
611
        jz      .next
-
 
612
        test    eax, 2
-
 
613
        jz      .next
585
        test    eax, 1 shl 9
614
        test    eax, 1 shl 9
586
        jnz     .next                     ;skip shared pages
615
        jnz     .next                     ;skip shared pages
587
        call    free_page
616
        call    free_page
588
.next:
617
.next:
589
        add     esi, 4
618
        add     esi, 4
590
        dec     ecx
619
        dec     ecx
591
        jnz     .free
620
        jnz     .free
592
        pop     esi
621
        pop     esi
593
        ret
622
        ret
594
endp
623
endp
595
 
624
 
596
align 4
625
align 4
597
proc destroy_app_space stdcall, pg_dir:dword, dlls_list:dword
626
destroy_process: ;fastcall ecx= ptr to process
598
 
-
 
599
        xor     edx, edx
-
 
600
        push    edx
-
 
601
        mov     eax, 0x1
627
 
602
        mov     ebx, [pg_dir]
-
 
603
.loop:
-
 
604
;eax = current slot of process
628
        lea     eax, [ecx+PROC.thr_list]
605
        mov     ecx, eax
-
 
606
        shl     ecx, 5
-
 
607
        cmp     byte [CURRENT_TASK+ecx+0xa], 9;if process running?
-
 
608
        jz      @f           ;skip empty slots
-
 
609
        shl     ecx, 3
-
 
610
        add     ecx, SLOT_BASE
-
 
611
        cmp     [ecx+APPDATA.dir_table], ebx;compare page directory addresses
-
 
612
        jnz     @f
-
 
613
        mov     [ebp-4], ecx
-
 
614
        inc     edx             ;thread found
-
 
615
@@:
-
 
616
        inc     eax
-
 
617
        cmp     eax, [TASK_COUNT]   ;exit loop if we look through all processes
629
        cmp     eax, [eax+LHEAD.next]
618
        jle     .loop
-
 
619
 
-
 
620
;edx = number of threads
630
        jne     .exit
621
;our process is zombi so it isn't counted
631
 
622
        pop     ecx
632
align 4
623
        cmp     edx, 1
-
 
624
        jg      .ret
-
 
625
;if there isn't threads then clear memory.
-
 
626
        mov     esi, [dlls_list]
633
.internal:
627
        call    destroy_all_hdlls;ecx=APPDATA
634
        push    ecx
628
 
635
 
629
        mov     ecx, pg_data.mutex
636
        mov     esi, [ecx+PROC.dlls_list_ptr]
-
 
637
        call    destroy_all_hdlls
630
        call    mutex_lock
638
 
631
 
639
;        mov     ecx, pg_data.mutex
632
        mov     eax, [pg_dir]
640
;        call    mutex_lock
633
        and     eax, not 0xFFF
641
 
634
        stdcall map_page, [tmp_task_pdir], eax, PG_SW
642
        mov     esi, [esp]
635
        mov     esi, [tmp_task_pdir]
643
        add     esi, PROC.pdt_0
636
        mov     edi, (OS_BASE shr 20)/4
644
        mov     edi, (0x80000000 shr 20)/4
637
.destroy:
645
.destroy:
638
        mov     eax, [esi]
646
        mov     eax, [esi]
639
        test    eax, 1
647
        test    eax, 1
640
        jz      .next
648
        jz      .next
641
        and     eax, not 0xFFF
649
        and     eax, not 0xFFF
642
        stdcall map_page, [tmp_task_ptab], eax, PG_SW
650
        stdcall map_page, [tmp_task_ptab], eax, PG_SW
643
        stdcall destroy_page_table, [tmp_task_ptab]
651
        stdcall destroy_page_table, [tmp_task_ptab]
644
        mov     eax, [esi]
652
        mov     eax, [esi]
645
        call    free_page
653
        call    free_page
646
.next:
654
.next:
647
        add     esi, 4
655
        add     esi, 4
648
        dec     edi
656
        dec     edi
649
        jnz     .destroy
657
        jnz     .destroy
650
 
-
 
651
        mov     eax, [pg_dir]
658
 
652
        call    free_page
-
 
653
.exit:
659
        call    kernel_free     ;ecx still in stack
654
        stdcall map_page, [tmp_task_ptab], 0, PG_UNMAP
-
 
655
        stdcall map_page, [tmp_task_pdir], 0, PG_UNMAP
660
        stdcall map_page, [tmp_task_ptab], 0, PG_UNMAP
656
        mov     ecx, pg_data.mutex
661
 ;       mov     ecx, pg_data.mutex
-
 
662
 ;       call    mutex_unlock
657
        call    mutex_unlock
663
 
658
.ret:
664
.exit:
659
        ret
-
 
660
endp
665
        ret
661
 
666
 
662
align 4
667
align 4
663
get_pid:
668
get_pid:
664
        mov     eax, [TASK_BASE]
669
        mov     eax, [TASK_BASE]
665
        mov     eax, [eax+TASKDATA.pid]
670
        mov     eax, [eax+TASKDATA.pid]
666
        ret
671
        ret
667
 
672
 
668
pid_to_slot:
673
pid_to_slot:
669
;Input:
674
;Input:
670
;  eax - pid of process
675
;  eax - pid of process
671
;Output:
676
;Output:
672
;  eax - slot of process or 0 if process don't exists
677
;  eax - slot of process or 0 if process don't exists
673
;Search process by PID.
678
;Search process by PID.
674
        push    ebx
679
        push    ebx
675
        push    ecx
680
        push    ecx
676
        mov     ebx, [TASK_COUNT]
681
        mov     ebx, [TASK_COUNT]
677
        shl     ebx, 5
682
        shl     ebx, 5
678
        mov     ecx, 2*32
683
        mov     ecx, 2*32
679
 
684
 
680
.loop:
685
.loop:
681
;ecx=offset of current process info entry
686
;ecx=offset of current process info entry
682
;ebx=maximum permitted offset
687
;ebx=maximum permitted offset
683
        cmp     byte [CURRENT_TASK+ecx+0xa], 9
688
        cmp     byte [CURRENT_TASK+ecx+0xa], 9
684
        jz      .endloop ;skip empty slots
689
        jz      .endloop ;skip empty slots
685
        cmp     [CURRENT_TASK+ecx+0x4], eax;check PID
690
        cmp     [CURRENT_TASK+ecx+0x4], eax;check PID
686
        jz      .pid_found
691
        jz      .pid_found
687
.endloop:
692
.endloop:
688
        add     ecx, 32
693
        add     ecx, 32
689
        cmp     ecx, ebx
694
        cmp     ecx, ebx
690
        jle     .loop
695
        jle     .loop
691
 
696
 
692
        pop     ecx
697
        pop     ecx
693
        pop     ebx
698
        pop     ebx
694
        xor     eax, eax
699
        xor     eax, eax
695
        ret
700
        ret
696
 
701
 
697
.pid_found:
702
.pid_found:
698
        shr     ecx, 5
703
        shr     ecx, 5
699
        mov     eax, ecx ;convert offset to index of slot
704
        mov     eax, ecx ;convert offset to index of slot
700
        pop     ecx
705
        pop     ecx
701
        pop     ebx
706
        pop     ebx
702
        ret
707
        ret
703
 
708
 
704
check_region:
709
check_region:
705
;input:
710
;input:
706
;  esi - start of buffer
711
;  esi - start of buffer
707
;  edx - size of buffer
712
;  edx - size of buffer
708
;result:
713
;result:
709
;  eax = 1 region lays in app memory
714
;  eax = 1 region lays in app memory
710
;  eax = 0 region don't lays in app memory
715
;  eax = 0 region don't lays in app memory
-
 
716
 
-
 
717
        mov     eax, 1
-
 
718
        ret
-
 
719
if 0
711
        mov     eax, [CURRENT_TASK]
720
        mov     eax, [CURRENT_TASK]
712
;     jmp  check_process_region
721
;     jmp  check_process_region
713
;-----------------------------------------------------------------------------
722
;-----------------------------------------------------------------------------
714
;check_process_region:
723
;check_process_region:
715
;input:
724
;input:
716
;  eax - slot
725
;  eax - slot
717
;  esi - start of buffer
726
;  esi - start of buffer
718
;  edx - size of buffer
727
;  edx - size of buffer
719
;result:
728
;result:
720
;  eax = 1 region lays in app memory
729
;  eax = 1 region lays in app memory
721
;  eax = 0 region don't lays in app memory
730
;  eax = 0 region don't lays in app memory
722
 
731
 
723
        test    edx, edx
732
        test    edx, edx
724
        jle     .ok
733
        jle     .ok
725
        shl     eax, 5
734
        shl     eax, 5
726
        cmp     word [CURRENT_TASK+eax+0xa], 0
735
        cmp     word [CURRENT_TASK+eax+0xa], 0
727
        jnz     .failed
736
        jnz     .failed
728
        shl     eax, 3
737
        shl     eax, 3
729
        mov     eax, [SLOT_BASE+eax+0xb8]
738
        mov     eax, [SLOT_BASE+eax+0xb8]
730
        test    eax, eax
739
        test    eax, eax
731
        jz      .failed
740
        jz      .failed
732
 
741
 
733
        mov     eax, 1
742
        mov     eax, 1
734
        ret
743
        ret
735
 
-
 
736
 
-
 
737
;    call MEM_Get_Linear_Address
-
 
738
;    push ebx
-
 
739
;    push ecx
-
 
740
;    push edx
-
 
741
;    mov  edx,ebx
-
 
742
;    and  edx,not (4096-1)
-
 
743
;    sub  ebx,edx
-
 
744
;    add  ecx,ebx
-
 
745
;    mov  ebx,edx
-
 
746
;    add  ecx,(4096-1)
-
 
747
;    and  ecx,not (4096-1)
-
 
748
;.loop:
-
 
749
;;eax - linear address of page directory
-
 
750
;;ebx - current page
-
 
751
;;ecx - current size
-
 
752
;    mov  edx,ebx
-
 
753
;    shr  edx,22
-
 
754
;    mov  edx,[eax+4*edx]
-
 
755
;    and  edx,not (4096-1)
-
 
756
;    test edx,edx
-
 
757
;    jz   .failed1
-
 
758
;    push eax
-
 
759
;    mov  eax,edx
-
 
760
;    call MEM_Get_Linear_Address
-
 
761
;    mov  edx,ebx
-
 
762
;    shr  edx,12
-
 
763
;    and  edx,(1024-1)
-
 
764
;    mov  eax,[eax+4*edx]
-
 
765
;    and  eax,not (4096-1)
-
 
766
;    test eax,eax
-
 
767
;    pop  eax
-
 
768
;    jz   .failed1
-
 
769
;    add  ebx,4096
-
 
770
;    sub  ecx,4096
-
 
771
;    jg   .loop
-
 
772
;    pop  edx
-
 
773
;    pop  ecx
-
 
774
;    pop  ebx
-
 
775
.ok:
744
.ok:
776
        mov     eax, 1
745
        mov     eax, 1
777
        ret
746
        ret
778
;
-
 
779
;.failed1:
-
 
780
;    pop  edx
-
 
781
;    pop  ecx
-
 
782
;    pop  ebx
-
 
783
.failed:
747
.failed:
784
        xor     eax, eax
748
        xor     eax, eax
785
        ret
749
        ret
-
 
750
end if
786
 
751
 
787
align 4
752
align 4
788
proc read_process_memory
753
proc read_process_memory
789
;Input:
754
;Input:
790
;  eax - process slot
755
;  eax - process slot
791
;  ecx - buffer address
756
;  ecx - buffer address
792
;  edx - buffer size
757
;  edx - buffer size
793
;  esi - start address in other process
758
;  esi - start address in other process
794
;Output:
759
;Output:
795
;  eax - number of bytes read.
760
;  eax - number of bytes read.
796
       locals
761
       locals
797
         slot   dd ?
762
         slot   dd ?
798
         buff   dd ?
763
         buff   dd ?
799
         r_count    dd ?
764
         r_count    dd ?
800
         offset dd ?
765
         offset dd ?
801
         tmp_r_cnt  dd ?
766
         tmp_r_cnt  dd ?
802
       endl
767
       endl
803
 
768
 
804
        mov     [slot], eax
769
        mov     [slot], eax
805
        mov     [buff], ecx
770
        mov     [buff], ecx
806
        and     [r_count], 0
771
        and     [r_count], 0
807
        mov     [tmp_r_cnt], edx
772
        mov     [tmp_r_cnt], edx
808
        mov     [offset], esi
773
        mov     [offset], esi
809
 
774
 
810
        pushad
775
        pushad
811
.read_mem:
776
.read_mem:
812
        mov     edx, [offset]
777
        mov     edx, [offset]
813
        mov     ebx, [tmp_r_cnt]
778
        mov     ebx, [tmp_r_cnt]
814
 
779
 
815
        mov     ecx, 0x400000
780
        mov     ecx, 0x400000
816
        and     edx, 0x3FFFFF
781
        and     edx, 0x3FFFFF
817
        sub     ecx, edx
782
        sub     ecx, edx
818
        cmp     ecx, ebx
783
        cmp     ecx, ebx
819
        jbe     @f
784
        jbe     @f
820
        mov     ecx, ebx
785
        mov     ecx, ebx
821
@@:
786
@@:
822
        cmp     ecx, 0x8000
787
        cmp     ecx, 0x8000
823
        jna     @F
788
        jna     @F
824
        mov     ecx, 0x8000
789
        mov     ecx, 0x8000
825
@@:
790
@@:
826
        mov     ebx, [offset]
791
        mov     ebx, [offset]
827
 
792
 
828
        push    ecx
793
        push    ecx
829
        stdcall map_memEx, [proc_mem_map], \
794
        stdcall map_memEx, [proc_mem_map], \
830
                [slot], ebx, ecx, PG_MAP
795
                [slot], ebx, ecx, PG_MAP
831
        pop     ecx
796
        pop     ecx
832
 
797
 
833
        mov     esi, [offset]
798
        mov     esi, [offset]
834
        and     esi, 0xfff
799
        and     esi, 0xfff
835
        sub     eax, esi
800
        sub     eax, esi
836
        jbe     .ret
801
        jbe     .ret
837
        cmp     ecx, eax
802
        cmp     ecx, eax
838
        jbe     @f
803
        jbe     @f
839
        mov     ecx, eax
804
        mov     ecx, eax
840
        mov     [tmp_r_cnt], eax
805
        mov     [tmp_r_cnt], eax
841
@@:
806
@@:
842
        add     esi, [proc_mem_map]
807
        add     esi, [proc_mem_map]
843
        mov     edi, [buff]
808
        mov     edi, [buff]
844
        mov     edx, ecx
809
        mov     edx, ecx
845
        rep movsb
810
        rep movsb
846
        add     [r_count], edx
811
        add     [r_count], edx
847
 
812
 
848
        add     [offset], edx
813
        add     [offset], edx
849
        sub     [tmp_r_cnt], edx
814
        sub     [tmp_r_cnt], edx
850
        jnz     .read_mem
815
        jnz     .read_mem
851
.ret:
816
.ret:
852
        popad
817
        popad
853
        mov     eax, [r_count]
818
        mov     eax, [r_count]
854
        ret
819
        ret
855
endp
820
endp
856
 
821
 
857
align 4
822
align 4
858
proc write_process_memory
823
proc write_process_memory
859
;Input:
824
;Input:
860
;  eax - process slot
825
;  eax - process slot
861
;  ecx - buffer address
826
;  ecx - buffer address
862
;  edx - buffer size
827
;  edx - buffer size
863
;  esi - start address in other process
828
;  esi - start address in other process
864
;Output:
829
;Output:
865
;  eax - number of bytes written
830
;  eax - number of bytes written
866
 
831
 
867
       locals
832
       locals
868
         slot   dd ?
833
         slot   dd ?
869
         buff   dd ?
834
         buff   dd ?
870
         w_count    dd ?
835
         w_count    dd ?
871
         offset dd ?
836
         offset dd ?
872
         tmp_w_cnt  dd ?
837
         tmp_w_cnt  dd ?
873
       endl
838
       endl
874
 
839
 
875
        mov     [slot], eax
840
        mov     [slot], eax
876
        mov     [buff], ecx
841
        mov     [buff], ecx
877
        and     [w_count], 0
842
        and     [w_count], 0
878
        mov     [tmp_w_cnt], edx
843
        mov     [tmp_w_cnt], edx
879
        mov     [offset], esi
844
        mov     [offset], esi
880
 
845
 
881
        pushad
846
        pushad
882
.read_mem:
847
.read_mem:
883
        mov     edx, [offset]
848
        mov     edx, [offset]
884
        mov     ebx, [tmp_w_cnt]
849
        mov     ebx, [tmp_w_cnt]
885
 
850
 
886
        mov     ecx, 0x400000
851
        mov     ecx, 0x400000
887
        and     edx, 0x3FFFFF
852
        and     edx, 0x3FFFFF
888
        sub     ecx, edx
853
        sub     ecx, edx
889
        cmp     ecx, ebx
854
        cmp     ecx, ebx
890
        jbe     @f
855
        jbe     @f
891
        mov     ecx, ebx
856
        mov     ecx, ebx
892
@@:
857
@@:
893
        cmp     ecx, 0x8000
858
        cmp     ecx, 0x8000
894
        jna     @F
859
        jna     @F
895
        mov     ecx, 0x8000
860
        mov     ecx, 0x8000
896
@@:
861
@@:
897
        mov     ebx, [offset]
862
        mov     ebx, [offset]
898
      ;     add ebx, new_app_base
863
      ;     add ebx, new_app_base
899
        push    ecx
864
        push    ecx
900
        stdcall map_memEx, [proc_mem_map], \
865
        stdcall map_memEx, [proc_mem_map], \
901
                [slot], ebx, ecx, PG_SW
866
                [slot], ebx, ecx, PG_SW
902
        pop     ecx
867
        pop     ecx
903
 
868
 
904
        mov     edi, [offset]
869
        mov     edi, [offset]
905
        and     edi, 0xfff
870
        and     edi, 0xfff
906
        sub     eax, edi
871
        sub     eax, edi
907
        jbe     .ret
872
        jbe     .ret
908
        cmp     ecx, eax
873
        cmp     ecx, eax
909
        jbe     @f
874
        jbe     @f
910
        mov     ecx, eax
875
        mov     ecx, eax
911
        mov     [tmp_w_cnt], eax
876
        mov     [tmp_w_cnt], eax
912
@@:
877
@@:
913
        add     edi, [proc_mem_map]
878
        add     edi, [proc_mem_map]
914
        mov     esi, [buff]
879
        mov     esi, [buff]
915
        mov     edx, ecx
880
        mov     edx, ecx
916
        rep movsb
881
        rep movsb
917
 
882
 
918
        add     [w_count], edx
883
        add     [w_count], edx
919
        add     [offset], edx
884
        add     [offset], edx
920
        sub     [tmp_w_cnt], edx
885
        sub     [tmp_w_cnt], edx
921
        jnz     .read_mem
886
        jnz     .read_mem
922
.ret:
887
.ret:
923
        popad
888
        popad
924
        mov     eax, [w_count]
889
        mov     eax, [w_count]
925
        ret
890
        ret
926
endp
891
endp
927
 
892
 
928
;ebx = 1 - kernel thread
893
;ebx = 1 - kernel thread
929
;ecx=thread entry point
894
;ecx=thread entry point
930
;edx=thread stack pointer
895
;edx=thread stack pointer
931
;creation flags  0x01 - debugged
896
;creation flags  0x01 - debugged
932
;                0x02 - kernel
897
;                0x02 - kernel
933
 
898
 
934
align 4
899
align 4
935
proc new_sys_threads
900
proc new_sys_threads
936
       locals
901
       locals
937
         slot      dd ?
902
         slot      dd ?
938
         flags         dd ?
903
         flags         dd ?
939
         app_cmdline   dd ? ;0x00
904
         app_cmdline   dd ? ;0x00
940
         app_path      dd ? ;0x04
905
         app_path      dd ? ;0x04
941
         app_eip       dd ? ;0x08
906
         app_eip       dd ? ;0x08
942
         app_esp       dd ? ;0x0C
907
         app_esp       dd ? ;0x0C
943
         app_mem       dd ? ;0x10
908
         app_mem       dd ? ;0x10
944
       endl
909
       endl
945
 
910
 
946
        shl     ebx, 1
911
        shl     ebx, 1
947
        mov     [flags], ebx
912
        mov     [flags], ebx
948
 
913
 
949
        xor     eax, eax
914
        xor     eax, eax
950
        mov     [app_eip], ecx
915
        mov     [app_eip], ecx
951
        mov     [app_cmdline], eax
916
        mov     [app_cmdline], eax
952
        mov     [app_esp], edx
917
        mov     [app_esp], edx
953
        mov     [app_path], eax
918
        mov     [app_path], eax
954
 
919
 
955
        call    lock_application_table
920
        call    lock_application_table
956
 
921
 
957
        call    get_new_process_place
922
        call    alloc_thread_slot
958
        test    eax, eax
923
        test    eax, eax
959
        jz      .failed
924
        jz      .failed
960
 
925
 
961
        mov     [slot], eax
926
        mov     [slot], eax
962
 
927
 
963
        mov     esi, [current_slot]
928
        mov     esi, [current_slot]
964
        mov     ebx, esi      ;ebx=esi - pointer to extended information about current thread
929
        mov     ebx, esi      ;ebx=esi - pointer to extended information about current thread
965
 
930
 
966
        mov     edi, eax
931
        mov     edi, eax
967
        shl     edi, 8
932
        shl     edi, 8
968
        add     edi, SLOT_BASE
933
        add     edi, SLOT_BASE
969
        mov     edx, edi      ;edx=edi - pointer to extended infomation about new thread
934
        mov     edx, edi      ;edx=edi - pointer to extended infomation about new thread
970
        mov     ecx, 256/4
935
        mov     ecx, 256/4
971
        xor     eax, eax
936
        xor     eax, eax
972
        cld
937
        cld
973
        rep stosd             ;clean extended information about new thread
938
        rep stosd             ;clean extended information about new thread
974
        mov     esi, ebx
939
        mov     esi, ebx
975
        mov     edi, edx
940
        mov     edi, edx
976
        mov     ecx, 11
941
        mov     ecx, 11
977
        rep movsb             ;copy process name
942
        rep movsb             ;copy process name
978
 
943
 
979
        mov     eax, [ebx+APPDATA.heap_base]
944
        mov     eax, [ebx+APPDATA.process]
980
        mov     [edx+APPDATA.heap_base], eax
-
 
981
 
-
 
982
        mov     ecx, [ebx+APPDATA.heap_top]
-
 
983
        mov     [edx+APPDATA.heap_top], ecx
945
        mov     [edx+APPDATA.process], eax
984
 
-
 
985
        mov     eax, [ebx+APPDATA.mem_size]
-
 
986
        mov     [edx+APPDATA.mem_size], eax
946
 
987
 
947
        lea     ebx, [edx+APPDATA.list]
988
        mov     ecx, [ebx+APPDATA.dir_table]
-
 
989
        mov     [edx+APPDATA.dir_table], ecx;copy page directory
-
 
990
 
-
 
991
        mov     eax, [ebx+APPDATA.dlls_list_ptr]
948
        lea     ecx, [eax+PROC.thr_list]
992
        mov     [edx+APPDATA.dlls_list_ptr], eax
949
        list_add_tail ebx, ecx               ;add thread to process child's list
993
 
950
 
994
        mov     eax, [ebx+APPDATA.tls_base]
951
        mov     eax, [ebx+APPDATA.tls_base]
995
        test    eax, eax
952
        test    eax, eax
996
        jz      @F
953
        jz      @F
997
 
954
 
998
        push    edx
955
        push    edx
999
        stdcall user_alloc, 4096
956
        stdcall user_alloc, 4096
1000
        pop     edx
957
        pop     edx
1001
        test    eax, eax
958
        test    eax, eax
1002
        jz      .failed1;eax=0
959
        jz      .failed1;eax=0
1003
@@:
960
@@:
1004
        mov     [edx+APPDATA.tls_base], eax
961
        mov     [edx+APPDATA.tls_base], eax
1005
 
962
 
1006
        lea     eax, [app_cmdline]
963
        lea     eax, [app_cmdline]
1007
        stdcall set_app_params , [slot], eax, dword 0, \
964
        stdcall set_app_params , [slot], eax, dword 0, \
1008
                dword 0, [flags]
965
                dword 0, [flags]
1009
 
966
 
1010
        mov     eax, [process_number]           ;set result
967
        mov     eax, [process_number]           ;set result
1011
        call    unlock_application_table
968
        call    unlock_application_table
1012
        ret
969
        ret
1013
.failed:
970
.failed:
1014
        xor     eax, eax
971
        xor     eax, eax
1015
.failed1:
972
.failed1:
1016
        call    unlock_application_table
973
        call    unlock_application_table
1017
        dec     eax     ;-1
974
        dec     eax     ;-1
1018
        ret
975
        ret
1019
endp
976
endp
1020
 
977
 
1021
align 4
978
align 4
1022
tls_app_entry:
979
tls_app_entry:
1023
 
980
 
1024
        call    init_heap
981
        call    init_heap
1025
        stdcall user_alloc, 4096
982
        stdcall user_alloc, 4096
1026
 
983
 
1027
        mov     edx, [current_slot]
984
        mov     edx, [current_slot]
1028
        mov     [edx+APPDATA.tls_base], eax
985
        mov     [edx+APPDATA.tls_base], eax
1029
        mov     [tls_data_l+2], ax
986
        mov     [tls_data_l+2], ax
1030
        shr     eax, 16
987
        shr     eax, 16
1031
        mov     [tls_data_l+4], al
988
        mov     [tls_data_l+4], al
1032
        mov     [tls_data_l+7], ah
989
        mov     [tls_data_l+7], ah
1033
        mov     dx, app_tls
990
        mov     dx, app_tls
1034
        mov     fs, dx
991
        mov     fs, dx
1035
        popad
992
        popad
1036
        iretd
993
        iretd
1037
 
994
 
1038
 
995
 
1039
EFL_IF      equ 0x0200
996
EFL_IF      equ 0x0200
1040
EFL_IOPL1   equ 0x1000
997
EFL_IOPL1   equ 0x1000
1041
EFL_IOPL2   equ 0x2000
998
EFL_IOPL2   equ 0x2000
1042
EFL_IOPL3   equ 0x3000
999
EFL_IOPL3   equ 0x3000
1043
 
1000
 
1044
 
1001
 
1045
align 4
1002
align 4
1046
proc set_app_params stdcall,slot:dword, params:dword,\
1003
proc set_app_params stdcall,slot:dword, params:dword,\
1047
            cmd_line:dword, app_path:dword, flags:dword
1004
            cmd_line:dword, app_path:dword, flags:dword
1048
 
1005
 
1049
       locals
1006
       locals
1050
         pl0_stack dd ?
1007
         pl0_stack dd ?
1051
       endl
1008
       endl
1052
 
1009
 
1053
        stdcall kernel_alloc, RING0_STACK_SIZE+512
1010
        stdcall kernel_alloc, RING0_STACK_SIZE+512
1054
        mov     [pl0_stack], eax
1011
        mov     [pl0_stack], eax
1055
 
1012
 
1056
        lea     edi, [eax+RING0_STACK_SIZE]
1013
        lea     edi, [eax+RING0_STACK_SIZE]
1057
 
1014
 
1058
        mov     eax, [slot]
1015
        mov     eax, [slot]
1059
        mov     ebx, eax
1016
        mov     ebx, eax
1060
 
1017
 
1061
        shl     eax, 8
1018
        shl     eax, 8
1062
        mov     [eax+SLOT_BASE+APPDATA.fpu_state], edi
1019
        mov     [eax+SLOT_BASE+APPDATA.fpu_state], edi
1063
        mov     [eax+SLOT_BASE+APPDATA.exc_handler], 0
1020
        mov     [eax+SLOT_BASE+APPDATA.exc_handler], 0
1064
        mov     [eax+SLOT_BASE+APPDATA.except_mask], 0
1021
        mov     [eax+SLOT_BASE+APPDATA.except_mask], 0
1065
        mov     [eax+SLOT_BASE+APPDATA.terminate_protection], 80000001h
1022
        mov     [eax+SLOT_BASE+APPDATA.terminate_protection], 80000001h
1066
 
1023
 
1067
;set default io permission map
1024
;set default io permission map
1068
        mov     ecx, [SLOT_BASE+256+APPDATA.io_map]
1025
        mov     ecx, [SLOT_BASE+256+APPDATA.io_map]
1069
        mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
1026
        mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
1070
        mov     ecx, [SLOT_BASE+256+APPDATA.io_map+4]
1027
        mov     ecx, [SLOT_BASE+256+APPDATA.io_map+4]
1071
        mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
1028
        mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
1072
 
1029
 
1073
        mov     esi, fpu_data
1030
        mov     esi, fpu_data
1074
        mov     ecx, 512/4
1031
        mov     ecx, 512/4
1075
        rep movsd
1032
        rep movsd
1076
 
1033
 
1077
        cmp     ebx, [TASK_COUNT]
1034
        cmp     ebx, [TASK_COUNT]
1078
        jle     .noinc
1035
        jle     .noinc
1079
        inc     dword [TASK_COUNT]     ;update number of processes
1036
        inc     dword [TASK_COUNT]     ;update number of processes
1080
.noinc:
1037
.noinc:
1081
        shl     ebx, 8
1038
        shl     ebx, 8
1082
        lea     edx, [ebx+SLOT_BASE+APP_EV_OFFSET]
1039
        lea     edx, [ebx+SLOT_BASE+APP_EV_OFFSET]
1083
        mov     [SLOT_BASE+APPDATA.fd_ev+ebx], edx
1040
        mov     [SLOT_BASE+APPDATA.fd_ev+ebx], edx
1084
        mov     [SLOT_BASE+APPDATA.bk_ev+ebx], edx
1041
        mov     [SLOT_BASE+APPDATA.bk_ev+ebx], edx
1085
 
1042
 
1086
        add     edx, APP_OBJ_OFFSET-APP_EV_OFFSET
1043
        add     edx, APP_OBJ_OFFSET-APP_EV_OFFSET
1087
        mov     [SLOT_BASE+APPDATA.fd_obj+ebx], edx
1044
        mov     [SLOT_BASE+APPDATA.fd_obj+ebx], edx
1088
        mov     [SLOT_BASE+APPDATA.bk_obj+ebx], edx
1045
        mov     [SLOT_BASE+APPDATA.bk_obj+ebx], edx
1089
 
1046
 
1090
        mov     ecx, [def_cursor]
1047
        mov     ecx, [def_cursor]
1091
        mov     [SLOT_BASE+APPDATA.cursor+ebx], ecx
1048
        mov     [SLOT_BASE+APPDATA.cursor+ebx], ecx
1092
        mov     eax, [pl0_stack]
1049
        mov     eax, [pl0_stack]
1093
        mov     [SLOT_BASE+APPDATA.pl0_stack+ebx], eax
1050
        mov     [SLOT_BASE+APPDATA.pl0_stack+ebx], eax
1094
        add     eax, RING0_STACK_SIZE
1051
        add     eax, RING0_STACK_SIZE
1095
        mov     [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
1052
        mov     [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
1096
 
1053
 
1097
        push    ebx
1054
        push    ebx
1098
        stdcall kernel_alloc, 0x1000
1055
        stdcall kernel_alloc, 0x1000
1099
        pop     ebx
1056
        pop     ebx
1100
        mov     esi, [current_slot]
1057
        mov     esi, [current_slot]
1101
        mov     esi, [esi+APPDATA.cur_dir]
1058
        mov     esi, [esi+APPDATA.cur_dir]
1102
        mov     ecx, 0x1000/4
1059
        mov     ecx, 0x1000/4
1103
        mov     edi, eax
1060
        mov     edi, eax
1104
        mov     [ebx+SLOT_BASE+APPDATA.cur_dir], eax
1061
        mov     [ebx+SLOT_BASE+APPDATA.cur_dir], eax
1105
        rep movsd
1062
        rep movsd
1106
 
1063
 
1107
        shr     ebx, 3
1064
        shr     ebx, 3
1108
        mov     eax, new_app_base
1065
        mov     eax, new_app_base
1109
        mov     dword [CURRENT_TASK+ebx+0x10], eax
1066
        mov     dword [CURRENT_TASK+ebx+0x10], eax
1110
 
1067
 
1111
.add_command_line:
1068
.add_command_line:
1112
        mov     edx, [params]
1069
        mov     edx, [params]
1113
        mov     edx, [edx] ;app_cmdline
1070
        mov     edx, [edx] ;app_cmdline
1114
        test    edx, edx
1071
        test    edx, edx
1115
        jz      @f     ;application doesn't need parameters
1072
        jz      @f     ;application doesn't need parameters
1116
 
1073
 
1117
        mov     eax, edx
1074
        mov     eax, edx
1118
        add     eax, 256
1075
        add     eax, 256
1119
        jc      @f
1076
        jc      @f
1120
 
1077
 
1121
        cmp     eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1078
;        cmp     eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1122
        ja      @f
1079
;        ja      @f
1123
 
1080
 
1124
        mov     eax, [cmd_line]
1081
        mov     eax, [cmd_line]
1125
 
1082
 
1126
        cmp     [edx], dword 0xffffffff ; extended destination tag
1083
        cmp     [edx], dword 0xffffffff ; extended destination tag
1127
        jne     .no_ext_dest
1084
        jne     .no_ext_dest
1128
 
1085
 
1129
        mov     edx, [edx+4] ; extended destination for cmdline
1086
        mov     edx, [edx+4] ; extended destination for cmdline
1130
        jmp     .continue
1087
        jmp     .continue
1131
 
1088
 
1132
.no_ext_dest:
1089
.no_ext_dest:
1133
        mov     [eax-12], dword 255
1090
        mov     [eax-12], dword 255
1134
.continue:
1091
.continue:
1135
        mov     byte [edx], 0  ;force empty string if no cmdline given
1092
        mov     byte [edx], 0  ;force empty string if no cmdline given
1136
 
1093
 
1137
        test    eax, eax
1094
        test    eax, eax
1138
        jz      @f
1095
        jz      @f
1139
;--------------------------------------
1096
;--------------------------------------
1140
        cmp     [eax-4], dword 0xffffffff ; cmdline_flag
1097
        cmp     [eax-4], dword 0xffffffff ; cmdline_flag
1141
        jne     .old_copy
1098
        jne     .old_copy
1142
 
1099
 
1143
        push    eax
1100
        push    eax
1144
        stdcall strncpy, edx, [eax-8], [eax-12]
1101
        stdcall strncpy, edx, [eax-8], [eax-12]
1145
        pop     eax
1102
        pop     eax
1146
 
1103
 
1147
        stdcall kernel_free, [eax-8]
1104
        stdcall kernel_free, [eax-8]
1148
        jmp     @f
1105
        jmp     @f
1149
 
1106
 
1150
.old_copy:
1107
.old_copy:
1151
;--------------------------------------
1108
;--------------------------------------
1152
        stdcall strncpy, edx, eax, 256
1109
        stdcall strncpy, edx, eax, 256
1153
@@:
1110
@@:
1154
        mov     edx, [params]
1111
        mov     edx, [params]
1155
        mov     edx, [edx+4];app_path
1112
        mov     edx, [edx+4];app_path
1156
        test    edx, edx
1113
        test    edx, edx
1157
        jz      @F     ;application don't need path of file
1114
        jz      @F     ;application don't need path of file
1158
        mov     eax, edx
1115
        mov     eax, edx
1159
        add     eax, 1024
1116
        add     eax, 1024
1160
        jc      @f
1117
        jc      @f
1161
        cmp     eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1118
;        cmp     eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
1162
        ja      @f
1119
;        ja      @f
1163
        stdcall strncpy, edx, [app_path], 1024
1120
        stdcall strncpy, edx, [app_path], 1024
1164
@@:
1121
@@:
1165
        mov     ebx, [slot]
1122
        mov     ebx, [slot]
1166
        mov     eax, ebx
1123
        mov     eax, ebx
1167
        shl     ebx, 5
1124
        shl     ebx, 5
1168
        lea     ecx, [draw_data+ebx];ecx - pointer to draw data
1125
        lea     ecx, [draw_data+ebx];ecx - pointer to draw data
1169
 
1126
 
1170
        mov     edx, irq0.return
1127
        mov     edx, irq0.return
1171
        cmp     [ebx*8+SLOT_BASE+APPDATA.tls_base], -1
1128
        cmp     [ebx*8+SLOT_BASE+APPDATA.tls_base], -1
1172
        jne     @F
1129
        jne     @F
1173
        mov     edx, tls_app_entry
1130
        mov     edx, tls_app_entry
1174
@@:
1131
@@:
1175
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
1132
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
1176
        mov     [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
1133
        mov     [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
1177
        mov     [ebx+window_data+WDATA.fl_redraw], 1
1134
        mov     [ebx+window_data+WDATA.fl_redraw], 1
1178
        add     ebx, CURRENT_TASK     ;ebx - pointer to information about process
1135
        add     ebx, CURRENT_TASK     ;ebx - pointer to information about process
1179
        mov     [ebx+TASKDATA.wnd_number], al;set window number on screen = process slot
1136
        mov     [ebx+TASKDATA.wnd_number], al;set window number on screen = process slot
1180
 
1137
 
1181
        mov     [ebx+TASKDATA.event_mask], dword 1+2+4;set default event flags (see 40 function)
1138
        mov     [ebx+TASKDATA.event_mask], dword 1+2+4;set default event flags (see 40 function)
1182
 
1139
 
1183
        inc     dword [process_number]
1140
        inc     dword [process_number]
1184
        mov     eax, [process_number]
1141
        mov     eax, [process_number]
1185
        mov     [ebx+4], eax    ;set PID
1142
        mov     [ebx+4], eax    ;set PID
1186
 
1143
 
1187
;set draw data to full screen
1144
;set draw data to full screen
1188
        xor     eax, eax
1145
        xor     eax, eax
1189
        mov     [ecx+0], dword eax
1146
        mov     [ecx+0], dword eax
1190
        mov     [ecx+4], dword eax
1147
        mov     [ecx+4], dword eax
1191
        mov     eax, [_display.width]
1148
        mov     eax, [Screen_Max_X]
1192
        mov     [ecx+8], eax
1149
        mov     [ecx+8], eax
1193
        mov     eax, [_display.height]
1150
        mov     eax, [Screen_Max_Y]
1194
        mov     [ecx+12], eax
1151
        mov     [ecx+12], eax
1195
 
1152
 
1196
        mov     ebx, [pl0_stack]
1153
        mov     ebx, [pl0_stack]
1197
        mov     esi, [params]
1154
        mov     esi, [params]
1198
        lea     ecx, [ebx+REG_EIP]
1155
        lea     ecx, [ebx+REG_EIP]
1199
        xor     eax, eax
1156
        xor     eax, eax
1200
 
1157
 
1201
        mov     [ebx+REG_RET], edx
1158
        mov     [ebx+REG_RET], edx
1202
        mov     [ebx+REG_EDI], eax
1159
        mov     [ebx+REG_EDI], eax
1203
        mov     [ebx+REG_ESI], eax
1160
        mov     [ebx+REG_ESI], eax
1204
        mov     [ebx+REG_EBP], eax
1161
        mov     [ebx+REG_EBP], eax
1205
        mov     [ebx+REG_ESP], ecx;ebx+REG_EIP
1162
        mov     [ebx+REG_ESP], ecx;ebx+REG_EIP
1206
        mov     [ebx+REG_EBX], eax
1163
        mov     [ebx+REG_EBX], eax
1207
        mov     [ebx+REG_EDX], eax
1164
        mov     [ebx+REG_EDX], eax
1208
        mov     [ebx+REG_ECX], eax
1165
        mov     [ebx+REG_ECX], eax
1209
        mov     [ebx+REG_EAX], eax
1166
        mov     [ebx+REG_EAX], eax
1210
 
1167
 
1211
        mov     eax, [esi+0x08]  ;app_eip
1168
        mov     eax, [esi+0x08]  ;app_eip
1212
        mov     [ebx+REG_EIP], eax          ;app_entry
1169
        mov     [ebx+REG_EIP], eax          ;app_entry
1213
        mov     [ebx+REG_CS], dword app_code
1170
        mov     [ebx+REG_CS], dword app_code
1214
        mov     ecx, USER_PRIORITY
1171
        mov     ecx, USER_PRIORITY
1215
 
1172
 
1216
        test    byte [flags], 2
1173
        test    byte [flags], 2
1217
        jz      @F
1174
        jz      @F
1218
 
1175
 
1219
        mov     [ebx+REG_CS], dword os_code ; kernel thread
1176
        mov     [ebx+REG_CS], dword os_code ; kernel thread
1220
        mov     ecx, MAX_PRIORITY
1177
        mov     ecx, MAX_PRIORITY
1221
 
1178
 
1222
@@:
1179
@@:
1223
        mov     [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF
1180
        mov     [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF
1224
 
1181
 
1225
        mov     eax, [esi+0x0C]  ;app_esp
1182
        mov     eax, [esi+0x0C]  ;app_esp
1226
        mov     [ebx+REG_APP_ESP], eax;app_stack
1183
        mov     [ebx+REG_APP_ESP], eax;app_stack
1227
        mov     [ebx+REG_SS], dword app_data
1184
        mov     [ebx+REG_SS], dword app_data
1228
 
1185
 
1229
        lea     edx, [ebx+REG_RET]
1186
        lea     edx, [ebx+REG_RET]
1230
        mov     ebx, [slot]
1187
        mov     ebx, [slot]
1231
        shl     ebx, 5
1188
        shl     ebx, 5
1232
        mov     [ebx*8+SLOT_BASE+APPDATA.saved_esp], edx
1189
        mov     [ebx*8+SLOT_BASE+APPDATA.saved_esp], edx
1233
 
1190
 
1234
        xor     edx, edx; process state - running
1191
        xor     edx, edx; process state - running
1235
; set if debuggee
1192
; set if debuggee
1236
        test    byte [flags], 1
1193
        test    byte [flags], 1
1237
        jz      .no_debug
1194
        jz      .no_debug
1238
        inc     edx ; process state - suspended
1195
        inc     edx ; process state - suspended
1239
        mov     eax, [CURRENT_TASK]
1196
        mov     eax, [CURRENT_TASK]
1240
        mov     [SLOT_BASE+ebx*8+APPDATA.debugger_slot], eax
1197
        mov     [SLOT_BASE+ebx*8+APPDATA.debugger_slot], eax
1241
.no_debug:
1198
.no_debug:
1242
        mov     [CURRENT_TASK+ebx+TASKDATA.state], dl
1199
        mov     [CURRENT_TASK+ebx+TASKDATA.state], dl
1243
        lea     edx, [SLOT_BASE+ebx*8]
1200
        lea     edx, [SLOT_BASE+ebx*8]
1244
        call    scheduler_add_thread
1201
        call    scheduler_add_thread
1245
        ret
1202
        ret
1246
endp
1203
endp
1247
 
1204
 
1248
 
1205
 
1249
align 4
1206
align 4
1250
 
1207
 
1251
get_stack_base:
1208
get_stack_base:
1252
        mov     eax, [current_slot]
1209
        mov     eax, [current_slot]
1253
        mov     eax, [eax+APPDATA.pl0_stack]
1210
        mov     eax, [eax+APPDATA.pl0_stack]
1254
        ret
1211
        ret
1255
 
1212
 
1256
 
1213
 
1257
include "debug.inc"
1214
include "debug.inc"
1258
>
-