Subversion Repositories Kolibri OS

Rev

Rev 6261 | Rev 6319 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 6317 $
  9.  
  10.  
  11. GREEDY_KERNEL  equ 0
  12.  
  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
  21.  
  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
  32.  
  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
  44. ends
  45.  
  46. macro _clear_ op
  47. {  mov ecx, op/4
  48.         xor     eax, eax
  49.         cld
  50.         rep stosd
  51. }
  52.  
  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.  
  63. fs_execute_from_sysdir:
  64.         xor     ebx, ebx
  65. fs_execute_from_sysdir_param:
  66.         xor     edx, edx
  67.  
  68. align 4
  69. proc fs_execute
  70. ; ebx - cmdline
  71. ; edx - flags
  72. ; ebp - full filename
  73.  
  74.        locals
  75.          filename      rd 1
  76.          cmdline       rd 1
  77.          flags         rd 1
  78.  
  79.          slot          rd 1
  80.          slot_base     rd 1
  81.  
  82. ;app header data
  83.  
  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
  94.  
  95.        endl
  96.  
  97. xchg bx, bx
  98.         mov     eax, [ebp]
  99.         mov     [flags], edx
  100.         mov     [cmdline], ebx
  101.         mov     [filename], eax
  102.  
  103.         call    lock_application_table
  104.  
  105.         call    alloc_thread_slot
  106.         mov     esi, -0x20 ; too many processes
  107.         test    eax, eax
  108.         jz      .err_0
  109.  
  110.         mov     [slot], eax
  111.         shl     eax, 8
  112.         add     eax, SLOT_BASE
  113.         mov     [slot_base], eax
  114.  
  115.         mov     eax, [filename]
  116.         stdcall load_file, eax
  117.         mov     esi, -ERROR_FILE_NOT_FOUND
  118.         test    eax, eax
  119.         jz      .err_0
  120.  
  121.         mov     [file_base], eax
  122.         mov     [file_size], ebx
  123.  
  124.         lea     ebx, [hdr_cmdline]
  125.         call    test_app_header
  126.         mov     esi, -0x1F
  127.         test    eax, eax
  128.         jz      .err_hdr
  129.  
  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
  136.  
  137. ; write application name
  138.         lea     eax, [filename]
  139.         stdcall strrchr, eax, '/'  ; now eax points to name without path
  140.  
  141.         lea     esi, [eax+1]
  142.         test    eax, eax
  143.         jnz     @F
  144.         lea     esi, [filename]
  145. @@:
  146.         mov     ecx, 11 ; 11 chars for name! 8 - is old value!
  147.         mov     edi, [slot_base]
  148. .copy_process_name_loop:
  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
  156.  
  157. .copy_process_name_done:
  158.  
  159.         mov     edi, [cmdline]
  160.         xor     eax, eax
  161.         test    edi, edi
  162.         jz      @F
  163.  
  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.  
  174.         mov     esi, -30; no memory
  175.         test    eax, eax
  176.         jz      .err_hdr
  177.  
  178.         mov     ebx, [sys_proc+LHEAD.prev]
  179.         __list_add eax, ebx, sys_proc
  180.  
  181.         mov     ebx, [hdr_emem]
  182.         mov     [eax+PROC.mem_used], ebx
  183.  
  184.         mov     ebx, [slot_base]
  185.         mov     [ebx+APPDATA.process], eax
  186.  
  187.         lea     edx, [ebx+APPDATA.list]
  188.         lea     ecx, [eax+PROC.thr_list]
  189.         list_add_tail edx, ecx
  190.  
  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
  197.  
  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
  204.  
  205.         mov     esi, [filename]
  206.         mov     ecx, [filename_size]
  207.         rep movsb
  208.         mov     ecx, [cmdline_size]
  209.         mov     esi, [cmdline]
  210.         rep movsb
  211.  
  212.         lea     eax, [hdr_cmdline]
  213.         stdcall set_app_params , [slot], eax, [flags]
  214.  
  215.         mov     eax, [process_number]       ;set result
  216.         call    unlock_application_table
  217.         ret
  218.  
  219. .err_hdr:
  220.         stdcall kernel_free, [file_base]
  221. .err_0:
  222.         call    unlock_application_table
  223.         mov     eax, esi
  224.         ret
  225. endp
  226.  
  227. align 4
  228. test_app_header:
  229.        virtual at eax
  230.          APP_HEADER_00 APP_HEADER_00_
  231.        end virtual
  232.        virtual at eax
  233.          APP_HEADER_01 APP_HEADER_01_
  234.        end virtual
  235.  
  236.         cmp     dword [eax], 'MENU'
  237.         jne     .fail
  238.         cmp     word [eax+4], 'ET'
  239.         jne     .fail
  240.  
  241.         cmp     [eax+6], word '00'
  242.         jne     .check_01_header
  243.  
  244.         mov     ecx, [APP_HEADER_00.start]
  245.         mov     [ebx+APP_HDR.eip], ecx
  246.         mov     edx, [APP_HEADER_00.mem_size]
  247.         mov     [ebx+APP_HDR._emem], edx
  248.         shr     edx, 1
  249.         sub     edx, 0x10
  250.         mov     [ebx+APP_HDR.esp], edx
  251.         mov     ecx, [APP_HEADER_00.i_param]
  252.         mov     [ebx+APP_HDR.cmdline], ecx
  253.         mov     [ebx+APP_HDR.path], 0
  254.         mov     edx, [APP_HEADER_00.i_end]
  255.         mov     [ebx+APP_HDR._edata], edx
  256.         ret
  257.  
  258.  .check_01_header:
  259.  
  260.         cmp     [eax+6], word '01'
  261.         je      @f
  262.         cmp     [eax+6], word '02'
  263.         jne     .fail
  264. @@:
  265.         mov     ecx, [APP_HEADER_01.start]
  266.         mov     [ebx+0x08], ecx
  267.         mov     edx, [APP_HEADER_01.mem_size]
  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)
  272.         cmp     edx, [APP_HEADER_01.i_end]
  273.         jb      .fail
  274. ; \end{diamond}[20.08.2006]
  275.  
  276.         mov     [ebx+APP_HDR._emem], edx
  277.         mov     ecx, [APP_HEADER_01.stack_top]
  278.         mov     [ebx+APP_HDR.esp], ecx
  279.         mov     edx, [APP_HEADER_01.i_param]
  280.         mov     [ebx+APP_HDR.cmdline], edx
  281.         mov     ecx, [APP_HEADER_01.i_icon]
  282.         mov     [ebx+APP_HDR.path], ecx
  283.         mov     edx, [APP_HEADER_01.i_end]
  284.         mov     [ebx+APP_HDR._edata], edx
  285.         ret
  286. .fail:
  287.         xor     eax, eax
  288.         ret
  289.  
  290. align 4
  291. alloc_thread_slot:
  292. ;input:
  293. ;  none
  294. ;result:
  295. ;  eax=[new_thread_slot]<>0 - ok
  296. ;      0 - failed.
  297. ;This function find least empty slot.
  298. ;It doesn't increase [TASK_COUNT]!
  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
  312.         xor     eax, eax
  313.         ret
  314. .found:
  315.         btr     [edx], eax
  316.         sub     edx, thr_slot_map
  317.         lea     eax, [eax+edx*8]
  318.         popfd
  319.         ret
  320.  
  321.  
  322. align 4
  323. proc create_process stdcall, app_size:dword
  324.        locals
  325.          process     dd ?
  326.          app_tabs    dd ?
  327.        endl
  328.  
  329.         push    ebx
  330.         push    esi
  331.         push    edi
  332.  
  333.         xor     eax, eax
  334.         mov     [process], eax
  335.  
  336.         mov     eax, [app_size]
  337.         add     eax, 0x3FFFFF
  338.         shr     eax, 22
  339.         mov     [app_tabs], eax
  340.  
  341.         stdcall kernel_alloc, 0x2000
  342.         test    eax, eax
  343.         jz      .fail
  344.         mov     [process], eax
  345.  
  346.         lea     edi, [eax+PROC.heap_lock]
  347.         mov     ecx, (PROC.ht_free-PROC.heap_lock)/4
  348.  
  349.         list_init eax
  350.         add     eax, PROC.thr_list
  351.         list_init eax
  352.  
  353.         xor     eax, eax
  354.         cld
  355.         rep stosd
  356.  
  357.         mov     [edi], dword (PROC.pdt_0 - PROC.htab)/4 - 3
  358.         mov     [edi+4], dword 3           ;reserve handles for stdin stdout and stderr
  359.         mov     ecx, (PROC.pdt_0 - PROC.htab)/4
  360.         add     edi, 8
  361.         inc     eax
  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.  
  372.         mov     ecx, (OS_BASE shr 20)/4
  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)
  378.         rep movsd
  379.  
  380.         mov     eax, [edi-8192+PROC.pdt_0_phys]
  381.         or      eax, PG_SWR
  382.         mov     [edi-4096+(page_tabs shr 20)], eax
  383.  
  384. xchg bx, bx
  385.  
  386.         lea     edx, [edi-4096]
  387.         mov     esi, [app_tabs]
  388.  
  389. .alloc_page_dir:
  390.         call    alloc_page
  391.         test    eax, eax
  392.         jz      .fail
  393.         or      eax, PG_UWR
  394.         mov     [edx], eax
  395.  
  396.         mov     edi, [tmp_task_ptab]
  397.         stdcall map_page, edi, eax, PG_SWR
  398.         mov     ecx, 1024
  399.         xor     eax, eax
  400.         rep stosd
  401.  
  402.         add     edx, 4
  403.         dec     esi
  404.         jnz     .alloc_page_dir
  405.  
  406.         mov     eax, [process]
  407.  
  408.         pop     edi
  409.         pop     esi
  410.         pop     ebx
  411.         ret
  412.  
  413. .fail:
  414.         cmp     [process], 0
  415.         je      @f
  416. ;;        stdcall destroy_app_space, [dir_addr], 0
  417. @@:
  418.         xor     eax, eax
  419.         pop     edi
  420.         pop     esi
  421.         pop     ebx
  422.         ret
  423. endp
  424.  
  425. align 4
  426. set_cr3:
  427.         pushfd
  428.         cli
  429.         mov     ebx, [current_slot]
  430.         mov     [current_process], eax
  431.         mov     [ebx+APPDATA.process], eax
  432.         mov     eax, [eax+PROC.pdt_0_phys]
  433.         mov     cr3, eax
  434.         popfd
  435.         ret
  436.  
  437. align 4
  438. proc destroy_page_table stdcall, pg_tab:dword
  439.  
  440.         push    esi
  441.  
  442.         mov     esi, [pg_tab]
  443.         mov     ecx, 1024
  444. .free:
  445.         mov     eax, [esi]
  446.         test    eax, 1
  447.         jz      .next
  448.         test    eax, 2
  449.         jz      .next
  450.         test    eax, 1 shl 9
  451.         jnz     .next                     ;skip shared pages
  452.         call    free_page
  453. .next:
  454.         add     esi, 4
  455.         dec     ecx
  456.         jnz     .free
  457.         pop     esi
  458.         ret
  459. endp
  460.  
  461. align 4
  462. destroy_process: ;fastcall ecx= ptr to process
  463.  
  464.         lea     eax, [ecx+PROC.thr_list]
  465.         cmp     eax, [eax+LHEAD.next]
  466.         jne     .exit
  467.  
  468. align 4
  469. .internal:
  470.         push    ecx
  471.  
  472.         mov     esi, ecx
  473.         list_del esi
  474.  
  475.         mov     esi, [esi+PROC.dlls_list_ptr]
  476.         call    destroy_all_hdlls
  477.  
  478.         mov     esi, [esp]
  479.         add     esi, PROC.pdt_0
  480.         mov     edi, (0x80000000 shr 20)/4
  481. .destroy:
  482.         mov     eax, [esi]
  483.         test    eax, 1
  484.         jz      .next
  485.         and     eax, not 0xFFF
  486.         stdcall map_page, [tmp_task_ptab], eax, PG_SWR
  487.         stdcall destroy_page_table, [tmp_task_ptab]
  488.         mov     eax, [esi]
  489.         call    free_page
  490. .next:
  491.         add     esi, 4
  492.         dec     edi
  493.         jnz     .destroy
  494.  
  495.         call    kernel_free     ;ecx still in stack
  496.         stdcall map_page, [tmp_task_ptab], 0, PG_UNMAP
  497. .exit:
  498.         ret
  499.  
  500. align 4
  501. get_pid:
  502.         mov     eax, [TASK_BASE]
  503.         mov     eax, [eax+TASKDATA.pid]
  504.         ret
  505.  
  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.
  512.         push    ebx
  513.         push    ecx
  514.         mov     ebx, [TASK_COUNT]
  515.         shl     ebx, 5
  516.         mov     ecx, 2*32
  517.  
  518. .loop:
  519. ;ecx=offset of current process info entry
  520. ;ebx=maximum permitted offset
  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
  525. .endloop:
  526.         add     ecx, 32
  527.         cmp     ecx, ebx
  528.         jle     .loop
  529.  
  530.         pop     ecx
  531.         pop     ebx
  532.         xor     eax, eax
  533.         ret
  534.  
  535. .pid_found:
  536.         shr     ecx, 5
  537.         mov     eax, ecx ;convert offset to index of slot
  538.         pop     ecx
  539.         pop     ebx
  540.         ret
  541.  
  542. check_region:
  543. ;input:
  544. ;  esi - start of buffer
  545. ;  edx - size of buffer
  546. ;result:
  547. ;  eax = 1 region lays in app memory
  548. ;  eax = 0 region don't lays in app memory
  549.  
  550.         mov     eax, 1
  551.         ret
  552. if 0
  553.         mov     eax, [CURRENT_TASK]
  554. ;     jmp  check_process_region
  555. ;-----------------------------------------------------------------------------
  556. ;check_process_region:
  557. ;input:
  558. ;  eax - slot
  559. ;  esi - start of buffer
  560. ;  edx - size of buffer
  561. ;result:
  562. ;  eax = 1 region lays in app memory
  563. ;  eax = 0 region don't lays in app memory
  564.  
  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
  574.  
  575.         mov     eax, 1
  576.         ret
  577. .ok:
  578.         mov     eax, 1
  579.         ret
  580. .failed:
  581.         xor     eax, eax
  582.         ret
  583. end if
  584.  
  585. align 4
  586. proc read_process_memory
  587. ;Input:
  588. ;  eax - process slot
  589. ;  ecx - buffer address
  590. ;  edx - buffer size
  591. ;  esi - start address in other process
  592. ;Output:
  593. ;  eax - number of bytes read.
  594.        locals
  595.          slot   dd ?
  596.          buff   dd ?
  597.          r_count    dd ?
  598.          offset dd ?
  599.          tmp_r_cnt  dd ?
  600.        endl
  601.  
  602.         mov     [slot], eax
  603.         mov     [buff], ecx
  604.         and     [r_count], 0
  605.         mov     [tmp_r_cnt], edx
  606.         mov     [offset], esi
  607.  
  608.         pushad
  609. .read_mem:
  610.         mov     edx, [offset]
  611.         mov     ebx, [tmp_r_cnt]
  612.  
  613.         mov     ecx, 0x400000
  614.         and     edx, 0x3FFFFF
  615.         sub     ecx, edx
  616.         cmp     ecx, ebx
  617.         jbe     @f
  618.         mov     ecx, ebx
  619. @@:
  620.         cmp     ecx, 0x8000
  621.         jna     @F
  622.         mov     ecx, 0x8000
  623. @@:
  624.         mov     ebx, [offset]
  625.  
  626.         push    ecx
  627.         stdcall map_memEx, [proc_mem_map], \
  628.                 [slot], ebx, ecx, PG_READ
  629.         pop     ecx
  630.  
  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
  639. @@:
  640.         add     esi, [proc_mem_map]
  641.         mov     edi, [buff]
  642.         mov     edx, ecx
  643.         rep movsb
  644.         add     [r_count], edx
  645.  
  646.         add     [offset], edx
  647.         sub     [tmp_r_cnt], edx
  648.         jnz     .read_mem
  649. .ret:
  650.         popad
  651.         mov     eax, [r_count]
  652.         ret
  653. endp
  654.  
  655. align 4
  656. proc write_process_memory
  657. ;Input:
  658. ;  eax - process slot
  659. ;  ecx - buffer address
  660. ;  edx - buffer size
  661. ;  esi - start address in other process
  662. ;Output:
  663. ;  eax - number of bytes written
  664.  
  665.        locals
  666.          slot   dd ?
  667.          buff   dd ?
  668.          w_count    dd ?
  669.          offset dd ?
  670.          tmp_w_cnt  dd ?
  671.        endl
  672.  
  673.         mov     [slot], eax
  674.         mov     [buff], ecx
  675.         and     [w_count], 0
  676.         mov     [tmp_w_cnt], edx
  677.         mov     [offset], esi
  678.  
  679.         pushad
  680. .read_mem:
  681.         mov     edx, [offset]
  682.         mov     ebx, [tmp_w_cnt]
  683.  
  684.         mov     ecx, 0x400000
  685.         and     edx, 0x3FFFFF
  686.         sub     ecx, edx
  687.         cmp     ecx, ebx
  688.         jbe     @f
  689.         mov     ecx, ebx
  690. @@:
  691.         cmp     ecx, 0x8000
  692.         jna     @F
  693.         mov     ecx, 0x8000
  694. @@:
  695.         mov     ebx, [offset]
  696.       ;     add ebx, new_app_base
  697.         push    ecx
  698.         stdcall map_memEx, [proc_mem_map], \
  699.                 [slot], ebx, ecx, PG_SWR
  700.         pop     ecx
  701.  
  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
  710. @@:
  711.         add     edi, [proc_mem_map]
  712.         mov     esi, [buff]
  713.         mov     edx, ecx
  714.         rep movsb
  715.  
  716.         add     [w_count], edx
  717.         add     [offset], edx
  718.         sub     [tmp_w_cnt], edx
  719.         jnz     .read_mem
  720. .ret:
  721.         popad
  722.         mov     eax, [w_count]
  723.         ret
  724. endp
  725.  
  726. ;ebx = 1 - kernel thread
  727. ;ecx=thread entry point
  728. ;edx=thread stack pointer
  729. ;creation flags  0x01 - debugged
  730. ;                0x02 - kernel
  731.  
  732. align 4
  733. proc new_sys_threads
  734.        locals
  735.          slot          dd ?
  736.          flags         dd ?
  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
  743.  
  744.         shl     ebx, 1
  745.         mov     [flags], ebx
  746.  
  747.         xor     eax, eax
  748.         mov     [app_eip], ecx
  749.         mov     [app_cmdline], eax
  750.         mov     [app_esp], edx
  751.         mov     [app_path], eax
  752.  
  753.         call    lock_application_table
  754.  
  755.         call    alloc_thread_slot
  756.         test    eax, eax
  757.         jz      .failed
  758.  
  759.         mov     [slot], eax
  760.  
  761.         mov     esi, [current_slot]
  762.         mov     ebx, esi      ;ebx=esi - pointer to extended information about current thread
  763.  
  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
  776.  
  777.  
  778.         mov     eax, [ebx+APPDATA.tls_base]
  779.         test    eax, eax
  780.         jz      @F
  781.  
  782.         push    edx
  783.         stdcall user_alloc, 4096
  784.         pop     edx
  785.         test    eax, eax
  786.         jz      .failed1;eax=0
  787. @@:
  788.         mov     [edx+APPDATA.tls_base], eax
  789.  
  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.  
  797.         lea     eax, [app_cmdline]
  798.         stdcall set_app_params , [slot], eax, [flags]
  799.  
  800.         mov     eax, [process_number]           ;set result
  801.         call    unlock_application_table
  802.         ret
  803. .failed:
  804.         xor     eax, eax
  805. .failed1:
  806.         call    unlock_application_table
  807.         dec     eax     ;-1
  808.         ret
  809. endp
  810.  
  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.  
  861. align 4
  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
  921. tls_app_entry:
  922.  
  923.         call    init_heap
  924.         stdcall user_alloc, 4096
  925.  
  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
  934.         popad
  935.         iretd
  936.  
  937.  
  938. EFL_IF      equ 0x0200
  939. EFL_IOPL1   equ 0x1000
  940. EFL_IOPL2   equ 0x2000
  941. EFL_IOPL3   equ 0x3000
  942.  
  943. align 4
  944. proc set_app_params stdcall,slot:dword, params:dword, flags:dword
  945.  
  946.        locals
  947.          pl0_stack dd ?
  948.        endl
  949.  
  950.         stdcall kernel_alloc, RING0_STACK_SIZE+512
  951.         mov     [pl0_stack], eax
  952.  
  953.         lea     edi, [eax+RING0_STACK_SIZE]
  954.  
  955.         mov     eax, [slot]
  956.         mov     ebx, eax
  957.  
  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
  962.         mov     [eax+SLOT_BASE+APPDATA.terminate_protection], 80000001h
  963.  
  964. ;set default io permission map
  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
  969.  
  970.         mov     esi, fpu_data
  971.         mov     ecx, 512/4
  972.         rep movsd
  973.  
  974.         cmp     ebx, [TASK_COUNT]
  975.         jle     .noinc
  976.         inc     dword [TASK_COUNT]     ;update number of processes
  977. .noinc:
  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
  982.  
  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
  986.  
  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
  993.  
  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
  1003.  
  1004.         shr     ebx, 3
  1005.         mov     dword [CURRENT_TASK+ebx+0x10], 0
  1006.  
  1007.         mov     ebx, [slot]
  1008.         mov     eax, ebx
  1009.         shl     ebx, 5
  1010.         lea     ecx, [draw_data+ebx];ecx - pointer to draw data
  1011.  
  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. ;@@:
  1017. ; set window state to 'normal' (non-minimized/maximized/rolled-up) state
  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
  1022.  
  1023.         mov     [ebx+TASKDATA.event_mask], dword 1+2+4;set default event flags (see 40 function)
  1024.  
  1025.         inc     dword [process_number]
  1026.         mov     eax, [process_number]
  1027.         mov     [ebx+4], eax    ;set PID
  1028.  
  1029. ;set draw data to full screen
  1030.         xor     eax, eax
  1031.         mov     [ecx+0], dword eax
  1032.         mov     [ecx+4], dword eax
  1033.         mov     eax, [screen_workarea.right]
  1034.         mov     [ecx+8], eax
  1035.         mov     eax, [screen_workarea.bottom]
  1036.         mov     [ecx+12], eax
  1037.  
  1038.         mov     ebx, [pl0_stack]
  1039.         mov     esi, [params]
  1040.         lea     ecx, [ebx+REG_EIP]
  1041.         xor     eax, eax
  1042.  
  1043.         mov     [ebx+REG_RET], dword common_app_entry
  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
  1052.  
  1053.         mov     eax, [esi+APP_HDR.eip]
  1054.         mov     [ebx+REG_EIP], eax
  1055.         mov     [ebx+REG_CS], dword app_code
  1056.         mov     ecx, USER_PRIORITY
  1057.  
  1058.         test    byte [flags], 2
  1059.         jz      @F
  1060.  
  1061.         mov     [ebx+REG_CS], dword os_code ; kernel thread
  1062.         mov     ecx, MAX_PRIORITY
  1063. @@:
  1064.         mov     [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF
  1065.  
  1066.         mov     eax, [esi+APP_HDR.esp]
  1067.         mov     [ebx+REG_APP_ESP], eax
  1068.         mov     [ebx+REG_SS], dword app_data
  1069.  
  1070.         lea     edx, [ebx+REG_RET]
  1071.         mov     ebx, [slot]
  1072.         shl     ebx, 5
  1073.         mov     [ebx*8+SLOT_BASE+APPDATA.saved_esp], edx
  1074.  
  1075.         xor     edx, edx; process state - running
  1076. ; set if debuggee
  1077.         test    byte [flags], 1
  1078.         jz      .no_debug
  1079.         inc     edx ; process state - suspended
  1080.         mov     eax, [CURRENT_TASK]
  1081.         mov     [SLOT_BASE+ebx*8+APPDATA.debugger_slot], eax
  1082. .no_debug:
  1083.         mov     [CURRENT_TASK+ebx+TASKDATA.state], dl
  1084.         lea     edx, [SLOT_BASE+ebx*8]
  1085.         call    scheduler_add_thread
  1086.         ret
  1087. endp
  1088.  
  1089.  
  1090. align 4
  1091.  
  1092. get_stack_base:
  1093.         mov     eax, [current_slot]
  1094.         mov     eax, [eax+APPDATA.pl0_stack]
  1095.         ret
  1096.  
  1097.  
  1098. include "debug.inc"
  1099.