Subversion Repositories Kolibri OS

Rev

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

Rev 419 Rev 420
1
DRV_COMPAT   equ  4  ;minimal required drivers version
1
DRV_COMPAT   equ  4  ;minimal required drivers version
2
DRV_CURRENT  equ  4  ;current drivers model version
2
DRV_CURRENT  equ  4  ;current drivers model version
3
 
3
 
4
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
4
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
5
 
5
 
6
align 4
6
align 4
7
proc attach_int_handler stdcall, irq:dword, handler:dword
7
proc attach_int_handler stdcall, irq:dword, handler:dword
8
 
8
 
9
	 mov ebx, [irq]        ;irq num
9
	 mov ebx, [irq]        ;irq num
10
	 test ebx, ebx
10
	 test ebx, ebx
11
	 jz .err
11
	 jz .err
12
	 mov eax, [handler]
12
	 mov eax, [handler]
13
	 test eax, eax
13
	 test eax, eax
14
	 jz .err
14
	 jz .err
15
	 mov [irq_tab+ebx*4], eax
15
	 mov [irq_tab+ebx*4], eax
16
         stdcall enable_irq, [irq]
16
         stdcall enable_irq, [irq]
17
	 ret
17
	 ret
18
.err:
18
.err:
19
	 xor eax, eax
19
	 xor eax, eax
20
	 ret
20
	 ret
21
endp
21
endp
22
 
22
 
23
align 4
23
align 4
24
proc  detach_int_handler
24
proc  detach_int_handler
25
 
25
 
26
	   ret
26
	   ret
27
endp
27
endp
28
 
28
 
29
align 4
29
align 4
30
proc enable_irq stdcall, irq_line:dword
30
proc enable_irq stdcall, irq_line:dword
31
           mov ebx, [irq_line]
31
           mov ebx, [irq_line]
32
           mov edx, 0x21
32
           mov edx, 0x21
33
           cmp ebx, 8
33
           cmp ebx, 8
34
           jb @F
34
           jb @F
35
           mov edx, 0xA1
35
           mov edx, 0xA1
36
           sub ebx,8
36
           sub ebx,8
37
@@:
37
@@:
38
           in al,dx
38
           in al,dx
39
           btr eax, ebx
39
           btr eax, ebx
40
           out dx, al
40
           out dx, al
41
           ret
41
           ret
42
endp
42
endp
43
 
43
 
44
align 16
44
align 16
45
;; proc irq_serv
45
;; proc irq_serv
46
 
46
 
47
irq_serv:
47
irq_serv:
48
 
48
 
49
.irq_1:
49
.irq_1:
50
	   push eax
50
	   push eax
51
	   mov eax, 1
51
	   mov eax, 1
52
	   jmp .main
52
	   jmp .main
53
align 4
53
align 4
54
.irq_2:
54
.irq_2:
55
	   push eax
55
	   push eax
56
	   mov eax, 2
56
	   mov eax, 2
57
	   jmp .main
57
	   jmp .main
58
align 4
58
align 4
59
.irq_3:
59
.irq_3:
60
	   push eax
60
	   push eax
61
	   mov eax, 3
61
	   mov eax, 3
62
	   jmp .main
62
	   jmp .main
63
align 4
63
align 4
64
.irq_4:
64
.irq_4:
65
	   push eax
65
	   push eax
66
	   mov eax, 4
66
	   mov eax, 4
67
	   jmp .main
67
	   jmp .main
68
align 4
68
align 4
69
.irq_5:
69
.irq_5:
70
	   push eax
70
	   push eax
71
	   mov eax, 5
71
	   mov eax, 5
72
	   jmp .main
72
	   jmp .main
73
align 4
73
align 4
74
.irq_6:
74
.irq_6:
75
	   push eax
75
	   push eax
76
	   mov eax, 6
76
	   mov eax, 6
77
	   jmp .main
77
	   jmp .main
78
align 4
78
align 4
79
.irq_7:
79
.irq_7:
80
	   push eax
80
	   push eax
81
	   mov eax, 7
81
	   mov eax, 7
82
	   jmp .main
82
	   jmp .main
83
align 4
83
align 4
84
.irq_8:
84
.irq_8:
85
	   push eax
85
	   push eax
86
	   mov eax, 8
86
	   mov eax, 8
87
	   jmp .main
87
	   jmp .main
88
align 4
88
align 4
89
.irq_9:
89
.irq_9:
90
	   push eax
90
	   push eax
91
	   mov eax, 9
91
	   mov eax, 9
92
	   jmp .main
92
	   jmp .main
93
align 4
93
align 4
94
.irq_10:
94
.irq_10:
95
	   push eax
95
	   push eax
96
	   mov eax, 10
96
	   mov eax, 10
97
	   jmp .main
97
	   jmp .main
98
align 4
98
align 4
99
.irq_11:
99
.irq_11:
100
	   push eax
100
	   push eax
101
	   mov eax, 11
101
	   mov eax, 11
102
	   jmp .main
102
	   jmp .main
103
align 4
103
align 4
104
.irq_12:
104
.irq_12:
105
	   push eax
105
	   push eax
106
	   mov eax, 12
106
	   mov eax, 12
107
	   jmp .main
107
	   jmp .main
108
align 4
108
align 4
109
.irq_13:
109
.irq_13:
110
	   push eax
110
	   push eax
111
	   mov eax, 13
111
	   mov eax, 13
112
	   jmp .main
112
	   jmp .main
113
align 4
113
align 4
114
.irq_14:
114
.irq_14:
115
	   push eax
115
	   push eax
116
	   mov eax, 14
116
	   mov eax, 14
117
	   jmp .main
117
	   jmp .main
118
align 4
118
align 4
119
.irq_15:
119
.irq_15:
120
	   push eax
120
	   push eax
121
	   mov eax, 15
121
	   mov eax, 15
122
	   jmp .main
122
	   jmp .main
123
 
123
 
124
align 16
124
align 16
125
.main:
125
.main:
126
	   save_ring3_context
126
	   save_ring3_context
127
	   mov	 bx, os_data
127
           mov   bx, app_data  ;os_data
128
	   mov	 ds, bx
128
	   mov	 ds, bx
129
	   mov	 es, bx
129
	   mov	 es, bx
130
 
130
 
131
	   mov ebx, [irq_tab+eax*4]
131
	   mov ebx, [irq_tab+eax*4]
132
	   test ebx, ebx
132
	   test ebx, ebx
133
	   jz .exit
133
	   jz .exit
134
 
134
 
135
           call ebx
135
           call ebx
136
 
136
 
137
.exit:
137
.exit:
138
	   restore_ring3_context
138
	   restore_ring3_context
139
 
139
 
140
           cmp eax, 8
140
           cmp eax, 8
141
	   mov al, 0x20
141
	   mov al, 0x20
142
           jb @f
142
           jb @f
143
	   out 0xa0, al
143
	   out 0xa0, al
144
@@:
144
@@:
145
           out 0x20, al
145
           out 0x20, al
146
 
146
 
147
           pop eax
147
           pop eax
148
	   iret
148
	   iret
149
 
149
 
