Subversion Repositories Kolibri OS

Rev

Rev 9710 | Rev 9794 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 9710 Rev 9715
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2021. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2022. All rights reserved. ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 9710 $
8
$Revision: 9715 $
Line 9... Line 9...
9
 
9
 
Line 125... Line 125...
125
        mov     esi, -TASKMAN_ERROR_TOO_MANY_PROCESSES
125
        mov     esi, -TASKMAN_ERROR_TOO_MANY_PROCESSES
126
        test    eax, eax
126
        test    eax, eax
127
        jz      .err_0
127
        jz      .err_0
Line 128... Line 128...
128
 
128
 
129
        mov     [slot], eax
129
        mov     [slot], eax
130
        shl     eax, 8
130
        shl     eax, BSF sizeof.APPDATA
131
        lea     edi, [SLOT_BASE+eax]
131
        lea     edi, [SLOT_BASE + eax]
132
        mov     [slot_base], edi
132
        mov     [slot_base], edi
133
; clean extended information about process
133
; clean extended information about process
134
        mov     ecx, sizeof.APPDATA/4
134
        mov     ecx, sizeof.APPDATA/4
135
        xor     eax, eax
135
        xor     eax, eax
Line 167... Line 167...
167
        mov     esi, -TASKMAN_ERROR_OUT_OF_MEMORY
167
        mov     esi, -TASKMAN_ERROR_OUT_OF_MEMORY
168
        test    eax, eax
168
        test    eax, eax
169
        jz      .err_hdr
169
        jz      .err_hdr
Line 170... Line 170...
170
 
170
 
171
; add new process to the list
171
; add new process to the list
172
        mov     ebx, [sys_proc+LHEAD.prev]
172
        mov     ebx, [sys_proc + LHEAD.prev]
173
        __list_add eax, ebx, sys_proc
173
        __list_add eax, ebx, sys_proc
174
; fill the structure fields:
174
; fill the structure fields:
175
        mov     ebx, [hdr_emem]
175
        mov     ebx, [hdr_emem]
Line 176... Line 176...
176
        mov     [eax+PROC.mem_used], ebx
176
        mov     [eax + PROC.mem_used], ebx
177
 
177
 
178
; write that main thread of app belongs to new process
178
; write that main thread of app belongs to new process
Line 179... Line 179...
179
        mov     ebx, [slot_base]
179
        mov     ebx, [slot_base]
180
        mov     [ebx+APPDATA.process], eax
180
        mov     [ebx + APPDATA.process], eax
181
 
181
 
182
; initialize the thread list of process: at this moment it consists only of one main thread
182
; initialize the thread list of process: at this moment it consists only of one main thread
Line 183... Line 183...
183
        lea     edx, [ebx+APPDATA.list]
183
        lea     edx, [ebx + APPDATA.list]
184
        lea     ecx, [eax+PROC.thr_list]
184
        lea     ecx, [eax + PROC.thr_list]
185
        list_add_tail edx, ecx
185
        list_add_tail edx, ecx
186
 
186
 
187
; allocate space and copy app header data locals and cmdline string there, put pointer to exec_params of new thread
187
; allocate space and copy app header data locals and cmdline string there, put pointer to exec_params of new thread
188
        mov     eax, [cmdline_size]
188
        mov     eax, [cmdline_size]
189
        add     eax, sizeof.APP_HDR
189
        add     eax, sizeof.APP_HDR
190
        stdcall kernel_alloc, eax
190
        stdcall kernel_alloc, eax
191
        mov     [ebx+APPDATA.exec_params], eax
191
        mov     [ebx + APPDATA.exec_params], eax
192
        mov     edi, eax
192
        mov     edi, eax
Line 229... Line 229...
229
 
229
 
230
        cmp     [eax+6], word '00'
230
        cmp     [eax+6], word '00'
Line 231... Line 231...
231
        jne     .check_01_header
231
        jne     .check_01_header
232
 
232
 
233
        mov     ecx, [APP_HEADER_00.start]
233
        mov     ecx, [APP_HEADER_00.start]
234
        mov     [ebx+APP_HDR.eip], ecx
234
        mov     [ebx + APP_HDR.eip], ecx
235
        mov     edx, [APP_HEADER_00.mem_size]
235
        mov     edx, [APP_HEADER_00.mem_size]
