Subversion Repositories Kolibri OS

Rev

Rev 10002 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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