Rev 233 | Rev 247 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 233 | Rev 237 | ||
---|---|---|---|
Line 19... | Line 19... | ||
19 | .stack_top dd ? ;+24 |
19 | .stack_top dd ? ;+24 |
20 | .i_param dd ? ;+28 |
20 | .i_param dd ? ;+28 |
21 | .i_icon dd ? ;+32 |
21 | .i_icon dd ? ;+32 |
22 | } |
22 | } |
Line 23... | Line 23... | ||
23 | 23 | ||
- | 24 | struc TSS |
|
- | 25 | { |
|
- | 26 | ._back rw 2 |
|
- | 27 | ._esp0 rd 1 |
|
- | 28 | ._ss0 rw 2 |
|
- | 29 | ._esp1 rd 1 |
|
- | 30 | ._ss1 rw 2 |
|
- | 31 | ._esp2 rd 1 |
|
- | 32 | ._ss2 rw 2 |
|
- | 33 | ._cr3 rd 1 |
|
- | 34 | ._eip rd 1 |
|
- | 35 | ._eflags rd 1 |
|
- | 36 | ._eax rd 1 |
|
- | 37 | ._ecx rd 1 |
|
- | 38 | ._edx rd 1 |
|
- | 39 | ._ebx rd 1 |
|
- | 40 | ._esp rd 1 |
|
- | 41 | ._ebp rd 1 |
|
24 | align 4 |
42 | ._esi rd 1 |
- | 43 | ._edi rd 1 |
|
- | 44 | ._es rw 2 |
|
- | 45 | ._cs rw 2 |
|
- | 46 | ._ss rw 2 |
|
- | 47 | ._ds rw 2 |
|
25 | proc test_app_header stdcall, header:dword |
48 | ._fs rw 2 |
- | 49 | ._gs rw 2 |
|
- | 50 | ._ldt rw 2 |
|
26 | virtual at ebx |
51 | ._trap rw 1 |
- | 52 | ._io rw 1 |
|
- | 53 | } |
|
- | 54 | ||
- | 55 | virtual at 0 |
|
27 | APP_HEADER_00 APP_HEADER_00 |
56 | TSS TSS |
Line -... | Line 57... | ||
- | 57 | end virtual |
|
- | 58 | ||
- | 59 | struc APP_PARAMS |
|
- | 60 | { .app_cmdline ;0x00 |
|
- | 61 | .app_path ;0x04 |
|
- | 62 | .app_eip ;0x08 |
|
- | 63 | .app_esp ;0x0C |
|
- | 64 | .app_mem ;0x10 |
|
- | 65 | } |
|
- | 66 | ||
- | 67 | macro _clear_ op |
|
- | 68 | { mov ecx, op/4 |
|
- | 69 | xor eax, eax |
|
- | 70 | cld |
|
- | 71 | rep stosd |
|
- | 72 | } |
|
- | 73 | ||
- | 74 | align 4 |
|
- | 75 | proc fs_exec_EX stdcall file_name:dword, cmd_line:dword, flags:dword |
|
- | 76 | locals |
|
- | 77 | save_cr3 dd ? |
|
- | 78 | slot dd ? |
|
- | 79 | slot_base dd ? |
|
- | 80 | file_base dd ? |
|
- | 81 | file_size dd ? |
|
- | 82 | ||
- | 83 | app_cmdline dd ? ;0x00 |
|
- | 84 | app_path dd ? ;0x04 |
|
- | 85 | app_eip dd ? ;0x08 |
|
- | 86 | app_esp dd ? ;0x0C |
|
- | 87 | app_mem dd ? ;0x10 |
|
- | 88 | endl |
|
- | 89 | ||
- | 90 | stdcall load_file,[file_name] |
|
28 | end virtual |
91 | mov ecx, -ERROR_FILE_NOT_FOUND |
- | 92 | ||
- | 93 | test eax, eax |
|
- | 94 | jz .err ;fail |
|
- | 95 | ||
- | 96 | mov [file_base], eax |
|
29 | 97 | mov [file_size], ebx |
|
30 | mov ebx, [header] |
98 | |
- | 99 | lea ebx, [app_cmdline] |
|
- | 100 | call test_app_header |
|
- | 101 | mov ecx, -0x1F |
|
Line 31... | Line -... | ||
31 | cmp [ebx+6], word '00' |
- | |
32 | jne .check_01_header |
- | |
33 | 102 | test eax, eax |
|
34 | mov eax,[APP_HEADER_00.start] |
- | |
35 | mov [app_start],eax |
103 | jz .err ;fail |
- | 104 | ||
36 | mov eax,[APP_HEADER_00.i_end] |
105 | mov esi, new_process_loading |
37 | mov [app_i_end],eax |
106 | call sys_msg_board_str ; write message to message board |
- | 107 | ||
38 | mov eax,[APP_HEADER_00.mem_size] |
108 | pushfd |
39 | mov [app_mem],eax |
109 | cli |
40 | shr eax,1 |
110 | |
41 | sub eax,0x10 |
111 | .wait_lock: |
42 | mov [app_esp],eax |
112 | cmp [application_table_status],0 |
Line -... | Line 113... | ||
- | 113 | je .get_lock |
|
43 | mov eax,[APP_HEADER_00.i_param] |
114 | call change_task |
- | 115 | jmp .wait_lock |
|
- | 116 | ||
- | 117 | .get_lock: |
|
- | 118 | mov eax, 1 |
|
- | 119 | xchg eax, [application_table_status] |
|
- | 120 | cmp eax, 0 |
|
- | 121 | jne .wait_lock |
|
- | 122 | ||
- | 123 | call set_application_table_status |
|
- | 124 | ||
- | 125 | call get_new_process_place |
|
- | 126 | test eax, eax |
|
- | 127 | mov ecx, -0x20 ; too many processes |
|
- | 128 | jz .err |
|
- | 129 | ||
- | 130 | mov [slot], eax |
|
- | 131 | shl eax, 8 |
|
- | 132 | add eax, PROC_BASE |
|
- | 133 | mov [slot_base], eax |
|
- | 134 | mov edi, eax |
|
- | 135 | _clear_ 256 ;clean extended information about process |
|
- | 136 | ||
- | 137 | ; write application name |
|
- | 138 | mov edi, [file_name] |
|
- | 139 | mov al, '/' |
|
- | 140 | call k_strrchr ; now eax points to name without path |
|
- | 141 | ||
- | 142 | lea esi, [eax+1] |
|
- | 143 | test eax, eax |
|
- | 144 | jnz @F |
|
- | 145 | mov esi, [file_name] |
|
- | 146 | @@: |
|
- | 147 | mov ecx, 8 ; 8 chars for name |
|
- | 148 | mov edi, [slot_base] |
|
- | 149 | .copy_process_name_loop: |
|
- | 150 | lodsb |
|
- | 151 | cmp al, '.' |
|
- | 152 | jz .copy_process_name_done |
|
- | 153 | test al, al |
|
- | 154 | jz .copy_process_name_done |
|
- | 155 | stosb |
|
- | 156 | loop .copy_process_name_loop |
|
- | 157 | .copy_process_name_done: |
|
- | 158 | ||
- | 159 | mov ebx, cr3 |
|
- | 160 | mov [save_cr3], ebx |
|
- | 161 | if GREEDY_KERNEL |
|
- | 162 | stdcall create_app_space,[app_mem],[file_size] |
|
- | 163 | else |
|
- | 164 | stdcall create_app_space,[app_mem],[app_mem] |
|
- | 165 | end if |
|
- | 166 | test eax, eax |
|
- | 167 | jz .failed |
|
- | 168 | ||
- | 169 | mov ebx,[slot_base] |
|
- | 170 | mov [ebx+APPDATA.dir_table],eax |
|
- | 171 | mov eax,[app_mem] |
|
- | 172 | mov [ebx+APPDATA.mem_size],eax |
|
- | 173 | ||
- | 174 | mov ecx, [file_size] |
|
- | 175 | add ecx, 3 |
|
- | 176 | shr ecx, 2 |
|
- | 177 | mov esi, [file_base] |
|
- | 178 | mov edi, new_app_base |
|
- | 179 | cld |
|
- | 180 | rep movsd |
|
- | 181 | ||
- | 182 | stdcall kernel_free, [file_base] |
|
- | 183 | lea eax, [app_cmdline] |
|
- | 184 | stdcall set_app_params ,[slot],eax,[cmd_line],\ |
|
- | 185 | [file_name], dword 0 ;[flags] |
|
- | 186 | ||
- | 187 | mov eax, [save_cr3] |
|
- | 188 | call set_cr3 |
|
- | 189 | ||
44 | mov [app_i_param],eax |
190 | xor eax, eax |
- | 191 | mov [application_table_status],eax ;unlock application_table_status mutex |
|
- | 192 | popfd |
|
- | 193 | mov eax,[process_number] ;set result |
|
- | 194 | ret |
|
- | 195 | .failed: |
|
- | 196 | mov eax, [save_cr3] |
|
- | 197 | call set_cr3 |
|
- | 198 | .err: |
|
- | 199 | popfd |
|
Line -... | Line 200... | ||
- | 200 | xor eax, eax |
|
45 | mov [app_i_icon],dword 0 |
201 | mov [application_table_status],eax |
- | 202 | ret |
|
- | 203 | endp |
|
- | 204 | ||
46 | 205 | align 4 |
|
47 | mov eax,1 |
206 | test_app_header: |
48 | ret |
207 | virtual at eax |
Line -... | Line 208... | ||
- | 208 | APP_HEADER_00 APP_HEADER_00 |
|
- | 209 | end virtual |
|
49 | 210 | virtual at eax |
|
50 | .check_01_header: |
211 | APP_HEADER_01 APP_HEADER_01 |
Line 51... | Line -... | ||
51 | virtual at ebx |
- | |
52 | APP_HEADER_01 APP_HEADER_01 |
212 | end virtual |
53 | end virtual |
- | |
54 | 213 | ||
55 | cmp [ebx+6],word '01' |
- | |
56 | jne .no_01_header |
- | |
57 | - | ||
58 | mov eax,[APP_HEADER_01.start] |
- | |
59 | mov [app_start],eax |
- | |
60 | mov eax,[APP_HEADER_01.i_end] |
- | |
61 | mov [app_i_end],eax |
- | |
62 | mov eax,[APP_HEADER_01.mem_size] |
- | |
Line -... | Line 214... | ||
- | 214 | cmp dword [eax], 'MENU' |
|
- | 215 | jne .fail |
|
- | 216 | cmp word [eax+4],'ET' |
|
- | 217 | jne .fail |
|
63 | mov [app_mem],eax |
218 | |
- | 219 | cmp [eax+6], word '00' |
|
- | 220 | jne .check_01_header |
|
- | 221 | ||
- | 222 | mov ecx,[APP_HEADER_00.start] |
|
- | 223 | mov [ebx+0x08], ecx ;app_eip |
|
64 | mov eax,[APP_HEADER_01.stack_top] |
224 | mov edx,[APP_HEADER_00.mem_size] |
Line 65... | Line 225... | ||
65 | mov [app_esp],eax |
225 | mov [ebx+0x10], edx ;app_mem |
- | 226 | shr edx,1 |
|
- | 227 | sub edx,0x10 |
|
- | 228 | mov [ebx+0x0C], edx ;app_esp |
|
Line -... | Line 229... | ||
- | 229 | mov ecx,[APP_HEADER_00.i_param] |
|
- | 230 | mov [ebx], ecx ;app_cmdline |
|
- | 231 | mov [ebx+4], dword 0 ;app_path |
|
- | 232 | ret |
|
- | 233 | ||
- | 234 | .check_01_header: |
|
- | 235 | ||
- | 236 | cmp [eax+6],word '01' |
|
- | 237 | jne .fail |
|
- | 238 | ||
- | 239 | mov ecx,[APP_HEADER_01.start] |
|
- | 240 | mov [ebx+0x08], ecx ;app_eip |
|
66 | mov eax,[APP_HEADER_01.i_param] |
241 | mov edx,[APP_HEADER_01.mem_size] |
67 | mov [app_i_param],eax |
242 | mov [ebx+0x10], edx ;app_mem |
68 | mov eax,[APP_HEADER_01.i_icon] |
- | |
Line 69... | Line 243... | ||
69 | mov [app_i_icon],eax |
243 | mov ecx,[APP_HEADER_01.stack_top] |
70 | 244 | mov [ebx+0x0C], ecx ;app_esp |
|
71 | mov eax,1 |
245 | mov edx,[APP_HEADER_01.i_param] |
72 | ret |
246 | mov [ebx], edx ;app_cmdline |
Line 397... | Line 571... | ||
397 | mov eax, TMP_FILE_NAME |
571 | mov eax, TMP_FILE_NAME |
398 | add eax, [tmp_task_data] |
572 | add eax, [tmp_task_data] |
399 | mov ebx, [tmp_task_data] ;cmd line |
573 | mov ebx, [tmp_task_data] ;cmd line |
400 | add ebx, TMP_CMD_LINE |
574 | add ebx, TMP_CMD_LINE |
Line -... | Line 575... | ||
- | 575 | ||
- | 576 | stdcall fs_exec_EX, eax, ebx, [flags] |
|
401 | 577 | ||
402 | stdcall fs_exec, eax, ebx, [flags], [ebp+8],\ |
578 | ; stdcall fs_exec, eax, ebx, [flags], [ebp+8],\ |
403 | [ebp+12], [ebp+16],[ebp+20] |
579 | ; [ebp+12], [ebp+16],[ebp+20] |
404 | mov [retval], eax |
580 | mov [retval], eax |
405 | popad |
581 | popad |
406 | mov [pg_data.tmp_task_mutex], 0 |
582 | mov [pg_data.tmp_task_mutex], 0 |
407 | mov eax, [retval] |
583 | mov eax, [retval] |
Line 408... | Line 584... | ||
408 | ret |
584 | ret |
Line 409... | Line -... | ||
409 | - | ||
410 | endp |
- | |
411 | - | ||
412 | align 4 |
- | |
413 | proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword,\ |
- | |
414 | fn_read:dword, file_size:dword,\ |
- | |
415 | cluster:dword, some_data:dword |
- | |
416 | - | ||
417 | locals |
- | |
418 | slot dd ? |
- | |
419 | app_path_size dd ? |
- | |
420 | save_cr3 dd ? |
- | |
421 | img_size dd ? |
- | |
422 | endl |
- | |
423 | - | ||
424 | ; check filename length - with terminating NULL must be no more than 1024 symbols |
- | |
425 | - | ||
426 | mov edi, [file_name] |
- | |
427 | mov ecx, 1024 |
- | |
428 | xor eax, eax |
- | |
429 | repnz scasb |
- | |
430 | jz @f |
- | |
431 | mov eax, -ERROR_FILE_NOT_FOUND |
- | |
432 | ret |
- | |
433 | @@: |
- | |
434 | sub edi, [file_name] |
- | |
435 | mov [app_path_size], edi |
- | |
436 | - | ||
437 | mov esi, new_process_loading |
- | |
438 | call sys_msg_board_str ; write message to message board |
- | |
439 | - | ||
440 | pushfd |
- | |
441 | cli |
- | |
442 | - | ||
443 | .wait_lock: |
- | |
444 | cmp [application_table_status],0 |
- | |
445 | je .get_lock |
- | |
446 | call change_task |
- | |
447 | jmp .wait_lock |
- | |
448 | - | ||
449 | .get_lock: |
- | |
450 | mov eax, 1 |
- | |
451 | xchg eax, [application_table_status] |
- | |
452 | cmp eax, 0 |
- | |
453 | jne .wait_lock |
- | |
454 | - | ||
455 | call set_application_table_status |
- | |
456 | - | ||
457 | call get_new_process_place |
- | |
458 | test eax, eax |
- | |
459 | mov ecx, -0x20 ; too many processes |
- | |
460 | jz .err |
- | |
461 | mov [slot], eax |
- | |
462 | - | ||
463 | mov edi,eax |
- | |
464 | shl edi,8 |
- | |
465 | add edi,PROC_BASE |
- | |
466 | mov ecx,256/4 |
- | |
467 | xor eax,eax |
- | |
468 | cld |
- | |
469 | rep stosd ;clean extended information about process |
- | |
470 | - | ||
471 | ; write application name |
- | |
472 | - | ||
473 | mov edi, [file_name] |
- | |
474 | mov ecx, [app_path_size] |
- | |
475 | add edi, ecx |
- | |
476 | dec edi |
- | |
477 | std |
- | |
478 | mov al, '/' |
- | |
479 | repnz scasb |
- | |
480 | cld |
- | |
481 | jnz @f |
- | |
482 | inc edi |
- | |
483 | @@: |
- | |
484 | inc edi |
- | |
485 | ; now edi points to name without path |
- | |
486 | - | ||
487 | mov esi, edi |
- | |
488 | mov ecx, 8 ; 8 chars for name |
- | |
489 | mov edi, [slot] |
- | |
490 | shl edi, cl |
- | |
491 | add edi, PROC_BASE |
- | |
492 | .copy_process_name_loop: |
- | |
493 | lodsb |
- | |
494 | cmp al, '.' |
- | |
495 | jz .copy_process_name_done |
- | |
496 | test al, al |
- | |
497 | jz .copy_process_name_done |
- | |
498 | stosb |
- | |
499 | loop .copy_process_name_loop |
- | |
500 | .copy_process_name_done: |
- | |
501 | mov al, ' ' |
- | |
502 | rep stosb |
- | |
503 | pop eax |
- | |
504 | mov cl, 3 ; 3 chars for extension |
- | |
505 | dec esi |
- | |
506 | @@: |
- | |
507 | dec eax |
- | |
508 | cmp eax, esi |
- | |
509 | jbe .copy_process_ext_done |
- | |
510 | cmp byte [eax], '.' |
- | |
511 | jnz @b |
- | |
512 | lea esi, [eax+1] |
- | |
513 | .copy_process_ext_loop: |
- | |
514 | lodsb |
- | |
515 | test al, al |
- | |
516 | jz .copy_process_ext_done |
- | |
517 | stosb |
- | |
518 | loop .copy_process_ext_loop |
- | |
519 | .copy_process_ext_done: |
- | |
520 | mov al, ' ' |
- | |
521 | rep stosb |
- | |
522 | - | ||
523 | ; read header |
- | |
524 | lea eax, [file_size] |
- | |
525 | mov ebx, [eax] |
- | |
526 | mov [img_size], ebx |
- | |
527 | mov edi, TMP_BUFF |
- | |
528 | call [fn_read] |
- | |
529 | - | ||
530 | test eax, eax |
- | |
531 | jnz .err |
- | |
532 | - | ||
533 | ; check menuet signature |
- | |
534 | - | ||
535 | mov ecx, -0x1F |
- | |
536 | ;check MENUET signature |
- | |
537 | cmp [TMP_BUFF],dword 'MENU' |
- | |
538 | jnz .err |
- | |
539 | cmp [TMP_BUFF+4],word 'ET' |
- | |
540 | jnz .err |
- | |
541 | - | ||
542 | stdcall test_app_header, TMP_BUFF |
- | |
543 | test eax, eax |
- | |
544 | jz .err |
- | |
545 | - | ||
546 | mov eax, cr3 |
- | |
547 | mov [save_cr3], eax |
- | |
548 | if GREEDY_KERNEL |
- | |
549 | stdcall create_app_space,[app_mem],[img_size] |
- | |
550 | else |
- | |
551 | stdcall create_app_space,[app_mem],[app_mem] |
- | |
552 | end if |
- | |
553 | test eax, eax |
- | |
554 | jz .failed |
- | |
555 | - | ||
556 | mov ebx,[slot] |
- | |
557 | shl ebx,8 |
- | |
558 | mov [PROC_BASE+ebx+0xB8],eax |
- | |
559 | - | ||
560 | mov esi, TMP_BUFF |
- | |
561 | mov edi, new_app_base |
- | |
562 | mov ecx, 512/4 |
- | |
563 | cld |
- | |
564 | rep movsd |
- | |
565 | - | ||
566 | ;read file |
- | |
567 | @@: |
- | |
568 | lea eax, [file_size] |
- | |
569 | cmp dword [eax], 0 |
- | |
570 | jz .done |
- | |
571 | push edi |
- | |
572 | call [fn_read] |
- | |
573 | pop edi |
- | |
574 | add edi, 512 |
- | |
575 | test eax, eax |
- | |
576 | jz @b |
- | |
577 | cmp ebx, 6 |
- | |
578 | jne .failed |
- | |
579 | .done: |
- | |
580 | stdcall add_app_parameters, [slot], new_app_base,\ |
- | |
581 | [cmd_line],[file_name],[flags] |
- | |
582 | - | ||
583 | mov eax, [save_cr3] |
- | |
584 | call set_cr3 |
- | |
585 | - | ||
586 | xor eax, eax |
- | |
587 | mov [application_table_status],eax ;unlock application_table_status mutex |
- | |
588 | popfd |
- | |
589 | mov eax,[process_number] ;set result |
- | |
590 | ret |
- | |
591 | - | ||
592 | .failed: |
- | |
593 | mov eax, [save_cr3] |
- | |
594 | call set_cr3 |
- | |
595 | .err: |
- | |
596 | - | ||
597 | popfd |
- | |
598 | xor eax, eax |
- | |
599 | mov [application_table_status],eax |
- | |
600 | ret |
- | |
601 | endp |
- | |
602 | - | ||
603 | align 4 |
- | |
604 | proc add_app_parameters stdcall,slot:dword,img_base:dword,\ |
- | |
605 | cmd_line:dword, app_path:dword, flags:dword |
- | |
606 | - | ||
607 | mov edi, [slot] |
- | |
608 | mov esi, [fpu_data] |
- | |
609 | bt [cpu_caps], CAPS_SSE |
- | |
610 | jnc .no_SSE |
- | |
611 | - | ||
612 | shl edi, 8 |
- | |
613 | mov eax, edi |
- | |
614 | lea edi, [esi+edi*2] |
- | |
615 | mov [eax+PROC_BASE+APPDATA.fpu_state], edi |
- | |
616 | mov [eax+PROC_BASE+APPDATA.fpu_handler], 0 |
- | |
617 | mov [eax+PROC_BASE+APPDATA.sse_handler], 0 |
- | |
618 | mov ecx, 512/4 |
- | |
619 | jmp @F |
- | |
620 | .no_SSE: |
- | |
621 | mov eax, edi |
- | |
622 | shl eax, 8 |
- | |
623 | mov ebx, edi |
- | |
624 | shl edi, 7 |
- | |
625 | shl ebx, 4 |
- | |
626 | sub edi, ebx ;edi*=112 |
- | |
627 | add edi, esi |
- | |
628 | mov [eax+PROC_BASE+APPDATA.fpu_state], edi |
- | |
629 | mov [eax+PROC_BASE+APPDATA.fpu_handler], 0 |
- | |
630 | mov [eax+PROC_BASE+APPDATA.sse_handler], 0 |
- | |
631 | mov ecx, 112/4 |
- | |
632 | @@: |
- | |
633 | rep movsd |
- | |
634 | - | ||
635 | mov ebx,[slot] |
- | |
636 | cmp ebx,[TASK_COUNT] |
- | |
637 | jle .noinc |
- | |
638 | inc dword [TASK_COUNT] ;update number of processes |
- | |
639 | .noinc: |
- | |
640 | shl ebx,8 |
- | |
641 | mov eax,[app_mem] |
- | |
642 | mov [PROC_BASE+APPDATA.mem_size+ebx],eax |
- | |
643 | - | ||
644 | mov ecx, [def_cursor] |
- | |
645 | mov [PROC_BASE+APPDATA.cursor+ebx],ecx |
- | |
646 | - | ||
647 | shr ebx,3 |
- | |
648 | mov eax, new_app_base |
- | |
649 | mov dword [CURRENT_TASK+ebx+0x10],eax |
- | |
650 | - | ||
651 | .add_command_line: |
- | |
652 | mov edx,[app_i_param] |
- | |
653 | test edx,edx |
- | |
654 | jz .no_command_line ;application don't need parameters |
- | |
655 | mov eax,[cmd_line] |
- | |
656 | test eax,eax |
- | |
657 | jz .no_command_line ;no parameters specified |
- | |
658 | ;calculate parameter length |
- | |
659 | xor ecx,ecx |
- | |
660 | .command_line_len: |
- | |
661 | cmp byte [eax],0 |
- | |
662 | jz .command_line_len_end |
- | |
663 | inc eax |
- | |
664 | inc ecx |
- | |
665 | cmp ecx,255 |
- | |
666 | jl .command_line_len |
- | |
667 | - | ||
668 | .command_line_len_end: |
- | |
669 | ;ecx - parameter length |
- | |
670 | ;edx - address of parameters in new process address space |
- | |
671 | inc ecx |
- | |
672 | mov edi, [img_base] |
- | |
673 | add edi, edx |
- | |
674 | mov esi, [cmd_line] |
- | |
675 | rep movsb |
- | |
676 | - | ||
677 | .no_command_line: |
- | |
678 | - | ||
679 | mov edx,[app_i_icon] |
- | |
680 | test edx,edx |
- | |
681 | jz .no_command_line_1 ;application don't need path of file |
- | |
682 | mov esi,[app_path] |
- | |
683 | test esi, esi |
- | |
684 | jz .no_command_line_1 ;application don't need path of file |
- | |
685 | mov ecx, 64 |
- | |
686 | mov edi, [img_base] |
- | |
687 | add edi, edx |
- | |
688 | rep movsb |
- | |
689 | - | ||
690 | .no_command_line_1: |
- | |
691 | mov ebx,[slot] |
- | |
692 | mov eax,ebx |
- | |
693 | shl ebx,5 |
- | |
694 | ; set window state to 'normal' (non-minimized/maximized/rolled-up) state |
- | |
695 | mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL |
- | |
696 | mov [ebx+window_data+WDATA.fl_redraw], 1 |
- | |
697 | add ebx,CURRENT_TASK ;ebx - pointer to information about process |
- | |
698 | mov [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot |
- | |
699 | - | ||
700 | mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function) |
- | |
701 | - | ||
702 | inc dword [process_number] |
- | |
703 | mov eax,[process_number] |
- | |
704 | mov [ebx+4],eax ;set PID |
- | |
705 | - | ||
706 | mov ecx,ebx |
- | |
707 | add ecx,(draw_data-CURRENT_TASK) ;ecx - pointer to draw data |
- | |
708 | ;set draw data to full screen |
- | |
709 | - | ||
710 | mov [ecx+0],dword 0 |
- | |
711 | mov [ecx+4],dword 0 |
- | |
712 | mov eax,[SCR_X_SIZE] |
- | |
713 | mov [ecx+8],eax |
- | |
714 | mov eax,[SCR_Y_SIZE] |
- | |
715 | mov [ecx+12],eax |
- | |
716 | ;set cr3 register in TSS of application |
- | |
717 | - | ||
718 | mov ecx,[slot] |
- | |
719 | shl ecx,8 |
- | |
720 | mov eax,[PROC_BASE+0xB8+ecx] |
- | |
721 | ;or eax, PG_NOCACHE |
- | |
722 | mov [l.cr3],eax |
- | |
723 | - | ||
724 | mov eax,[app_start] |
- | |
725 | mov [l.eip],eax ;set eip in TSS |
- | |
726 | mov eax,[app_esp] |
- | |
727 | mov [l.esp],eax ;set stack in TSS |
- | |
728 | - | ||
729 | ;gdt |
- | |
730 | mov ax,app_code ;ax - selector of code segment |
- | |
731 | mov [l.cs],ax |
- | |
732 | mov ax,app_data |
- | |
733 | mov [l.ss],ax |
- | |
734 | mov [l.ds],ax |
- | |
735 | mov [l.es],ax |
- | |
736 | mov [l.fs],ax |
- | |
737 | mov ax,graph_data ;ax - selector of graphic segment |
- | |
738 | mov [l.gs],ax |
- | |
739 | mov [l.io],word 128 |
- | |
740 | mov [l.eflags],dword 0x1202 |
- | |
741 | - | ||
742 | mov [l.ss0],os_data |
- | |
743 | mov ebx,[slot] |
- | |
744 | shl ebx,12 |
- | |
745 | add ebx,sysint_stack_data+4096 |
- | |
746 | mov [l.esp0],ebx |
- | |
747 | - | ||
748 | ;copy tss to it place |
- | |
749 | mov eax,tss_sceleton |
- | |
750 | mov ebx,[slot] |
- | |
751 | imul ebx,tss_step |
- | |
752 | add ebx,tss_data ;ebx - address of application TSS |
- | |
753 | mov ecx,120 |
- | |
754 | call memmove |
- | |
755 | - | ||
756 | ;Add IO access table - bit array of permitted ports |
- | |
757 | or eax,-1 |
- | |
758 | mov edi,[slot] |
- | |
759 | imul edi,tss_step |
- | |
760 | add edi,tss_data+128 |
- | |
761 | mov ecx,2048 |
- | |
762 | cld |
- | |
763 | rep stosd ;full access to 2048*8=16384 ports |
- | |
764 | - | ||
765 | mov ecx,ebx ;ecx - address of application TSS |
- | |
766 | mov edi,[slot] |
- | |
767 | shl edi,3 |
- | |
768 | ;set TSS descriptor |
- | |
769 | mov [edi+gdts+tss0+0],word tss_step ;limit (size) |
- | |
770 | mov [edi+gdts+tss0+2],cx ;part of offset |
- | |
771 | mov eax,ecx |
- | |
772 | shr eax,16 |
- | |
773 | mov [edi+gdts+tss0+4],al ;part of offset |
- | |
774 | mov [edi+gdts+tss0+7],ah ;part of offset |
- | |
775 | mov [edi+gdts+tss0+5],word 01010000b*256+11101001b ;system flags |
- | |
776 | - | ||
777 | ;flush keyboard and buttons queue |
- | |
778 | mov [KEY_COUNT],byte 0 |
- | |
779 | mov [BTN_COUNT],byte 0 |
- | |
780 | - | ||
781 | mov edi,[slot] |
- | |
782 | shl edi,5 |
- | |
783 | add edi,window_data |
- | |
784 | mov ebx,[slot] |
- | |
785 | movzx esi,word [WIN_STACK+ebx*2] |
- | |
786 | lea esi,[WIN_POS+esi*2] |
- | |
787 | call windowactivate ;gui initialization |
- | |
788 | - | ||
789 | mov ebx,[slot] |
- | |
790 | shl ebx,5 |
- | |
791 | mov [CURRENT_TASK+ebx+0xa],byte 0 ;set process state - running |
- | |
792 | ; set if debuggee |
- | |
793 | mov eax, [flags] |
- | |
794 | test byte [flags], 1 |
- | |
795 | jz .no_debug |
- | |
796 | mov [CURRENT_TASK+ebx+0xa],byte 1 ;set process state - suspended |
- | |
797 | mov eax,[CURRENT_TASK] |
- | |
798 | mov [PROC_BASE+ebx*8+0xac],eax ;set debugger PID - current |
- | |
799 | .no_debug: |
- | |
800 | - | ||
801 | mov esi,new_process_running |
- | |
802 | call sys_msg_board_str ;output information about succefull startup |
- | |
Line 803... | Line 585... | ||
803 | 585 | ||
804 | ret |
586 | endp |
805 | endp |
587 | |
806 | 588 | ||
Line 1052... | Line 834... | ||
1052 | popad |
834 | popad |
1053 | mov eax, [w_count] |
835 | mov eax, [w_count] |
1054 | ret |
836 | ret |
1055 | endp |
837 | endp |
Line 1056... | Line -... | ||
1056 | - | ||
1057 | 838 | ||
1058 | align 4 |
839 | align 4 |
1059 | proc new_sys_threads |
840 | proc new_sys_threads |
1060 | locals |
- | |
1061 | thread_start dd ? |
- | |
1062 | thread_stack dd ? |
- | |
1063 | params dd ? |
841 | locals |
- | 842 | slot dd ? |
|
- | 843 | app_cmdline dd ? ;0x00 |
|
- | 844 | app_path dd ? ;0x04 |
|
- | 845 | app_eip dd ? ;0x08 |
|
- | 846 | app_esp dd ? ;0x0C |
|
1064 | slot dd ? |
847 | app_mem dd ? ;0x10 |
Line 1065... | Line 848... | ||
1065 | endl |
848 | endl |
1066 | 849 | ||
1067 | mov [thread_start], ebx |
- | |
Line 1068... | Line 850... | ||
1068 | mov [thread_stack], ecx |
850 | cmp eax,1 |
- | 851 | jne .failed ;other subfunctions |
|
- | 852 | ||
- | 853 | xor eax,eax |
|
- | 854 | mov [app_cmdline], eax |
|
Line 1069... | Line -... | ||
1069 | mov [params], 0 |
- | |
1070 | - | ||
1071 | xor edx,edx ; flags=0 |
855 | mov [app_path], eax |
1072 | 856 | mov [app_eip], ebx |
|
1073 | cmp eax,1 |
- | |
1074 | jnz .failed ;other subfunctions |
857 | mov [app_esp], ecx |
1075 | mov esi,new_process_loading |
858 | |
1076 | call sys_msg_board_str |
859 | mov esi,new_process_loading |
1077 | 860 | call sys_msg_board_str |
|
1078 | .wait_lock: |
861 | .wait_lock: |
Line 1093... | Line 876... | ||
1093 | test eax, eax |
876 | test eax, eax |
1094 | jz .failed |
877 | jz .failed |
Line 1095... | Line 878... | ||
1095 | 878 | ||
Line 1096... | Line -... | ||
1096 | mov [slot], eax |
- | |
1097 | - | ||
1098 | xor eax,eax |
- | |
1099 | mov [app_i_param],eax |
- | |
1100 | mov [app_i_icon],eax |
- | |
1101 | - | ||
1102 | mov ebx, [thread_start] |
- | |
1103 | mov ecx, [thread_stack] |
- | |
1104 | - | ||
1105 | mov [app_start],ebx |
- | |
1106 | mov [app_esp],ecx |
879 | mov [slot], eax |
1107 | 880 | ||
1108 | mov esi,[CURRENT_TASK] |
881 | mov esi,[CURRENT_TASK] |
1109 | shl esi,8 |
882 | shl esi,8 |
Line 1110... | Line 883... | ||
1110 | add esi,PROC_BASE |
883 | add esi,PROC_BASE |
1111 | mov ebx,esi ;ebx=esi - pointer to extended information about current thread |
884 | mov ebx,esi ;ebx=esi - pointer to extended information about current thread |
1112 | 885 | ||
1113 | mov edi,[slot] |
886 | mov edi, eax |
1114 | shl edi,8 |
887 | shl edi,8 |
- | 888 | add edi,PROC_BASE |
|
- | 889 | mov edx,edi ;edx=edi - pointer to extended infomation about new thread |
|
1115 | add edi,PROC_BASE |
890 | mov ecx,256/4 |
- | 891 | xor eax, eax |
|
1116 | mov edx,edi ;edx=edi - pointer to extended infomation about new thread |
892 | cld |
1117 | mov ecx,256/4 |
893 | rep stosd ;clean extended information about new thread |
1118 | rep stosd ;clean extended information about new thread |
894 | mov esi,ebx |
- | 895 | mov edi,edx |
|
1119 | mov edi,edx |
896 | mov ecx,11 |
1120 | mov ecx,11 |
897 | rep movsb ;copy process name |
- | 898 | ||
1121 | rep movsb ;copy process name |
899 | mov eax,[ebx+APPDATA.heap_base] |
1122 | mov eax,[ebx+APPDATA.heap_base] |
900 | mov [edx+APPDATA.heap_base], eax |
- | 901 | ||
1123 | mov [edx+APPDATA.heap_base], eax |
902 | mov ecx,[ebx+APPDATA.heap_top] |
1124 | mov ecx,[ebx+APPDATA.heap_top] |
- | |
1125 | mov [edx+APPDATA.heap_top], ecx |
903 | mov [edx+APPDATA.heap_top], ecx |
1126 | mov eax,[ebx+APPDATA.mem_size] |
- | |
Line -... | Line 904... | ||
- | 904 | ||
- | 905 | mov eax,[ebx+APPDATA.mem_size] |
|
- | 906 | mov [edx+APPDATA.mem_size], eax |
|
- | 907 | ||
1127 | mov [app_mem],eax ;set memory size |
908 | mov ecx,[ebx+APPDATA.dir_table] |
1128 | mov eax,[ebx+0xb8] |
909 | mov [edx+APPDATA.dir_table],ecx ;copy page directory |
Line 1129... | Line 910... | ||
1129 | mov [edx+0xb8],eax ;copy page directory |
910 | |
1130 | 911 | lea eax, [app_cmdline] |
|
Line 1131... | Line 912... | ||
1131 | stdcall add_app_parameters, [slot], new_app_base,\ |
912 | stdcall set_app_params ,[slot],eax,dword 0,\ |
Line 1160... | Line 941... | ||
1160 | test eax, eax |
941 | test eax, eax |
1161 | jnz .wait_lock |
942 | jnz .wait_lock |
1162 | ret |
943 | ret |
1163 | endp |
944 | endp |
Line -... | Line 945... | ||
- | 945 | ||
- | 946 | align 4 |
|
- | 947 | proc set_app_params stdcall,slot:dword, params:dword,\ |
|
- | 948 | cmd_line:dword, app_path:dword, flags:dword |
|
- | 949 | ||
- | 950 | mov edi, [slot] |
|
- | 951 | mov esi, [fpu_data] |
|
- | 952 | bt [cpu_caps], CAPS_SSE |
|
- | 953 | jnc .no_SSE |
|
- | 954 | ||
- | 955 | shl edi, 8 |
|
- | 956 | mov eax, edi |
|
- | 957 | lea edi, [esi+edi*2] |
|
- | 958 | mov [eax+PROC_BASE+APPDATA.fpu_state], edi |
|
- | 959 | mov [eax+PROC_BASE+APPDATA.fpu_handler], 0 |
|
- | 960 | mov [eax+PROC_BASE+APPDATA.sse_handler], 0 |
|
- | 961 | mov ecx, 512/4 |
|
- | 962 | jmp @F |
|
- | 963 | .no_SSE: |
|
- | 964 | mov eax, edi |
|
- | 965 | shl eax, 8 |
|
- | 966 | mov ebx, edi |
|
- | 967 | shl edi, 7 |
|
- | 968 | shl ebx, 4 |
|
- | 969 | sub edi, ebx ;edi*=112 |
|
- | 970 | add edi, esi |
|
- | 971 | mov [eax+PROC_BASE+APPDATA.fpu_state], edi |
|
- | 972 | mov [eax+PROC_BASE+APPDATA.fpu_handler], 0 |
|
- | 973 | mov [eax+PROC_BASE+APPDATA.sse_handler], 0 |
|
- | 974 | mov ecx, 112/4 |
|
- | 975 | @@: |
|
- | 976 | rep movsd |
|
- | 977 | ||
- | 978 | mov ebx,[slot] |
|
- | 979 | cmp ebx,[TASK_COUNT] |
|
- | 980 | jle .noinc |
|
- | 981 | inc dword [TASK_COUNT] ;update number of processes |
|
- | 982 | .noinc: |
|
- | 983 | shl ebx,8 |
|
- | 984 | mov ecx, [def_cursor] |
|
- | 985 | mov [PROC_BASE+APPDATA.cursor+ebx],ecx |
|
- | 986 | ||
- | 987 | shr ebx,3 |
|
- | 988 | mov eax, new_app_base |
|
- | 989 | mov dword [CURRENT_TASK+ebx+0x10],eax |
|
- | 990 | ||
- | 991 | .add_command_line: |
|
- | 992 | mov edx,[params] |
|
- | 993 | mov edx,[edx] ;app_cmdline |
|
- | 994 | test edx,edx |
|
- | 995 | jz @F ;application don't need parameters |
|
- | 996 | add edx, new_app_base |
|
- | 997 | stdcall k_strncpy, edx, [cmd_line], 255 |
|
- | 998 | @@: |
|
- | 999 | mov edx,[params] |
|
- | 1000 | mov edx, [edx+4] ;app_path |
|
- | 1001 | test edx,edx |
|
- | 1002 | jz @F ;application don't need path of file |
|
- | 1003 | add edx, new_app_base |
|
- | 1004 | stdcall k_strncpy, edx, [app_path], 64 |
|
- | 1005 | @@: |
|
- | 1006 | mov ebx,[slot] |
|
- | 1007 | mov eax,ebx |
|
- | 1008 | shl ebx,5 |
|
- | 1009 | ; set window state to 'normal' (non-minimized/maximized/rolled-up) state |
|
- | 1010 | mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL |
|
- | 1011 | mov [ebx+window_data+WDATA.fl_redraw], 1 |
|
- | 1012 | add ebx,CURRENT_TASK ;ebx - pointer to information about process |
|
- | 1013 | mov [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot |
|
- | 1014 | ||
- | 1015 | mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function) |
|
- | 1016 | ||
- | 1017 | inc dword [process_number] |
|
- | 1018 | mov eax,[process_number] |
|
- | 1019 | mov [ebx+4],eax ;set PID |
|
- | 1020 | ||
- | 1021 | mov ecx,ebx |
|
- | 1022 | add ecx,(draw_data-CURRENT_TASK) ;ecx - pointer to draw data |
|
- | 1023 | ;set draw data to full screen |
|
- | 1024 | ||
- | 1025 | mov [ecx+0],dword 0 |
|
- | 1026 | mov [ecx+4],dword 0 |
|
- | 1027 | mov eax,[SCR_X_SIZE] |
|
- | 1028 | mov [ecx+8],eax |
|
- | 1029 | mov eax,[SCR_Y_SIZE] |
|
- | 1030 | mov [ecx+12],eax |
|
- | 1031 | ||
- | 1032 | mov edi,[slot] |
|
- | 1033 | imul edi,tss_step |
|
- | 1034 | add edi,tss_data |
|
- | 1035 | mov ecx,128/4 |
|
- | 1036 | xor eax, eax |
|
- | 1037 | cld |
|
- | 1038 | rep stosd |
|
- | 1039 | ;Add IO access table - bit array of permitted ports |
|
- | 1040 | not eax |
|
- | 1041 | mov ecx,2048 |
|
- | 1042 | rep stosd ; access to 4096*8=65536 ports |
|
- | 1043 | sub edi, tss_step |
|
- | 1044 | ||
- | 1045 | ;set cr3 register in TSS of application |
|
- | 1046 | mov ecx, [slot] |
|
- | 1047 | shl ecx, 8 |
|
- | 1048 | mov eax,[PROC_BASE+ecx+APPDATA.dir_table] |
|
- | 1049 | mov [edi+TSS._cr3],eax |
|
- | 1050 | ||
- | 1051 | mov esi,[params] |
|
- | 1052 | mov eax, [esi+0x08] ;app_eip |
|
- | 1053 | mov [edi+TSS._eip],eax ;set eip in TSS |
|
- | 1054 | mov eax, [esi+0x0C] ;app_esp |
|
- | 1055 | mov [edi+TSS._esp],eax ;set stack in TSS |
|
- | 1056 | mov [edi+TSS._eflags],dword 0x1202 |
|
- | 1057 | ||
- | 1058 | mov [edi+TSS._cs],app_code ;selector of code segment |
|
- | 1059 | mov [edi+TSS._ss],app_data |
|
- | 1060 | mov [edi+TSS._ds],app_data |
|
- | 1061 | mov [edi+TSS._es],app_data |
|
- | 1062 | mov [edi+TSS._fs],app_data |
|
- | 1063 | mov [edi+TSS._gs],graph_data ;selector of graphic segment |
|
- | 1064 | mov [edi+TSS._io],word 128 |
|
- | 1065 | mov [edi+TSS._ss0], os_data |
|
- | 1066 | mov ebx,[slot] |
|
- | 1067 | shl ebx,12 |
|
- | 1068 | add ebx,sysint_stack_data+4096 |
|
- | 1069 | mov [edi+TSS._esp0],ebx |
|
- | 1070 | ||
- | 1071 | mov ecx, edi ;ecx - address of application TSS |
|
- | 1072 | mov ebx,[slot] |
|
- | 1073 | shl ebx,3 |
|
- | 1074 | ;set TSS descriptor |
|
- | 1075 | mov [ebx+gdts+tss0+0],word tss_step ;limit (size) |
|
- | 1076 | mov [ebx+gdts+tss0+2],cx ;part of offset |
|
- | 1077 | shr ecx,16 |
|
- | 1078 | mov [ebx+gdts+tss0+4],cl ;part of offset |
|
- | 1079 | mov [ebx+gdts+tss0+7],ch ;part of offset |
|
- | 1080 | mov [ebx+gdts+tss0+5],word 01010000b*256+11101001b ;system flags |
|
- | 1081 | ||
- | 1082 | ;flush keyboard and buttons queue |
|
- | 1083 | mov [KEY_COUNT],byte 0 |
|
- | 1084 | mov [BTN_COUNT],byte 0 |
|
- | 1085 | ||
- | 1086 | mov edi,[slot] |
|
- | 1087 | shl edi,5 |
|
- | 1088 | add edi,window_data |
|
- | 1089 | mov ebx,[slot] |
|
- | 1090 | movzx esi,word [WIN_STACK+ebx*2] |
|
- | 1091 | lea esi,[WIN_POS+esi*2] |
|
- | 1092 | call windowactivate ;gui initialization |
|
- | 1093 | ||
- | 1094 | mov ebx,[slot] |
|
- | 1095 | shl ebx,5 |
|
- | 1096 | mov [CURRENT_TASK+ebx+0xa],byte 0 ;set process state - running |
|
- | 1097 | ; set if debuggee |
|
- | 1098 | mov eax, [flags] |
|
- | 1099 | test byte [flags], 1 |
|
- | 1100 | jz .no_debug |
|
- | 1101 | mov [CURRENT_TASK+ebx+0xa],byte 1 ;set process state - suspended |
|
- | 1102 | mov eax,[CURRENT_TASK] |
|
- | 1103 | mov [PROC_BASE+ebx*8+0xac],eax ;set debugger PID - current |
|
- | 1104 | .no_debug: |
|
- | 1105 | mov esi,new_process_running |
|
- | 1106 | call sys_msg_board_str ;output information about succefull startup |
|
- | 1107 | ret |
|
- | 1108 | endp |
|
- | 1109 | ||
Line 1164... | Line 1110... | ||
1164 | 1110 | ||
Line 1165... | Line 1111... | ||
1165 | 1111 | ||
1166 | include "debug.inc" |
1112 | include "debug.inc" |