236
        mov     [ebx+APP_HDR._emem], edx
236
        mov     [ebx + APP_HDR._emem], edx
237
        shr     edx, 1
237
        shr     edx, 1
238
        sub     edx, 0x10
238
        sub     edx, 0x10
239
        mov     [ebx+APP_HDR.esp], edx
239
        mov     [ebx + APP_HDR.esp], edx
240
        mov     ecx, [APP_HEADER_00.i_param]
240
        mov     ecx, [APP_HEADER_00.i_param]
241
        mov     [ebx+APP_HDR.cmdline], ecx
241
        mov     [ebx + APP_HDR.cmdline], ecx
242
        mov     [ebx+APP_HDR.path], 0
242
        mov     [ebx + APP_HDR.path], 0
243
        mov     edx, [APP_HEADER_00.i_end]
243
        mov     edx, [APP_HEADER_00.i_end]
Line 244... Line 244...
244
        mov     [ebx+APP_HDR._edata], edx
244
        mov     [ebx + APP_HDR._edata], edx
Line 245... Line 245...
245
        ret
245
        ret
246
 
246
 
247
 .check_01_header:
247
 .check_01_header:
248
 
248
 
249
        cmp     [eax+6], word '01'
249
        cmp     [eax+6], word '01'
250
        je      @f
250
        je      @f
251
        cmp     [eax+6], word '02'
251
        cmp     [eax+6], word '02'
252
        jne     .fail
252
        jne     .fail
Line 253... Line 253...
253
@@:
253
@@:
254
        mov     ecx, [APP_HEADER_01.start]
254
        mov     ecx, [APP_HEADER_01.start]
255
        mov     [ebx+0x08], ecx
255
        mov     [ebx + 0x08], ecx
256
        mov     edx, [APP_HEADER_01.mem_size]
256
        mov     edx, [APP_HEADER_01.mem_size]
257
 
257
 
258
; \begin{diamond}[20.08.2006]
258
; \begin{diamond}[20.08.2006]
Line 259... Line 259...
259
; sanity check (functions 19,58 load app_i_end bytes and that must
259
; sanity check (functions 19,58 load app_i_end bytes and that must
260
; fit in allocated memory to prevent kernel faults)
260
; fit in allocated memory to prevent kernel faults)
261
        cmp     edx, [APP_HEADER_01.i_end]
261
        cmp     edx, [APP_HEADER_01.i_end]
262
        jb      .fail
262
        jb      .fail
263
; \end{diamond}[20.08.2006]
263
; \end{diamond}[20.08.2006]
264
 
264
 
265
        mov     [ebx+APP_HDR._emem], edx
265
        mov     [ebx + APP_HDR._emem], edx
266
        mov     ecx, [APP_HEADER_01.stack_top]
266
        mov     ecx, [APP_HEADER_01.stack_top]
267
        mov     [ebx+APP_HDR.esp], ecx
267
        mov     [ebx + APP_HDR.esp], ecx
268
        mov     edx, [APP_HEADER_01.i_param]
268
        mov     edx, [APP_HEADER_01.i_param]
269
        mov     [ebx+APP_HDR.cmdline], edx
269
        mov     [ebx + APP_HDR.cmdline], edx
270
        mov     ecx, [APP_HEADER_01.i_icon]
270
        mov     ecx, [APP_HEADER_01.i_icon]
271
        mov     [ebx+APP_HDR.path], ecx
271
        mov     [ebx + APP_HDR.path], ecx
Line 292... Line 292...
292
        cli
292
        cli
293
.l1:
293
.l1:
294
        bsf     eax, [edx]
294
        bsf     eax, [edx]
295
        jnz     .found
295
        jnz     .found
296
        add     edx, 4
296
        add     edx, 4
297
        cmp     edx, thr_slot_map+32
297
        cmp     edx, thr_slot_map + 32
298
        jb      .l1
298
        jb      .l1
Line 299... Line 299...
299
 
299
 
300
        popfd
300
        popfd
301
        xor     eax, eax
301
        xor     eax, eax
302
        ret
302
        ret
303
.found:
303
.found:
304
        btr     [edx], eax
304
        btr     [edx], eax
305
        sub     edx, thr_slot_map
305
        sub     edx, thr_slot_map
306
        lea     eax, [eax+edx*8]
306
        lea     eax, [eax + edx*8]
