Subversion Repositories Kolibri OS

Rev

Rev 6317 | Rev 6332 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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