Subversion Repositories Kolibri OS

Rev

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