307
        popfd
307
        popfd
Line 308... Line 308...
308
        ret
308
        ret
309
 
309
 
Line 329... Line 329...
329
        stdcall kernel_alloc, 0x2000
329
        stdcall kernel_alloc, 0x2000
330
        test    eax, eax
330
        test    eax, eax
331
        jz      .fail
331
        jz      .fail
332
        mov     [process], eax
332
        mov     [process], eax
Line 333... Line 333...
333
 
333
 
334
        lea     edi, [eax+PROC.heap_lock]
334
        lea     edi, [eax + PROC.heap_lock]
Line 335... Line 335...
335
        mov     ecx, (PROC.ht_free-PROC.heap_lock)/4
335
        mov     ecx, (PROC.ht_free - PROC.heap_lock)/4
336
 
336
 
337
        list_init eax
337
        list_init eax
Line 353... Line 353...
353
        cmp     eax, ecx
353
        cmp     eax, ecx
354
        jbe     @B
354
        jbe     @B
Line 355... Line 355...
355
 
355
 
356
        mov     eax, edi
356
        mov     eax, edi
357
        call    get_pg_addr
357
        call    get_pg_addr
Line 358... Line 358...
358
        mov     [edi-4096+PROC.pdt_0_phys], eax
358
        mov     [edi - 4096 + PROC.pdt_0_phys], eax
359
 
359
 
360
        mov     ecx, (OS_BASE shr 20)/4
360
        mov     ecx, (OS_BASE shr 20)/4
Line 361... Line 361...
361
        xor     eax, eax
361
        xor     eax, eax
362
        rep stosd
362
        rep stosd
363
 
363
 
Line 364... Line 364...
364
        mov     ecx, (OS_BASE shr 20)/4
364
        mov     ecx, (OS_BASE shr 20)/4
365
        mov     esi, sys_proc+PROC.pdt_0+(OS_BASE shr 20)
365
        mov     esi, sys_proc + PROC.pdt_0 + (OS_BASE shr 20)
366
        rep movsd
366
        rep movsd
Line 367... Line 367...
367
 
367
 
368
        mov     eax, [edi-8192+PROC.pdt_0_phys]
368
        mov     eax, [edi - 8192 + PROC.pdt_0_phys]
Line 369... Line 369...
369
        or      eax, PG_SWR
369
        or      eax, PG_SWR
Line 445... Line 445...
445
        push    ecx
445
        push    ecx
Line 446... Line 446...
446
 
446
 
447
        mov     esi, ecx
447
        mov     esi, ecx
Line 448... Line 448...
448
        list_del esi
448
        list_del esi
449
 
449
 
Line 450... Line 450...
450
        mov     esi, [esi+PROC.dlls_list_ptr]
450
        mov     esi, [esi + PROC.dlls_list_ptr]
451
        call    destroy_all_hdlls
451
        call    destroy_all_hdlls
452
 
452
 
Line 473... Line 473...
473
        ret
473
        ret
Line 474... Line 474...
474
 
474
 
475
align 4
475
align 4
476
get_pid:
476
get_pid:
477
        mov     eax, [current_slot]
477
        mov     eax, [current_slot]
478
        mov     eax, [eax+APPDATA.tid]
478
        mov     eax, [eax + APPDATA.tid]
Line 479... Line 479...
479
        ret
479
        ret
480
 
480
 
481
pid_to_slot:
481
pid_to_slot:
Line 486... Line 486...
486
;Search process by PID.
486
;Search process by PID.
487
        push    ebx
487
        push    ebx
488
        push    ecx
488
        push    ecx
489
        mov     ebx, [thread_count]
489
        mov     ebx, [thread_count]
490
        shl     ebx, BSF sizeof.APPDATA ; multiply by size
490
        shl     ebx, BSF sizeof.APPDATA ; multiply by size
491
        ; add 2*32 cause:
-
 
492
        ; [TASK_TABLE; TASK_TABLE + 32) isnt a task actually
-
 
493
        ; skip first process in the task table
491
        ; skip first process in the task table
494
        ;mov     ecx, 2*32    ;sizeof.TASKDATA
-
 
495
        mov     ecx, sizeof.APPDATA
492
        mov     ecx, sizeof.APPDATA
Line 496... Line 493...
496
 
493
 