150
align 4
150
align 4
151
proc get_notify stdcall, p_ev:dword
151
proc get_notify stdcall, p_ev:dword
152
 
152
 
153
.wait:
153
.wait:
154
           mov ebx,[CURRENT_TASK]
154
           mov ebx,[CURRENT_TASK]
155
           shl ebx,8
155
           shl ebx,8
156
           test dword [ebx+SLOT_BASE+0xA8],EVENT_NOTIFY
156
           test dword [ebx+SLOT_BASE+0xA8],EVENT_NOTIFY
157
	   jz @f
157
	   jz @f
158
           and dword [ebx+SLOT_BASE+0xA8], not EVENT_NOTIFY
158
           and dword [ebx+SLOT_BASE+0xA8], not EVENT_NOTIFY
159
	   mov edi, [p_ev]
159
	   mov edi, [p_ev]
160
	   mov dword [edi], EV_INTR
160
	   mov dword [edi], EV_INTR
161
           mov eax, [ebx+SLOT_BASE+APPDATA.event]
161
           mov eax, [ebx+SLOT_BASE+APPDATA.event]
162
	   mov dword [edi+4], eax
162
	   mov dword [edi+4], eax
163
	   ret
163
	   ret
164
@@:
164
@@:
165
	   call change_task
165
	   call change_task
166
	   jmp .wait
166
	   jmp .wait
167
endp
167
endp
168
 
168
 
169
align 4
169
align 4
170
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
170
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
171
	   xor eax, eax
171
	   xor eax, eax
172
	   xor ebx, ebx
172
	   xor ebx, ebx
173
	   mov ah, byte [bus]
173
	   mov ah, byte [bus]
174
           mov al, 6
174
           mov al, 6
175
	   mov bh, byte [devfn]
175
	   mov bh, byte [devfn]
176
	   mov bl, byte [reg]
176
	   mov bl, byte [reg]
177
	   call pci_read_reg
177
	   call pci_read_reg
178
	   ret
178
	   ret
179
endp
179
endp
180
 
180
 
181
align 4
181
align 4
182
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
182
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
183
	   xor eax, eax
183
	   xor eax, eax
184
	   xor ebx, ebx
184
	   xor ebx, ebx
185
	   mov ah, byte [bus]
185
	   mov ah, byte [bus]
186
           mov al, 4
186
           mov al, 4
187
	   mov bh, byte [devfn]
187
	   mov bh, byte [devfn]
188
	   mov bl, byte [reg]
188
	   mov bl, byte [reg]
189
	   call pci_read_reg
189
	   call pci_read_reg
190
	   ret
190
	   ret
191
endp
191
endp
192
 
192
 
193
align 4
193
align 4
194
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
194
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
195
	   xor eax, eax
195
	   xor eax, eax
196
	   xor ebx, ebx
196
	   xor ebx, ebx
197
	   mov ah, byte [bus]
197
	   mov ah, byte [bus]
198
           mov al, 8
198
           mov al, 8
199
	   mov bh, byte [devfn]
199
	   mov bh, byte [devfn]
200
	   mov bl, byte [reg]
200
	   mov bl, byte [reg]
201
           mov ecx, [val]
201
           mov ecx, [val]
202
           call pci_write_reg
202
           call pci_write_reg
203
	   ret
203
	   ret
204
endp
204
endp
205
 
205
 
206
handle     equ  IOCTL.handle
206
handle     equ  IOCTL.handle
207
io_code    equ  IOCTL.io_code
207
io_code    equ  IOCTL.io_code
208
input      equ  IOCTL.input
208
input      equ  IOCTL.input
209
inp_size   equ  IOCTL.inp_size
209
inp_size   equ  IOCTL.inp_size
210
output     equ  IOCTL.output
210
output     equ  IOCTL.output
211
out_size   equ  IOCTL.out_size
211
out_size   equ  IOCTL.out_size
212
 
212
 
213
 
213
 
214
align 4
214
align 4
215
proc srv_handler stdcall, ioctl:dword
215
proc srv_handler stdcall, ioctl:dword
216
           mov esi, [ioctl]
216
           mov esi, [ioctl]
217
           test esi, esi
217
           test esi, esi
218
           jz .err
218
           jz .err
219
 
219
 
220
           mov edi, [esi+handle]
220
           mov edi, [esi+handle]
221
           cmp [edi+SRV.magic], ' SRV'
221
           cmp [edi+SRV.magic], ' SRV'
222
	   jne .fail
222
	   jne .fail
223
 
223
 
224
           cmp [edi+SRV.size], SRV_SIZE
224
           cmp [edi+SRV.size], SRV_SIZE
225
	   jne .fail
225
	   jne .fail
226
 
226
 
227
           stdcall [edi+SRV.srv_proc], esi
227
           stdcall [edi+SRV.srv_proc], esi
228
           ret
228
           ret
229
.fail:
229
.fail:
230
           xor eax, eax
230
           xor eax, eax
231
           not eax
231
           not eax
232
           mov [esi+output], eax
232
           mov [esi+output], eax
233
           mov [esi+out_size], 4
233
           mov [esi+out_size], 4
234
           ret
234
           ret
235
.err:
235
.err:
236
           xor eax, eax
236
           xor eax, eax
237
           not eax
237
           not eax
238
           ret
238
           ret
239
endp
239
endp
240
 
240
 
241
; param
241
; param
242
;  ebx= io_control
242
;  ebx= io_control
243
;
243
;
244
; retval
244
; retval
245
;  eax= error code
245
;  eax= error code
246
 
246
 
247
align 4
247
align 4
248
srv_handlerEx:
248
srv_handlerEx:
249
           test ebx, ebx
249
           test ebx, ebx
250
           jz .fail
250
           jz .fail
251
      ;     add ebx, new_app_base
251
      ;     add ebx, new_app_base
252
 
252
 
253
           mov eax, [ebx+handle]
253
           mov eax, [ebx+handle]
254
           cmp [eax+SRV.magic], ' SRV'
254
           cmp [eax+SRV.magic], ' SRV'
255
	   jne .fail
255
	   jne .fail
256
 
256
 
257
           cmp [eax+SRV.size], SRV_SIZE
257
           cmp [eax+SRV.size], SRV_SIZE
258
	   jne .fail
258
	   jne .fail
259
 
259
 
260
        ;   add [ebx+input], new_app_base
260
        ;   add [ebx+input], new_app_base
261
        ;   add [ebx+output], new_app_base
261
        ;   add [ebx+output], new_app_base
262
 
262
 
263
           stdcall [eax+SRV.srv_proc], ebx
263
           stdcall [eax+SRV.srv_proc], ebx
264
           ret
264
           ret
265
.fail:
265
.fail:
266
           or eax, -1
266
           or eax, -1
267
           ret
267
           ret
268
 
268
 
269
restore  handle
269
restore  handle
270
restore  io_code
270
restore  io_code
271
restore  input
271
restore  input
272
restore  inp_size
272
restore  inp_size
273
restore  output
273
restore  output
274
restore  out_size
274
restore  out_size
275
 
275
 
276
align 4
276
align 4
277
proc get_service stdcall, sz_name:dword
277
proc get_service stdcall, sz_name:dword
278
           mov eax, [sz_name]
