Subversion Repositories Kolibri OS

Rev

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