497
.loop:
494
.loop:
498
;ecx = offset of current process info entry
495
;ecx = offset of current process info entry
499
;ebx = maximum permitted offset
496
;ebx = maximum permitted offset
500
        cmp     [SLOT_BASE + ecx + APPDATA.state], TSTATE_FREE
497
        cmp     [SLOT_BASE + ecx + APPDATA.state], TSTATE_FREE
501
        jz      .endloop ;skip empty slots
498
        jz      .endloop ;skip empty slots
502
        cmp     [ecx + SLOT_BASE + APPDATA.tid], eax;check PID
499
        cmp     [SLOT_BASE + ecx + APPDATA.tid], eax
503
        jz      .pid_found
500
        jz      .pid_found
504
.endloop:
501
.endloop:
505
        add     ecx, sizeof.APPDATA
502
        add     ecx, sizeof.APPDATA
506
        cmp     ecx, ebx
503
        cmp     ecx, ebx
Line 696... Line 693...
696
 
693
 
697
        mov     esi, [current_slot]
694
        mov     esi, [current_slot]
Line 698... Line 695...
698
        mov     ebx, esi      ;ebx=esi - pointer to extended information about current thread
695
        mov     ebx, esi      ;ebx=esi - pointer to extended information about current thread
699
 
696
 
700
        mov     edi, eax
697
        mov     edi, eax
701
        shl     edi, 8
698
        shl     edi, BSF sizeof.APPDATA
702
        add     edi, SLOT_BASE
699
        add     edi, SLOT_BASE
703
        mov     edx, edi      ;edx=edi - pointer to extended infomation about new thread
700
        mov     edx, edi      ;edx=edi - pointer to extended infomation about new thread
704
        mov     ecx, sizeof.APPDATA/4
701
        mov     ecx, sizeof.APPDATA/4
Line 709... Line 706...
709
        mov     edi, edx
706
        mov     edi, edx
710
        mov     ecx, 11
707
        mov     ecx, 11
711
        rep movsb             ;copy process name
708
        rep movsb             ;copy process name
Line 712... Line 709...
712
 
709
 
713
 
710
 
714
        mov     eax, [ebx+APPDATA.tls_base]
711
        mov     eax, [ebx + APPDATA.tls_base]
Line 715... Line 712...
715
        test    eax, eax
712
        test    eax, eax
716
        jz      @F
713
        jz      @F
717
 
714
 
718
        push    edx
715
        push    edx
719
        stdcall user_alloc, 4096
716
        stdcall user_alloc, 4096
720
        pop     edx
717
        pop     edx
721
        test    eax, eax
718
        test    eax, eax
Line 722... Line 719...
722
        jz      .failed1;eax=0
719
        jz      .failed1;eax=0
723
@@:
720
@@:
Line 724... Line 721...
724
        mov     [edx+APPDATA.tls_base], eax
721
        mov     [edx + APPDATA.tls_base], eax
725
 
722
 
726
        mov     eax, [ebx+APPDATA.process]
723
        mov     eax, [ebx + APPDATA.process]
Line 727... Line 724...
727
        mov     [edx+APPDATA.process], eax
724
        mov     [edx + APPDATA.process], eax
728
 
725
 
Line 794... Line 791...
794
endp
791
endp
Line 795... Line 792...
795
 
792
 
796
align 4
793
align 4
797
common_app_entry:
794
common_app_entry:
798
        mov     ebp, [current_slot]
795
        mov     ebp, [current_slot]
799
        mov     ebp, [ebp+APPDATA.exec_params]
796
        mov     ebp, [ebp + APPDATA.exec_params]
800
        test    ebp, ebp
797
        test    ebp, ebp
801
        jz      .exit
798
        jz      .exit
802
; APPDATA.exec_params have first thread only,
799
; APPDATA.exec_params have first thread only,
803
; so second and next threads don't get here (they jump to .exit) 
800
; so second and next threads don't get here (they jump to .exit) 
804
        stdcall map_process_image, [ebp+APP_HDR._emem],\
801
        stdcall map_process_image, [ebp + APP_HDR._emem],\
805
                [ebp+APP_HDR.img_base], [ebp+APP_HDR.img_size]
802
                [ebp + APP_HDR.img_base], [ebp + APP_HDR.img_size]
806
        mov     esi, [ebp+APP_HDR.path_string]
