Subversion Repositories Kolibri OS

Rev

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

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