Subversion Repositories Kolibri OS

Rev

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

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