803
        mov     esi, [ebp + APP_HDR.path_string]
807
        mov     edi, [ebp+APP_HDR.path]
804
        mov     edi, [ebp + APP_HDR.path]
808
        mov     ecx, [ebp+APP_HDR.filename_size]
805
        mov     ecx, [ebp + APP_HDR.filename_size]
809
        cmp     ecx, 1023
806
        cmp     ecx, 1023
810
        jc      @f
807
        jc      @f
811
        mov     ecx, 1022
808
        mov     ecx, 1022
812
@@:
809
@@:
813
        push    esi
810
        push    esi
814
        test    edi, edi
811
        test    edi, edi
815
        jz      @f
812
        jz      @f
816
        stdcall is_region_userspace, edi, [ebp+APP_HDR.filename_size]
813
        stdcall is_region_userspace, edi, [ebp + APP_HDR.filename_size]
817
        jnz     @f
814
        jnz     @f
818
        mov     al, '/'
815
        mov     al, '/'
819
        stosb
816
        stosb
820
        rep movsb
817
        rep movsb
821
        mov     byte [edi], 0
818
        mov     byte [edi], 0
822
@@:
819
@@:
823
        call    kernel_free
820
        call    kernel_free
824
        mov     edi, [ebp+APP_HDR.cmdline]
821
        mov     edi, [ebp + APP_HDR.cmdline]
825
        test    edi, edi
822
        test    edi, edi
826
        jz      .check_tls_header
823
        jz      .check_tls_header
827
        lea     esi, [ebp+sizeof.APP_HDR]
824
        lea     esi, [ebp + sizeof.APP_HDR]
828
        mov     ecx, [ebp+APP_HDR.cmdline_size]
825
        mov     ecx, [ebp + APP_HDR.cmdline_size]
829
        cmp     ecx, 256
826
        cmp     ecx, 256
830
        jb      .copy_cmdline
827
        jb      .copy_cmdline
831
        mov     edi, [ebp+APP_HDR._emem]
828
        mov     edi, [ebp + APP_HDR._emem]
832
        add     edi, 4095
829
        add     edi, 4095
833
        and     edi, -4096
830
        and     edi, -4096
834
        sub     edi, ecx
831
        sub     edi, ecx
835
        dec     edi
832
        dec     edi
Line 850... Line 847...
850
        cmp     word [6], '02'
847
        cmp     word [6], '02'
851
        jne     .try_load_dll ;.cleanup
848
        jne     .try_load_dll ;.cleanup
852
        call    init_heap
849
        call    init_heap
853
        stdcall user_alloc, 4096
850
        stdcall user_alloc, 4096
854
        mov     edx, [current_slot]
851
        mov     edx, [current_slot]
855
        mov     [edx+APPDATA.tls_base], eax
852
        mov     [edx + APPDATA.tls_base], eax
856
        mov     [tls_data_l+2], ax
853
        mov     [tls_data_l+2], ax
857
        shr     eax, 16
854
        shr     eax, 16
858
        mov     [tls_data_l+4], al
855
        mov     [tls_data_l+4], al
859
        mov     [tls_data_l+7], ah
856
        mov     [tls_data_l+7], ah
860
        mov     dx, app_tls
857
        mov     dx, app_tls
861
        mov     fs, dx       
858
        mov     fs, dx       
862
; { Patch by Coldy, For DLL autoload    
859
; { Patch by Coldy, For DLL autoload    
863
.try_load_dll:         
860
.try_load_dll:         
864
; Test app header version 
861
; Test app header version 
865
        mov     ecx, dword[ebp+APP_HDR.img_base]
862
        mov     ecx, dword[ebp + APP_HDR.img_base]
866
        cmp     dword[ecx+8], 2
863
        cmp     dword[ecx+8], 2
867
        jne     .cleanup
864
        jne     .cleanup
868
;if APP_HEADER.version = 2 => load lib/dll.obj & change eip to APP_STARTUP_THUNK
865
;if APP_HEADER.version = 2 => load lib/dll.obj & change eip to APP_STARTUP_THUNK
869
        DEBUGF 1, 'K : App header version 2\n'
866
        DEBUGF 1, 'K : App header version 2\n'
870
        stdcall load_library, dll_lib_path, 0
867
        stdcall load_library, dll_lib_path, 0
Line 885... Line 882...
885
        sub     eax, 4
882
        sub     eax, 4
886
        mov     eax, [eax]
883
        mov     eax, [eax]
Line 887... Line 884...
887
        
884
        
888
;.change_eip:
885
;.change_eip:
889
        mov     ecx, [current_slot]
886
        mov     ecx, [current_slot]
890
        mov     ecx, [ecx+APPDATA.pl0_stack]
887
        mov     ecx, [ecx + APPDATA.pl0_stack]
Line 891... Line 888...
891
        mov     [ecx+REG_EIP], eax
888
        mov     [ecx+REG_EIP], eax
892
        
889
        
893
; } End patch by Coldy, For DLL autoload
890
; } End patch by Coldy, For DLL autoload
894
.cleanup:
891
.cleanup:
895
        stdcall free_kernel_space, [ebp+APP_HDR.img_base]
