Subversion Repositories Kolibri OS

Rev

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

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