Subversion Repositories Kolibri OS

Rev

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

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