892
        stdcall free_kernel_space, [ebp+APP_HDR.img_base]
896
        stdcall kernel_free, ebp
893
        stdcall kernel_free, ebp
897
        mov     ebx, [current_slot]
894
        mov     ebx, [current_slot]
898
        cmp     [ebx+APPDATA.debugger_slot], 0
895
        cmp     [ebx + APPDATA.debugger_slot], 0
899
        je      .exit
896
        je      .exit
900
        mov     [ebx+APPDATA.state], TSTATE_RUN_SUSPENDED
897
        mov     [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED
901
        mov     [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED
898
        mov     [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED
902
        call    change_task
899
        call    change_task
903
.exit:
900
.exit:
Line 925... Line 922...
925
 
922
 
926
        mov     eax, [slot]
923
        mov     eax, [slot]
Line 927... Line 924...
927
        mov     ebx, eax
924
        mov     ebx, eax
928
 
925
 
929
        shl     eax, BSF sizeof.APPDATA
926
        shl     eax, BSF sizeof.APPDATA
930
        mov     [eax+SLOT_BASE+APPDATA.fpu_state], edi
927
        mov     [SLOT_BASE + eax + APPDATA.fpu_state], edi
931
        mov     [eax+SLOT_BASE+APPDATA.exc_handler], 0
928
        mov     [SLOT_BASE + eax + APPDATA.exc_handler], 0
Line 932... Line 929...
932
        mov     [eax+SLOT_BASE+APPDATA.except_mask], 0
929
        mov     [SLOT_BASE + eax + APPDATA.except_mask], 0
933
        mov     [eax+SLOT_BASE+APPDATA.terminate_protection], 80000001h
930
        mov     [SLOT_BASE + eax + APPDATA.terminate_protection], 80000001h
934
 
931
 
935
;set default io permission map
932
;set default io permission map
936
        mov     ecx, [SLOT_BASE+sizeof.APPDATA+APPDATA.io_map]
933
        mov     ecx, [SLOT_BASE + sizeof.APPDATA + APPDATA.io_map]
Line 937... Line 934...
937
        mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
934
        mov     [SLOT_BASE + eax + APPDATA.io_map], ecx
938
        mov     ecx, [SLOT_BASE+sizeof.APPDATA+APPDATA.io_map+4]
935
        mov     ecx, [SLOT_BASE + sizeof.APPDATA + APPDATA.io_map + 4]
939
        mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
936
        mov     [SLOT_BASE + eax + APPDATA.io_map + 4], ecx
940
 
937
 
941
        mov     esi, fpu_data
938
        mov     esi, fpu_data
Line 942... Line 939...
942
        mov     ecx, [xsave_area_size]
939
        mov     ecx, [xsave_area_size]
943
        add     ecx, 3
940
        add     ecx, 3
944
        shr     ecx, 2
941
        shr     ecx, 2
945
        rep movsd
942
        rep movsd
946
 
943
 
947
        cmp     [thread_count], ebx
944
        cmp     [thread_count], ebx
948
        adc     [thread_count], 0   ; update number of processes
945
        adc     [thread_count], 0   ; update number of processes
949
        shl     ebx, BSF sizeof.APPDATA
946
        shl     ebx, BSF sizeof.APPDATA
950
        lea     edx, [ebx+SLOT_BASE+APP_EV_OFFSET]
947
        lea     edx, [SLOT_BASE + ebx + APP_EV_OFFSET]
951
        mov     [SLOT_BASE+APPDATA.fd_ev+ebx], edx
948
        mov     [SLOT_BASE + ebx + APPDATA.fd_ev], edx
Line 952... Line 949...
952
        mov     [SLOT_BASE+APPDATA.bk_ev+ebx], edx
949
        mov     [SLOT_BASE + ebx + APPDATA.bk_ev], edx
953
 
950
 
954
        add     edx, APP_OBJ_OFFSET-APP_EV_OFFSET
951
        add     edx, APP_OBJ_OFFSET - APP_EV_OFFSET
955
        mov     [SLOT_BASE+APPDATA.fd_obj+ebx], edx
952
        mov     [SLOT_BASE + ebx + APPDATA.fd_obj], edx
956
        mov     [SLOT_BASE+APPDATA.bk_obj+ebx], edx
953
        mov     [SLOT_BASE + ebx + APPDATA.bk_obj], edx
957
 
954
 
Line 958... Line 955...
958
        mov     ecx, [def_cursor]
955
        mov     ecx, [def_cursor]
959
        mov     [SLOT_BASE+APPDATA.cursor+ebx], ecx
956
        mov     [SLOT_BASE + ebx + APPDATA.cursor], ecx
960
        mov     eax, [pl0_stack]
957
        mov     eax, [pl0_stack]
961
        mov     [SLOT_BASE+APPDATA.pl0_stack+ebx], eax
958
        mov     [SLOT_BASE + ebx + APPDATA.pl0_stack], eax
962
        add     eax, RING0_STACK_SIZE
959
        add     eax, RING0_STACK_SIZE
963
        mov     [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
960
        mov     [SLOT_BASE + ebx + APPDATA.saved_esp0], eax
964
 
961
 
965
        push    ebx
962
        push    ebx
966
        stdcall kernel_alloc, maxPathLength
963
        stdcall kernel_alloc, maxPathLength
Line 967... Line 964...
967
        pop     ebx
964
        pop     ebx
968
        mov     esi, [current_slot]
965
        mov     esi, [current_slot]
969
        mov     esi, [esi+APPDATA.cur_dir]
966
        mov     esi, [esi + APPDATA.cur_dir]
970
        mov     ecx, maxPathLength/4
967
        mov     ecx, maxPathLength/4
Line 971... Line 968...
971
        mov     edi, eax
968
        mov     edi, eax
972
        mov     [ebx+SLOT_BASE+APPDATA.cur_dir], eax
969
        mov     [SLOT_BASE + ebx + APPDATA.cur_dir], eax
973
        rep movsd
970
        rep movsd
974
 
971
 
975
        mov     [ebx+SLOT_BASE+APPDATA.event_mask], dword 1+2+4;set default event flags (see 40 function)
972
        mov     [SLOT_BASE + ebx + APPDATA.event_mask], dword 1+2+4;set default event flags (see 40 function)
Line 976... Line 973...
976
        inc     dword [process_number]
973
        inc     dword [process_number]
977
        mov     eax, [process_number]
974
        mov     eax, [process_number]
978
        mov     [ebx+SLOT_BASE+APPDATA.tid], eax    ;set TID
975
        mov     [SLOT_BASE + ebx + APPDATA.tid], eax    ;set TID
Line 979... Line 976...
979
 
976
 
980
        mov     eax, [slot]
977
        mov     eax, [slot]
981
        mov     [ebx+SLOT_BASE+APPDATA.wnd_number], al
978
        mov     [SLOT_BASE + ebx + APPDATA.wnd_number], al
982
        mov     ebx, eax
979
        mov     ebx, eax
Line 996... Line 993...
996
        mov     eax, [screen_workarea.bottom]
993
        mov     eax, [screen_workarea.bottom]
997
        mov     [ecx+12], eax
994
        mov     [ecx+12], eax
Line 998... Line 995...
998
 
995
 
999
        mov     ebx, [pl0_stack]
996
        mov     ebx, [pl0_stack]
1000
        mov     esi, [params]
997
        mov     esi, [params]
1001
        lea     ecx, [ebx+REG_EIP]
998
        lea     ecx, [ebx + REG_EIP]
Line 1002... Line 999...
1002
        xor     eax, eax
999
        xor     eax, eax
1003
 
1000
 
1004
        mov     [ebx+REG_RET], dword common_app_entry
1001
        mov     [ebx + REG_RET], dword common_app_entry
1005
        mov     [ebx+REG_EDI], eax
1002
        mov     [ebx + REG_EDI], eax
1006
        mov     [ebx+REG_ESI], eax
1003
        mov     [ebx + REG_ESI], eax
1007
        mov     [ebx+REG_EBP], eax
1004
        mov     [ebx + REG_EBP], eax
1008
        mov     [ebx+REG_ESP], ecx;ebx+REG_EIP
1005
        mov     [ebx + REG_ESP], ecx;ebx+REG_EIP
1009
        mov     [ebx+REG_EBX], eax
1006
        mov     [ebx + REG_EBX], eax
1010
        mov     [ebx+REG_EDX], eax
1007
        mov     [ebx + REG_EDX], eax
1011
        mov     [ebx+REG_ECX], eax
1008
        mov     [ebx + REG_ECX], eax
1012
        mov     [ebx+REG_EAX], eax
1009
        mov     [ebx + REG_EAX], eax
1013
 
1010
 
1014
        mov     eax, [esi+APP_HDR.eip]
1011
        mov     eax, [esi + APP_HDR.eip]
1015
        mov     [ebx+REG_EIP], eax
1012
        mov     [ebx + REG_EIP], eax
Line 1016... Line 1013...
1016
        mov     [ebx+REG_CS], dword app_code
1013
        mov     [ebx + REG_CS], dword app_code
1017
        mov     ecx, USER_PRIORITY
1014
        mov     ecx, USER_PRIORITY
Line 1018... Line 1015...
1018
 
1015
 
1019
        test    byte [flags], 2
1016
        test    byte [flags], 2
1020
        jz      @F
1017
        jz      @F
1021
 
1018
 
Line 1022... Line 1019...
1022
        mov     [ebx+REG_CS], dword os_code ; kernel thread
1019
        mov     [ebx + REG_CS], dword os_code ; kernel thread
1023
        mov     ecx, MAX_PRIORITY
1020
        mov     ecx, MAX_PRIORITY
1024
@@:
1021
@@:
Line 1025... Line 1022...
1025
        mov     [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF
1022
        mov     [ebx + REG_EFLAGS], dword EFL_IOPL1+EFL_IF
1026
 
1023
 
1027
        mov     eax, [esi+APP_HDR.esp]
1024
        mov     eax, [esi + APP_HDR.esp]
1028
        mov     [ebx+REG_APP_ESP], eax
1025
        mov     [ebx + REG_APP_ESP], eax
Line 1029... Line 1026...
1029
        mov     [ebx+REG_SS], dword app_data
1026
        mov     [ebx + REG_SS], dword app_data
1030
 
1027
 
1031
        lea     edx, [ebx+REG_RET]
1028
        lea     edx, [ebx + REG_RET]
1032
        mov     ebx, [slot]
1029
        mov     ebx, [slot]
1033
        shl     ebx, BSF sizeof.APPDATA
1030
        shl     ebx, BSF sizeof.APPDATA
1034
        mov     [ebx+SLOT_BASE+APPDATA.saved_esp], edx
1031
        mov     [SLOT_BASE + ebx + APPDATA.saved_esp], edx
1035
 
1032
 
1036
        xor     edx, edx; process state - running
1033
        xor     edx, edx; process state - running
1037
; set if debuggee
1034
; set if debuggee
1038
        test    byte [flags], 1
1035
        test    byte [flags], 1
1039
        jz      .no_debug
1036
        jz      .no_debug
1040
        mov     eax, [current_slot_idx]
1037
        mov     eax, [current_slot_idx]
Line 1041... Line 1038...
1041
        mov     [SLOT_BASE+ebx+APPDATA.debugger_slot], eax
1038
        mov     [SLOT_BASE + ebx + APPDATA.debugger_slot], eax
1042
.no_debug:
1039
.no_debug:
1043
        mov     [SLOT_BASE + ebx + APPDATA.state], dl
1040
        mov     [SLOT_BASE + ebx + APPDATA.state], dl
1044
        lea     edx, [SLOT_BASE+ebx]
1041
        lea     edx, [SLOT_BASE + ebx]
1045
        call    scheduler_add_thread
1042
        call    scheduler_add_thread
Line 1046... Line 1043...
1046
        ret
1043
        ret