278
           mov eax, [sz_name]
279
           test eax, eax
279
           test eax, eax
280
           jnz @F
280
           jnz @F
281
           ret
281
           ret
282
@@:
282
@@:
283
           mov edx, [srv.fd]
283
           mov edx, [srv.fd]
284
@@:
284
@@:
285
           cmp edx, srv.fd-SRV_FD_OFFSET
285
           cmp edx, srv.fd-SRV_FD_OFFSET
286
           je .not_load
286
           je .not_load
287
 
287
 
288
           stdcall strncmp, edx, [sz_name], 16
288
           stdcall strncmp, edx, [sz_name], 16
289
           test eax, eax
289
           test eax, eax
290
           je .ok
290
           je .ok
291
 
291
 
292
           mov edx, [edx+SRV.fd]
292
           mov edx, [edx+SRV.fd]
293
           jmp @B
293
           jmp @B
294
.not_load:
294
.not_load:
295
           pop ebp
295
           pop ebp
296
           jmp load_driver
296
           jmp load_driver
297
.ok:
297
.ok:
298
           mov eax, edx
298
           mov eax, edx
299
           ret
299
           ret
300
endp
300
endp
301
 
301
 
302
align 4
302
align 4
303
reg_service:
303
reg_service:
304
.sz_name equ esp+4
304
.sz_name equ esp+4
305
.handler equ esp+8
305
.handler equ esp+8
306
           mov eax, [.sz_name]
306
           mov eax, [.sz_name]
307
	   test eax, eax
307
	   test eax, eax
308
	   jz .fail
308
	   jz .fail
309
 
309
 
310
           mov ebx, [.handler]
310
           mov ebx, [.handler]
311
	   test ebx, ebx
311
	   test ebx, ebx
312
	   jz .fail
312
	   jz .fail
313
 
313
 
314
           mov eax, SRV_SIZE
314
           mov eax, SRV_SIZE
315
           call malloc           ;call alloc_service
315
           call malloc           ;call alloc_service
316
	   test eax, eax
316
	   test eax, eax
317
	   jz .fail
317
	   jz .fail
318
 
318
 
319
	   mov edi, eax
319
	   mov edi, eax
320
           mov esi, [.sz_name]
320
           mov esi, [.sz_name]
321
           mov ecx, 16/4
321
           mov ecx, 16/4
322
           rep movsd
322
           rep movsd
323
 
323
 
324
           mov [eax+SRV.magic], ' SRV'
324
           mov [eax+SRV.magic], ' SRV'
325
           mov [eax+SRV.size], SRV_SIZE
325
           mov [eax+SRV.size], SRV_SIZE
326
 
326
 
327
           mov ebx, srv.fd-SRV_FD_OFFSET
327
           mov ebx, srv.fd-SRV_FD_OFFSET
328
           mov edx, [ebx+SRV.fd]
328
           mov edx, [ebx+SRV.fd]
329
           mov [eax+SRV.fd], edx
329
           mov [eax+SRV.fd], edx
330
           mov [eax+SRV.bk], ebx
330
           mov [eax+SRV.bk], ebx
331
           mov [ebx+SRV.fd], eax
331
           mov [ebx+SRV.fd], eax
332
           mov [edx+SRV.bk], eax
332
           mov [edx+SRV.bk], eax
333
 
333
 
334
           mov ecx, [.handler]
334
           mov ecx, [.handler]
335
           mov [eax+SRV.srv_proc], ecx
335
           mov [eax+SRV.srv_proc], ecx
336
           ret 8
336
           ret 8
337
.fail:
337
.fail:
338
	   xor eax, eax
338
	   xor eax, eax
339
           ret 8
339
           ret 8
340
 
340
 
341
align 4
341
align 4
342
proc get_proc stdcall, exp:dword, sz_name:dword
342
proc get_proc stdcall, exp:dword, sz_name:dword
343
 
343
 
344
           mov edx, [exp]
344
           mov edx, [exp]
345
.next:
345
.next:
346
           mov eax, [edx]
346
           mov eax, [edx]
347
           test eax, eax
347
           test eax, eax
348
           jz .end
348
           jz .end
349
 
349
 
350
           push edx
350
           push edx
351
           stdcall strncmp, eax, [sz_name], 16
351
           stdcall strncmp, eax, [sz_name], 16
352
           pop edx
352
           pop edx
353
           test eax, eax
353
           test eax, eax
354
           jz .ok
354
           jz .ok
355
 
355
 
356
           add edx,8
356
           add edx,8
357
           jmp .next
357
           jmp .next
358
.ok:
358
.ok:
359
           mov eax, [edx+4]
359
           mov eax, [edx+4]
360
.end:
360
.end:
361
           ret
361
           ret
362
endp
362
endp
363
 
363
 
364
align 4
364
align 4
365
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
365
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
366
 
366
 
367
@@:
367
@@:
368
	   stdcall strncmp, [pSym], [sz_sym], 8
368
	   stdcall strncmp, [pSym], [sz_sym], 8
369
	   test eax,eax
369
	   test eax,eax
370
	   jz .ok
370
	   jz .ok
371
	   add [pSym], 18
371
	   add [pSym], 18
372
	   dec [count]
372
	   dec [count]
373
	   jnz @b
373
	   jnz @b
374
	   xor eax, eax
374
	   xor eax, eax
375
	   ret
375
	   ret
376
.ok:
376
.ok:
377
	   mov ebx, [pSym]
377
	   mov ebx, [pSym]
378
	   mov eax, [ebx+8]
378
	   mov eax, [ebx+8]
379
	   ret
379
	   ret
380
endp
380
endp
381
 
381
 
382
align 4
382
align 4
383
proc get_curr_task
383
proc get_curr_task
384
           mov eax,[CURRENT_TASK]
384
           mov eax,[CURRENT_TASK]
385
           shl eax, 8
385
           shl eax, 8
386
           ret
386
           ret
387
endp
387
endp
388
 
388
 
389
align 4
389
align 4
390
proc get_fileinfo stdcall, file_name:dword, info:dword
390
proc get_fileinfo stdcall, file_name:dword, info:dword
391
           locals
391
           locals
392
             cmd     dd ?
392
             cmd     dd ?
393
             offset  dd ?
393
             offset  dd ?
394
                     dd ?
394
                     dd ?
395
             count   dd ?
395
             count   dd ?
396
             buff    dd ?
396
             buff    dd ?
397
                     db ?
397
                     db ?
398
             name    dd ?
398
             name    dd ?
399
           endl
399
           endl
400
 
400
 
401
           xor eax, eax
401
           xor eax, eax
402
           mov ebx, [file_name]
402
           mov ebx, [file_name]
403
    ;       sub ebx, new_app_base
403
    ;       sub ebx, new_app_base
404
           mov ecx, [info]
404
           mov ecx, [info]
405
    ;       sub ecx, new_app_base
405
    ;       sub ecx, new_app_base
406
 
406
 
407
           mov [cmd], 5
407
           mov [cmd], 5
408
           mov [offset], eax
408
           mov [offset], eax
409
           mov [offset+4], eax
409
           mov [offset+4], eax
410
           mov [count], eax
