Subversion Repositories Kolibri OS

Rev

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

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