Subversion Repositories Kolibri OS

Rev

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

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