410
           mov [count], eax
411
           mov [buff], ecx
411
           mov [buff], ecx
412
           mov byte [buff+4], al
412
           mov byte [buff+4], al
413
           mov [name], ebx
413
           mov [name], ebx
414
 
414
 
415
           mov eax, 70
415
           mov eax, 70
416
           lea ebx, [cmd]
416
           lea ebx, [cmd]
417
     ;      sub ebx, new_app_base
417
     ;      sub ebx, new_app_base
418
           int 0x40
418
           int 0x40
419
           ret
419
           ret
420
endp
420
endp
421
 
421
 
422
align 4
422
align 4
423
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
423
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
424
                                     bytes:dword
424
                                     bytes:dword
425
           locals
425
           locals
426
             cmd     dd ?
426
             cmd     dd ?
427
             offset  dd ?
427
             offset  dd ?
428
                     dd ?
428
                     dd ?
429
             count   dd ?
429
             count   dd ?
430
             buff    dd ?
430
             buff    dd ?
431
                     db ?
431
                     db ?
432
             name    dd ?
432
             name    dd ?
433
           endl
433
           endl
434
 
434
 
435
           xor eax, eax
435
           xor eax, eax
436
           mov ebx, [file_name]
436
           mov ebx, [file_name]
437
           mov ecx, [off]
437
           mov ecx, [off]
438
           mov edx, [bytes]
438
           mov edx, [bytes]
439
           mov esi, [buffer]
439
           mov esi, [buffer]
440
    ;       sub ebx, new_app_base
440
    ;       sub ebx, new_app_base
441
    ;       sub esi, new_app_base
441
    ;       sub esi, new_app_base
442
 
442
 
443
           mov [cmd], eax
443
           mov [cmd], eax
444
           mov [offset], ecx
444
           mov [offset], ecx
445
           mov [offset+4], eax
445
           mov [offset+4], eax
446
           mov [count], edx
446
           mov [count], edx
447
           mov [buff], esi
447
           mov [buff], esi
448
           mov byte [buff+4], al
448
           mov byte [buff+4], al
449
           mov [name], ebx
449
           mov [name], ebx
450
 
450
 
451
           mov eax, 70
451
           mov eax, 70
452
           lea ebx, [cmd]
452
           lea ebx, [cmd]
453
     ;      sub ebx, new_app_base
453
     ;      sub ebx, new_app_base
454
           int 0x40
454
           int 0x40
455
           ret
455
           ret
456
endp
456
endp
457
 
457
 
458
; description
458
; description
459
;  allocate kernel memory and loads the specified file
459
;  allocate kernel memory and loads the specified file
460
;
460
;
461
; param
461
; param
462
;  file_name= full path to file
462
;  file_name= full path to file
463
;
463
;
464
; retval
464
; retval
465
;  eax= file image in kernel memory
465
;  eax= file image in kernel memory
466
;  ebx= size of file
466
;  ebx= size of file
467
;
467
;
468
; warging
468
; warging
469
;  You mast call kernel_free() to delete each file
469
;  You mast call kernel_free() to delete each file
470
;  loaded by the load_file() function
470
;  loaded by the load_file() function
471
 
471
 
472
align 4
472
align 4
473
proc load_file stdcall, file_name:dword
473
proc load_file stdcall, file_name:dword
474
           locals
474
           locals
475
             attr       dd ?
475
             attr       dd ?
476
             flags      dd ?
476
             flags      dd ?
477
             cr_time    dd ?
477
             cr_time    dd ?
478
             cr_date    dd ?
478
             cr_date    dd ?
479
             acc_time   dd ?
479
             acc_time   dd ?
480
             acc_date   dd ?
480
             acc_date   dd ?
481
             mod_time   dd ?
481
             mod_time   dd ?
482
             mod_date   dd ?
482
             mod_date   dd ?
483
             file_size  dd ?
483
             file_size  dd ?
484
 
484
 
485
             file       dd ?
485
             file       dd ?
486
             file2      dd ?
486
             file2      dd ?
487
           endl
487
           endl
488
 
488
 
489
           lea eax, [attr]
489
           lea eax, [attr]
490
           stdcall get_fileinfo, [file_name], eax
490
           stdcall get_fileinfo, [file_name], eax
491
           test eax, eax
491
           test eax, eax
492
           jnz .fail
492
           jnz .fail
493
 
493
 
494
           mov eax, [file_size]
494
           mov eax, [file_size]
495
           cmp eax, 1024*1024*16
495
           cmp eax, 1024*1024*16
496
           ja .fail
496
           ja .fail
497
 
497
 
498
           stdcall kernel_alloc, [file_size]
498
           stdcall kernel_alloc, [file_size]
499
           mov [file], eax
499
           mov [file], eax
500
 
500
 
501
           stdcall read_file, [file_name], eax, dword 0, [file_size]
501
           stdcall read_file, [file_name], eax, dword 0, [file_size]
502
           cmp ebx, [file_size]
502
           cmp ebx, [file_size]
503
           jne .cleanup
503
           jne .cleanup
504
 
504
 
505
           mov eax, [file]
505
           mov eax, [file]
506
           cmp dword [eax], 0x4B43504B
506
           cmp dword [eax], 0x4B43504B
507
           jne .exit
507
           jne .exit
508
           mov ebx, [eax+4]
508
           mov ebx, [eax+4]
509
           mov [file_size], ebx
509
           mov [file_size], ebx
510
           stdcall kernel_alloc, ebx
510
           stdcall kernel_alloc, ebx
511
 
511
 
512
           test eax, eax
512
           test eax, eax
513
           jz .cleanup
513
           jz .cleanup
514
 
514
 
515
           mov [file2], eax
515
           mov [file2], eax
516
           stdcall unpack, [file], eax
516
           stdcall unpack, [file], eax
517
           stdcall kernel_free, [file]
517
           stdcall kernel_free, [file]
518
           mov eax, [file2]
518
           mov eax, [file2]
519
           mov ebx, [file_size]
519
           mov ebx, [file_size]
520
.exit:
520
.exit:
521
           push eax
521
           push eax
522
           lea edi, [eax+ebx]     ;cleanup remain space
522
           lea edi, [eax+ebx]     ;cleanup remain space
523
           mov ecx, 4096          ;from file end
523
           mov ecx, 4096          ;from file end
524
           and ebx, 4095
524
           and ebx, 4095
525
           sub ecx, ebx
525
           sub ecx, ebx
526
           xor eax, eax
526
           xor eax, eax
527
           cld
527
           cld
528
           rep stosb
528
           rep stosb
529
           mov ebx, [file_size]
529
           mov ebx, [file_size]
530
           pop eax
530
           pop eax
531
           ret
531
           ret
532
.cleanup:
532
.cleanup:
533
           stdcall kernel_free, [file]
533
           stdcall kernel_free, [file]
534
.fail:
534
.fail:
535
           xor eax, eax
535
           xor eax, eax
536
           xor ebx, ebx
536
           xor ebx, ebx
537
           ret
537
           ret
538
endp
538
endp
539
 
539
 
