Subversion Repositories Kolibri OS

Rev

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

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