Subversion Repositories Kolibri OS

Rev

Rev 2166 | Rev 2465 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 2434 $
9
 
10
 
357 serge 11
GREEDY_KERNEL  equ 0
164 serge 12
 
2434 Serge 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
164 serge 21
 
2434 Serge 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
164 serge 32
 
237 serge 33
 
2434 Serge 34
struct  APP_PARAMS
35
        app_cmdline     dd ?    ;0x00
36
        app_path        dd ?    ;0x04
37
        app_eip         dd ?    ;0x08
38
        app_esp         dd ?    ;0x0C
39
        app_mem         dd ?    ;0x10
40
ends
237 serge 41
 
42
macro _clear_ op
43
{  mov ecx, op/4
2434 Serge 44
        xor     eax, eax
45
        cld
46
        rep stosd
237 serge 47
}
48
 
521 diamond 49
fs_execute_from_sysdir:
2434 Serge 50
        xor     ebx, ebx
2010 serge 51
fs_execute_from_sysdir_param:
2434 Serge 52
        xor     edx, edx
53
        mov     esi, sysdir_path
363 serge 54
 
164 serge 55
align 4
363 serge 56
proc fs_execute
57
 
58
;fn_read:dword, file_size:dword, cluster:dword
59
 
60
; ebx - cmdline
61
; edx - flags
62
; ebp - full filename
63
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it
64
 
1074 Galkov 65
       locals
66
         cmdline       rd 64    ;256/4
67
         filename      rd 256   ;1024/4
68
         flags     dd ?
363 serge 69
 
1074 Galkov 70
         save_cr3      dd ?
71
         slot      dd ?
72
         slot_base     dd ?
73
         file_base     dd ?
74
         file_size     dd ?
75
                      ;app header data
76
         hdr_cmdline   dd ? ;0x00
77
         hdr_path      dd ? ;0x04
78
         hdr_eip       dd ? ;0x08
79
         hdr_esp       dd ? ;0x0C
80
         hdr_mem       dd ? ;0x10
81
         hdr_i_end     dd ? ;0x14
82
       endl
164 serge 83
 
2434 Serge 84
        pushad
363 serge 85
 
2434 Serge 86
        mov     [flags], edx
363 serge 87
 
88
; [ebp]  pointer to filename
89
 
2434 Serge 90
        lea     edi, [filename]
91
        lea     ecx, [edi+1024]
92
        mov     al, '/'
93
        stosb
521 diamond 94
@@:
2434 Serge 95
        cmp     edi, ecx
96
        jae     .bigfilename
97
        lodsb
98
        stosb
99
        test    al, al
100
        jnz     @b
101
        mov     esi, [ebp]
102
        test    esi, esi
103
        jz      .namecopied
104
        mov     byte [edi-1], '/'
521 diamond 105
@@:
2434 Serge 106
        cmp     edi, ecx
107
        jae     .bigfilename
108
        lodsb
109
        stosb
110
        test    al, al
111
        jnz     @b
112
        jmp     .namecopied
521 diamond 113
.bigfilename:
2434 Serge 114
        popad
115
        mov     eax, -ERROR_FILE_NOT_FOUND
116
        ret
1220 serge 117
 
521 diamond 118
.namecopied:
363 serge 119
 
2434 Serge 120
        mov     [cmdline], ebx
121
        test    ebx, ebx
122
        jz      @F
519 serge 123
 
2434 Serge 124
        lea     eax, [cmdline]
125
        mov     dword [eax+252], 0
126
        stdcall strncpy, eax, ebx, 255
519 serge 127
@@:
2434 Serge 128
        lea     eax, [filename]
129
        stdcall load_file, eax
130
        mov     esi, -ERROR_FILE_NOT_FOUND
131
        test    eax, eax
132
        jz      .err_file
237 serge 133
 
2434 Serge 134
        mov     [file_base], eax
135
        mov     [file_size], ebx
237 serge 136
 
2434 Serge 137
        lea     ebx, [hdr_cmdline]
138
        call    test_app_header
139
        mov     esi, -0x1F
140
        test    eax, eax
141
        jz      .err_hdr
237 serge 142
 
143
.wait_lock:
2434 Serge 144
        cmp     [application_table_status], 0
145
        je      .get_lock
146
        call    change_task
147
        jmp     .wait_lock
237 serge 148
 
149
.get_lock:
2434 Serge 150
        mov     eax, 1
151
        xchg    eax, [application_table_status]
152
        test    eax, eax
153
        jnz     .wait_lock
237 serge 154
 
2434 Serge 155
        call    set_application_table_status
237 serge 156
 
2434 Serge 157
        call    get_new_process_place
158
        test    eax, eax
159
        mov     esi, -0x20 ; too many processes
160
        jz      .err
237 serge 161
 
2434 Serge 162
        mov     [slot], eax
163
        shl     eax, 8
164
        add     eax, SLOT_BASE
165
        mov     [slot_base], eax
166
        mov     edi, eax
1074 Galkov 167
       _clear_ 256     ;clean extended information about process
237 serge 168
 
169
; write application name
2434 Serge 170
        lea     eax, [filename]
171
        stdcall strrchr, eax, '/'  ; now eax points to name without path
237 serge 172
 
2434 Serge 173
        lea     esi, [eax+1]
174
        test    eax, eax
175
        jnz     @F
176
        lea     esi, [filename]
237 serge 177
@@:
2434 Serge 178
        mov     ecx, 8; 8 chars for name
179
        mov     edi, [slot_base]
237 serge 180
.copy_process_name_loop:
2434 Serge 181
        lodsb
182
        cmp     al, '.'
183
        jz      .copy_process_name_done
184
        test    al, al
185
        jz      .copy_process_name_done
186
        stosb
187
        loop    .copy_process_name_loop
237 serge 188
.copy_process_name_done:
189
 
2434 Serge 190
        mov     ebx, cr3
191
        mov     [save_cr3], ebx
269 serge 192
 
2434 Serge 193
        stdcall create_app_space, [hdr_mem], [file_base], [file_size]
194
        mov     esi, -30; no memory
195
        test    eax, eax
196
        jz      .failed
237 serge 197
 
2434 Serge 198
        mov     ebx, [slot_base]
199
        mov     [ebx+APPDATA.dir_table], eax
200
        mov     eax, [hdr_mem]
201
        mov     [ebx+APPDATA.mem_size], eax
237 serge 202
 
2434 Serge 203
        xor     edx, edx
204
        cmp     word [6], '02'
205
        jne     @f
1220