540
align 4
540
align 4
541
proc get_proc_ex stdcall, proc_name:dword, imports:dword
541
proc get_proc_ex stdcall, proc_name:dword, imports:dword
542
 
542
 
543
.look_up:
543
.look_up:
544
           mov edx, [imports]
544
           mov edx, [imports]
545
           test edx, edx
545
           test edx, edx
546
           jz .end
546
           jz .end
547
           mov edx, [edx]
547
           mov edx, [edx]
548
           test edx, edx
548
           test edx, edx
549
           jz .end
549
           jz .end
550
.next:
550
.next:
551
           mov eax, [edx]
551
           mov eax, [edx]
552
           test eax, eax
552
           test eax, eax
553
           jz .next_table
553
           jz .next_table
554
 
554
 
555
           push edx
555
           push edx
556
           stdcall strncmp, eax, [proc_name], 16
556
           stdcall strncmp, eax, [proc_name], 16
557
           pop edx
557
           pop edx
558
           test eax, eax
558
           test eax, eax
559
           jz .ok
559
           jz .ok
560
 
560
 
561
           add edx,8
561
           add edx,8
562
           jmp .next
562
           jmp .next
563
.next_table:
563
.next_table:
564
           add [imports], 4
564
           add [imports], 4
565
           jmp .look_up
565
           jmp .look_up
566
.ok:
566
.ok:
567
           mov eax, [edx+4]
567
           mov eax, [edx+4]
568
           ret
568
           ret
569
.end:
569
.end:
570
           xor eax, eax
570
           xor eax, eax
571
           ret
571
           ret
572
endp
572
endp
573
 
573
 
574
align 4
574
align 4
575
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
575
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
576
                      sym_count:dword, strings:dword, imports:dword
576
                      sym_count:dword, strings:dword, imports:dword
577
           locals
577
           locals
578
             retval dd ?
578
             retval dd ?
579
           endl
579
           endl
580
 
580
 
581
           mov edi, [symbols]
581
           mov edi, [symbols]
582
           mov [retval], 1
582
           mov [retval], 1
583
.fix:
583
.fix:
584
           movzx ebx, [edi+CSYM.SectionNumber]
584
           movzx ebx, [edi+CSYM.SectionNumber]
585
           test ebx, ebx
585
           test ebx, ebx
586
           jnz .internal
586
           jnz .internal
587
           mov eax, dword [edi+CSYM.Name]
587
           mov eax, dword [edi+CSYM.Name]
588
           test eax, eax
588
           test eax, eax
589
           jnz @F
589
           jnz @F
590
 
590
 
591
           mov edi, [edi+4]
591
           mov edi, [edi+4]
592
           add edi, [strings]
592
           add edi, [strings]
593
@@:
593
@@:
594
           push edi
594
           push edi
595
           stdcall get_proc_ex, edi,[imports]
595
           stdcall get_proc_ex, edi,[imports]
596
           pop edi
596
           pop edi
597
 
597
 
598
           xor ebx, ebx
598
           xor ebx, ebx
599
           test eax, eax
599
           test eax, eax
600
           jnz @F
600
           jnz @F
601
 
601
 
602
           mov esi, msg_unresolved
602
           mov esi, msg_unresolved
603
           call sys_msg_board_str
603
           call sys_msg_board_str
604
           mov esi, edi
604
           mov esi, edi
605
           call sys_msg_board_str
605
           call sys_msg_board_str
606
           mov esi, msg_CR
606
           mov esi, msg_CR
607
           call sys_msg_board_str
607
           call sys_msg_board_str
608
 
608
 
609
           mov [retval],0
609
           mov [retval],0
610
@@:
610
@@:
611
           mov edi, [symbols]
611
           mov edi, [symbols]
612
           mov [edi+CSYM.Value], eax
612
           mov [edi+CSYM.Value], eax
613
           jmp .next
613
           jmp .next
614
.internal:
614
.internal:
615
           dec ebx
615
           dec ebx
616
           shl ebx, 3
616
           shl ebx, 3
617
           lea ebx, [ebx+ebx*4]
617
           lea ebx, [ebx+ebx*4]
618
           add ebx, [sec]
618
           add ebx, [sec]
619
 
619
 
620
           mov eax, [ebx+CFS.VirtualAddress]
620
           mov eax, [ebx+CFS.VirtualAddress]
621
           add [edi+CSYM.Value], eax
621
           add [edi+CSYM.Value], eax
622
.next:
622
.next:
623
           add edi, CSYM_SIZE
623
           add edi, CSYM_SIZE
624
           mov [symbols], edi
624
           mov [symbols], edi
625
           dec [sym_count]
625
           dec [sym_count]
626
           jnz .fix
626
           jnz .fix
627
           mov eax, [retval]
627
           mov eax, [retval]
628
           ret
628
           ret
629
endp
629
endp
630
 
630
 
631
align 4
631
align 4
632
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
632
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
633
	   locals
633
	   locals
634
             n_sec     dd ?
634
             n_sec     dd ?
635
	   endl
635
	   endl
636
 
636
 
637
           mov eax, [coff]
637
           mov eax, [coff]
638
           movzx ebx, [eax+CFH.nSections]
638
           movzx ebx, [eax+CFH.nSections]
639
           mov [n_sec], ebx
639
           mov [n_sec], ebx
640
.fix_sec:
640
.fix_sec:
641
           mov esi, [sec]
641
           mov esi, [sec]
642
	   mov edi, [esi+CFS.PtrReloc]
642
	   mov edi, [esi+CFS.PtrReloc]
643
           add edi, [coff]
643
           add edi, [coff]
644
 
644
 
645
           movzx ecx, [esi+CFS.NumReloc]
645
           movzx ecx, [esi+CFS.NumReloc]
646
           test ecx, ecx
646
           test ecx, ecx
647
           jz .next
647
           jz .next
648
.next_reloc:
648
.next_reloc:
649
	   mov ebx, [edi+CRELOC.SymIndex]
649
	   mov ebx, [edi+CRELOC.SymIndex]
650
	   add ebx,ebx
650
	   add ebx,ebx
651
	   lea ebx,[ebx+ebx*8]
651
	   lea ebx,[ebx+ebx*8]
652
           add ebx, [sym]
652
           add ebx, [sym]
653
 
653
 
654
           mov edx, [ebx+CSYM.Value]
654
           mov edx, [ebx+CSYM.Value]
655
 
655
 
656
           cmp [edi+CRELOC.Type], 6
656
           cmp [edi+CRELOC.Type], 6
657
           je .dir_32
657
           je .dir_32
658
 
658
 
659
           cmp [edi+CRELOC.Type], 20
659
           cmp [edi+CRELOC.Type], 20
660
           jne .next_reloc
660
           jne .next_reloc
661
.rel_32:
661
.rel_32:
662
	   mov eax, [edi+CRELOC.VirtualAddress]
662
	   mov eax, [edi+CRELOC.VirtualAddress]
663
           add eax, [esi+CFS.VirtualAddress]
663
           add eax, [esi+CFS.VirtualAddress]
664
           sub edx, eax
664
           sub edx, eax
665
           sub edx, 4
665
           sub edx, 4
666
           jmp .fix
666
           jmp .fix
