Subversion Repositories Kolibri OS

Rev

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

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