Subversion Repositories Kolibri OS

Rev

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

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