667
.dir_32:
667
.dir_32:
668
	   mov eax, [edi+CRELOC.VirtualAddress]
668
	   mov eax, [edi+CRELOC.VirtualAddress]
669
           add eax, [esi+CFS.VirtualAddress]
669
           add eax, [esi+CFS.VirtualAddress]
670
.fix:
670
.fix:
671
           add [eax], edx
671
           add [eax], edx
672
           add edi, 10
672
           add edi, 10
673
           dec ecx
673
           dec ecx
674
           jnz .next_reloc
674
           jnz .next_reloc
675
.next:
675
.next:
676
           add [sec], COFF_SECTION_SIZE
676
           add [sec], COFF_SECTION_SIZE
677
           dec [n_sec]
677
           dec [n_sec]
678
           jnz .fix_sec
678
           jnz .fix_sec
679
.exit:
679
.exit:
680
	   ret
680
	   ret
681
endp
681
endp
682
 
682
 
683
align 4
683
align 4
684
proc load_driver stdcall, driver_name:dword
684
proc load_driver stdcall, driver_name:dword
685
           locals
685
           locals
686
             coff      dd ?
686
             coff      dd ?
687
             sym       dd ?
687
             sym       dd ?
688
             strings   dd ?
688
             strings   dd ?
689
             img_size  dd ?
689
             img_size  dd ?
690
             img_base  dd ?
690
             img_base  dd ?
691
             start     dd ?
691
             start     dd ?
692
 
692
 
693
             exports   dd ?   ;fake exports table
693
             exports   dd ?   ;fake exports table
694
                       dd ?
694
                       dd ?
695
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
695
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
696
           endl
696
           endl
697
 
697
 
698
           lea     edx, [file_name]
698
           lea     edx, [file_name]
699
           mov     dword [edx], '/rd/'
699
           mov     dword [edx], '/rd/'
700
           mov     dword [edx+4], '1/dr'
700
           mov     dword [edx+4], '1/dr'
701
           mov     dword [edx+8], 'iver'
701
           mov     dword [edx+8], 'iver'
702
           mov     word [edx+12], 's/'
702
           mov     word [edx+12], 's/'
703
           mov     esi, [driver_name]
703
           mov     esi, [driver_name]
704
           lea     edi, [edx+14]
704
           lea     edi, [edx+14]
705
           mov     ecx, 16
705
           mov     ecx, 16
706
@@:
706
@@:
707
           lodsb
707
           lodsb
708
           test    al, al
708
           test    al, al
709
           jz      @f
709
           jz      @f
710
           stosb
710
           stosb
711
           loop    @b
711
           loop    @b
712
@@:
712
@@:
713
           mov     dword [edi], '.obj'
713
           mov     dword [edi], '.obj'
714
           mov     byte [edi+4], 0
714
           mov     byte [edi+4], 0
715
           stdcall load_file, edx
715
           stdcall load_file, edx
716
 
716
 
717
           test eax, eax
717
           test eax, eax
718
           jz .exit
718
           jz .exit
719
 
719
 
720
           mov [coff], eax
720
           mov [coff], eax
721
 
721
 
722
           movzx ecx, [eax+CFH.nSections]
722
           movzx ecx, [eax+CFH.nSections]
723
           xor ebx, ebx
723
           xor ebx, ebx
724
 
724
 
725
           lea edx, [eax+20]
725
           lea edx, [eax+20]
726
@@:
726
@@:
727
           add ebx, [edx+CFS.SizeOfRawData]
727
           add ebx, [edx+CFS.SizeOfRawData]
728
           add ebx, 15
728
           add ebx, 15
729
           and ebx, not 15
729
           and ebx, not 15
730
           add edx, COFF_SECTION_SIZE
730
           add edx, COFF_SECTION_SIZE
731
           dec ecx
731
           dec ecx
732
           jnz @B
732
           jnz @B
733
           mov [img_size], ebx
733
           mov [img_size], ebx
734
 
734
 
735
           stdcall kernel_alloc, ebx
735
           stdcall kernel_alloc, ebx
736
           test eax, eax
736
           test eax, eax
737
           jz .fail
737
           jz .fail
738
           mov [img_base], eax
738
           mov [img_base], eax
739
 
739
 
740
           mov edi, eax
740
           mov edi, eax
741
           xor eax, eax
741
           xor eax, eax
742
           mov ecx, [img_size]
742
           mov ecx, [img_size]
743
           add ecx, 4095
743
           add ecx, 4095
744
           and ecx, not 4095
744
           and ecx, not 4095
745
           shr ecx, 2
745
           shr ecx, 2
746
           cld
746
           cld
747
           rep stosd
747
           rep stosd
748
 
748
 
749
           mov edx, [coff]
749
           mov edx, [coff]
750
           movzx ebx, [edx+CFH.nSections]
750
           movzx ebx, [edx+CFH.nSections]
751
           mov edi, [img_base]
751
           mov edi, [img_base]
752
           lea eax, [edx+20]
752
           lea eax, [edx+20]
753
@@:
753
@@:
754
           mov [eax+CFS.VirtualAddress], edi
754
           mov [eax+CFS.VirtualAddress], edi
755
           mov esi, [eax+CFS.PtrRawData]
755
           mov esi, [eax+CFS.PtrRawData]
756
           test esi, esi
756
           test esi, esi
757
           jnz .copy
757
           jnz .copy
758
           add edi, [eax+CFS.SizeOfRawData]
758
           add edi, [eax+CFS.SizeOfRawData]
759
           jmp .next
759
           jmp .next
760
.copy:
760
.copy:
761
           add esi, edx
761
           add esi, edx
762
           mov ecx, [eax+CFS.SizeOfRawData]
762
           mov ecx, [eax+CFS.SizeOfRawData]
763
           cld
763
           cld
764
           rep movsb
764
           rep movsb
765
.next:
765
.next:
766
           add edi, 15
766
           add edi, 15
767
           and edi, not 15
767
           and edi, not 15
768
           add eax, COFF_SECTION_SIZE
768
           add eax, COFF_SECTION_SIZE
769
           dec ebx
769
           dec ebx
770
           jnz @B
770
           jnz @B
771
 
771
 
772
           mov ebx, [edx+CFH.pSymTable]
772
           mov ebx, [edx+CFH.pSymTable]
773
           add ebx, edx
773
           add ebx, edx
774
           mov [sym], ebx
774
           mov [sym], ebx
775
           mov ecx, [edx+CFH.nSymbols]
775
           mov ecx, [edx+CFH.nSymbols]
776
           add ecx,ecx
776
           add ecx,ecx
777
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
777
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
778
           add ecx, [sym]
778
           add ecx, [sym]
779
           mov [strings], ecx
779
           mov [strings], ecx
780
 
780
 
781
           lea ebx, [exports]
781
           lea ebx, [exports]
782
           mov dword [ebx], kernel_export
782
           mov dword [ebx], kernel_export
783
           mov dword [ebx+4], 0
783
           mov dword [ebx+4], 0
784
           lea eax, [edx+20]
784
           lea eax, [edx+20]
785
 
785
 
786
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
786
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
787
                                     [strings], ebx
787
                                     [strings], ebx
788
           test eax, eax
788
           test eax, eax
789
           jz .link_fail
789
           jz .link_fail
790
 
790
 
791
           mov ebx, [coff]
791
           mov ebx, [coff]
792
           add ebx, 20
792
           add ebx, 20
793
           stdcall fix_coff_relocs, [coff], ebx, [sym]
793
           stdcall fix_coff_relocs, [coff], ebx, [sym]
794
 
794
 
795
           mov ebx, [coff]
795
           mov ebx, [coff]
796
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
796
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
797
           test eax, eax
797
           test eax, eax
798
           jz .link_fail
798
           jz .link_fail
799
 
799
 
800
           mov eax, [eax]
800
           mov eax, [eax]
801
           shr eax, 16
801
           shr eax, 16
802
           cmp eax, DRV_COMPAT
802
           cmp eax, DRV_COMPAT
803
           jb .ver_fail
803
           jb .ver_fail
804
 
804
 
805
           cmp eax, DRV_CURRENT
805
           cmp eax, DRV_CURRENT
806
           ja .ver_fail
806
           ja .ver_fail
807
 
807
 
808
           mov ebx, [coff]
808
           mov ebx, [coff]
809
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
809
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
810
           mov [start], eax
810
           mov [start], eax
811
 
811
 
812
           stdcall kernel_free, [coff]
812
           stdcall kernel_free, [coff]
813
 
813
 
814
           mov ebx, [start]
814
           mov ebx, [start]
815
           stdcall ebx, DRV_ENTRY
815
           stdcall ebx, DRV_ENTRY
816
           test eax, eax
816
           test eax, eax
817
           jnz .ok
817
           jnz .ok
818
 
818
 
819
           stdcall kernel_free, [img_base]
819
           stdcall kernel_free, [img_base]
820
           xor eax, eax
820
           xor eax, eax
821
           ret
821
           ret
822
.ok:
822
.ok:
823
           mov ebx, [img_base]
823
           mov ebx, [img_base]
824
           mov [eax+SRV.base], ebx
824
           mov [eax+SRV.base], ebx
825
           mov ecx, [start]
825
           mov ecx, [start]
826
           mov [eax+SRV.entry], ecx
826
           mov [eax+SRV.entry], ecx
827
           ret
827
           ret
828
 
828
 
829
.ver_fail:
829
.ver_fail:
830
           mov esi, msg_CR
830
           mov esi, msg_CR
831
           call sys_msg_board_str
831
           call sys_msg_board_str
832
           mov esi, [driver_name]
832
           mov esi, [driver_name]
833
           call sys_msg_board_str
833
           call sys_msg_board_str
834
           mov esi, msg_CR
834
           mov esi, msg_CR
835
           call sys_msg_board_str
835
           call sys_msg_board_str
836
           mov esi, msg_version
836
           mov esi, msg_version
837
           call sys_msg_board_str
837
           call sys_msg_board_str
838
           mov esi, msg_www
838
           mov esi, msg_www
839
           call sys_msg_board_str
839
           call sys_msg_board_str
840
           jmp .cleanup
840
           jmp .cleanup
841
 
841
 
842
.link_fail:
842
.link_fail:
843
           mov esi, msg_module
843
           mov esi, msg_module
844
           call sys_msg_board_str
844
           call sys_msg_board_str
845
           mov esi, [driver_name]
845
           mov esi, [driver_name]
846
           call sys_msg_board_str
846
           call sys_msg_board_str
847
           mov esi, msg_CR
847
           mov esi, msg_CR
848
           call sys_msg_board_str
848
           call sys_msg_board_str
849
.cleanup:
849
.cleanup:
850
           stdcall kernel_free,[img_base]
850
           stdcall kernel_free,[img_base]
851
.fail:
851
.fail:
852
           stdcall kernel_free, [coff]
852
           stdcall kernel_free, [coff]
853
.exit:
853
.exit:
854
           xor eax, eax
854
           xor eax, eax
855
           ret
855
           ret
856
endp
856
endp
857
 
857
 
858
align 4
858
align 4
859
proc load_library stdcall, file_name:dword
859
proc load_library stdcall, file_name:dword
860
           locals
860
           locals
861
             coff      dd ?
861
             coff      dd ?
862
             sym       dd ?
862
             sym       dd ?
863
             strings   dd ?
863
             strings   dd ?
864
             img_size  dd ?
864
             img_size  dd ?
865
             img_base  dd ?
865
             img_base  dd ?
866
             exports   dd ?
866
             exports   dd ?
867
           endl
867
           endl
868
 
868
 
869
           cli
869
           cli
870
 
870
 
871
           stdcall load_file, [file_name]
871
           stdcall load_file, [file_name]
872
           test eax, eax
872
           test eax, eax
873
           jz .fail
873
           jz .fail
874
 
874
 
875
           mov [coff], eax
875
           mov [coff], eax
876
           movzx ecx, [eax+CFH.nSections]
876
           movzx ecx, [eax+CFH.nSections]
877
           xor ebx, ebx
877
           xor ebx, ebx
878
 
878
 
879
           lea edx, [eax+20]
879
           lea edx, [eax+20]
880
@@:
880
@@:
881
           add ebx, [edx+CFS.SizeOfRawData]
881
           add ebx, [edx+CFS.SizeOfRawData]
882
           add ebx, 15
882
           add ebx, 15
883
           and ebx, not 15
883
           and ebx, not 15
884
           add edx, COFF_SECTION_SIZE
884
           add edx, COFF_SECTION_SIZE
885
           dec ecx
885
           dec ecx
886
           jnz @B
886
           jnz @B
887
           mov [img_size], ebx
887
           mov [img_size], ebx
888
 
888
 
889
           call init_heap
889
           call init_heap
890
           stdcall user_alloc, [img_size]
890
           stdcall user_alloc, [img_size]
891
 
891
 
892
           test eax, eax
892
           test eax, eax
893
           jz .fail
893
           jz .fail
894
           mov [img_base], eax
894
           mov [img_base], eax
895
 
895
 
896
           mov edx, [coff]
896
           mov edx, [coff]
897
           movzx ebx, [edx+CFH.nSections]
897
           movzx ebx, [edx+CFH.nSections]
898
           mov edi, [img_base]
898
           mov edi, [img_base]
899
           lea eax, [edx+20]
899
           lea eax, [edx+20]
900
@@:
900
@@:
901
           mov [eax+CFS.VirtualAddress], edi
901
           mov [eax+CFS.VirtualAddress], edi
902
           mov esi, [eax+CFS.PtrRawData]
902
           mov esi, [eax+CFS.PtrRawData]
903
           test esi, esi
903
           test esi, esi
904
           jnz .copy
904
           jnz .copy
905
           add edi, [eax+CFS.SizeOfRawData]
905
           add edi, [eax+CFS.SizeOfRawData]
906
           jmp .next
906
           jmp .next
907
.copy:
907
.copy:
908
           add esi, edx
908
           add esi, edx
909
    ;       add edi, new_app_base
909
    ;       add edi, new_app_base
910
           mov ecx, [eax+CFS.SizeOfRawData]
910
           mov ecx, [eax+CFS.SizeOfRawData]
911
           cld
911
           cld
912
           rep movsb
912
           rep movsb
913
.next:
913
.next:
914
           add edi, 15 ;-new_app_base
914
           add edi, 15 ;-new_app_base
915
           and edi, -16
915
           and edi, -16
916
           add eax, COFF_SECTION_SIZE
916
           add eax, COFF_SECTION_SIZE
917
           dec ebx
917
           dec ebx
918
           jnz @B
918
           jnz @B
919
 
919
 
920
           mov ebx, [edx+CFH.pSymTable]
920
           mov ebx, [edx+CFH.pSymTable]
921
           add ebx, edx
921
           add ebx, edx
922
           mov [sym], ebx
922
           mov [sym], ebx
923
           mov ecx, [edx+CFH.nSymbols]
923
           mov ecx, [edx+CFH.nSymbols]
924
           add ecx,ecx
924
           add ecx,ecx
925
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
925
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
926
           add ecx, [sym]
926
           add ecx, [sym]
927
           mov [strings], ecx
927
           mov [strings], ecx
928
 
928
 
929
           lea eax, [edx+20]
929
           lea eax, [edx+20]
930
 
930
 
931
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
931
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
932
                                     [strings], dword 0
932
                                     [strings], dword 0
933
           test eax, eax
933
           test eax, eax
934
           jnz @F
934
           jnz @F
935
 
935
 
936
@@:
936
@@:
937
           mov edx, [coff]
937
           mov edx, [coff]
938
           movzx ebx, [edx+CFH.nSections]
938
           movzx ebx, [edx+CFH.nSections]
939
           mov edi, new_app_base
939
           mov edi, new_app_base
940
           lea eax, [edx+20]
940
           lea eax, [edx+20]
941
@@:
941
@@:
942
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
942
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
943
           add eax, COFF_SECTION_SIZE
943
           add eax, COFF_SECTION_SIZE
944
           dec ebx
944
           dec ebx
945
           jnz @B
945
           jnz @B
946
 
946
 
947
           add edx, 20
947
           add edx, 20
948
           stdcall fix_coff_relocs, [coff], edx, [sym]
948
           stdcall fix_coff_relocs, [coff], edx, [sym]
949
 
949
 
950
           mov ebx, [coff]
950
           mov ebx, [coff]
951
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
951
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
952
           mov [exports], eax
952
           mov [exports], eax
953
 
953
 
954
           stdcall kernel_free, [coff]
954
           stdcall kernel_free, [coff]
955
           mov eax, [exports]
955
           mov eax, [exports]
956
           ret
956
           ret
957
.fail:
957
.fail:
958
           xor eax, eax
958
           xor eax, eax
959
           ret
959
           ret
960
endp
960
endp
961
 
961
 
962
align 4
962
align 4
963
proc stop_all_services
963
proc stop_all_services
964
 
964
 
965
           mov edx, [srv.fd]
965
           mov edx, [srv.fd]
966
.next:
966
.next:
967
           cmp edx,  srv.fd-SRV_FD_OFFSET
967
           cmp edx,  srv.fd-SRV_FD_OFFSET
968
           je .done
968
           je .done
969
           cmp [edx+SRV.magic], ' SRV'
969
           cmp [edx+SRV.magic], ' SRV'
970
           jne .next
970
           jne .next
971
           cmp [edx+SRV.size], SRV_SIZE
971
           cmp [edx+SRV.size], SRV_SIZE
972
           jne .next
972
           jne .next
973
           mov ebx, [edx+SRV.entry]
973
           mov ebx, [edx+SRV.entry]
974
           mov edx, [edx+SRV.fd]
974
           mov edx, [edx+SRV.fd]
975
           push edx
975
           push edx
976
           stdcall ebx, dword -1
976
           stdcall ebx, dword -1
977
           pop edx
977
           pop edx
978
           jmp .next
978
           jmp .next
979
.done:
979
.done:
980
           ret
980
           ret
981
endp
981
endp
982
 
982
 
983
; param
983
; param
984
;  eax= size
984
;  eax= size
985
;  ebx= pid
985
;  ebx= pid
986
 
986
 
987
align 4
987
align 4
988
create_kernel_object:
988
create_kernel_object:
989
 
989
 
990
           push ebx
990
           push ebx
991
           call malloc
991
           call malloc
992
           pop ebx
992
           pop ebx
993
           test eax, eax
993
           test eax, eax
994
           jz .fail
994
           jz .fail
995
 
995
 
996
           mov ecx,[CURRENT_TASK]
996
           mov ecx,[CURRENT_TASK]
997
           shl ecx,8
997
           shl ecx,8
998
           add ecx, SLOT_BASE+APP_OBJ_OFFSET
998
           add ecx, SLOT_BASE+APP_OBJ_OFFSET
999
 
999
 
1000
           pushfd
1000
           pushfd
1001
           cli
1001
           cli
1002
           mov edx, [ecx+APPOBJ.fd]
1002
           mov edx, [ecx+APPOBJ.fd]
1003
           mov [eax+APPOBJ.fd], edx
1003
           mov [eax+APPOBJ.fd], edx
1004
           mov [eax+APPOBJ.bk], ecx
1004
           mov [eax+APPOBJ.bk], ecx
1005
           mov [eax+APPOBJ.pid], ebx
1005
           mov [eax+APPOBJ.pid], ebx
1006
 
1006
 
1007
           mov [ecx+APPOBJ.fd], eax
1007
           mov [ecx+APPOBJ.fd], eax
1008
           mov [edx+APPOBJ.bk], eax
1008
           mov [edx+APPOBJ.bk], eax
1009
           popfd
1009
           popfd
1010
.fail:
1010
.fail:
1011
           ret
1011
           ret
1012
 
1012
 
1013
; param
1013
; param
1014
;  eax= object
1014
;  eax= object
1015
 
1015
 
1016
align 4
1016
align 4
1017
destroy_kernel_object:
1017
destroy_kernel_object:
1018
 
1018
 
1019
           pushfd
1019
           pushfd
1020
           cli
1020
           cli
1021
           mov ebx, [eax+APPOBJ.fd]
1021
           mov ebx, [eax+APPOBJ.fd]
1022
           mov ecx, [eax+APPOBJ.bk]
1022
           mov ecx, [eax+APPOBJ.bk]
1023
           mov [ebx+APPOBJ.bk], ecx
1023
           mov [ebx+APPOBJ.bk], ecx
1024
           mov [ecx+APPOBJ.fd], ebx
1024
           mov [ecx+APPOBJ.fd], ebx
1025
           popfd
1025
           popfd
1026
 
1026
 
1027
           xor edx, edx        ;clear common header
1027
           xor edx, edx        ;clear common header
1028
           mov [eax], edx
1028
           mov [eax], edx
1029
           mov [eax+4], edx
1029
           mov [eax+4], edx
1030
           mov [eax+8], edx
1030
           mov [eax+8], edx
1031
           mov [eax+12], edx
1031
           mov [eax+12], edx
1032
           mov [eax+16], edx
1032
           mov [eax+16], edx
1033
 
1033
 
1034
           call free           ;release object memory
1034
           call free           ;release object memory
1035
           ret
1035
           ret