Subversion Repositories Kolibri OS

Rev

Rev 278 | Rev 287 | 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  2  ;minimal required drivers version
281 serge 4
DRV_CURRENT  equ  2  ;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
           stdcall find_service, [sz_name]
301
           test eax, eax
302
           jz @F
278 serge 303
           stdcall load_driver, eax
304
@@:
164 serge 305
           ret
188 serge 306
.ok:
164 serge 307
           mov eax, edx
278 serge 308
           ret
188 serge 309
endp
164 serge 310
311
 
312
proc find_service stdcall ,sz_name:dword
313
314
 
315
	   test eax, eax
316
	   jz .fail
317
318
 
319
@@:
320
           mov eax, [esi]
321
           test eax, eax
322
           jz .fail
323
           push esi
324
           stdcall strncmp, eax, [sz_name], 16
325
           pop esi
326
           test eax, eax
327
           je .ok
328
329
 
330
           jmp @B
331
.ok:
332
           mov eax, [esi+4]
333
           ret
334
.fail:
335
           xor eax, eax
336
           ret
337
endp
338
339
 
340
reg_service:
278 serge 341
.sz_name equ esp+4
342
.handler equ esp+8
343
           mov eax, [.sz_name]
344
	   test eax, eax
164 serge 345
	   jz .fail
346
347
 
278 serge 348
	   test ebx, ebx
164 serge 349
	   jz .fail
350
351
 
278 serge 352
           call malloc           ;call alloc_service
353
	   test eax, eax
164 serge 354
	   jz .fail
355
356
 
357
           mov esi, [.sz_name]
278 serge 358
           mov ecx, 16/4
359
           rep movsd
360
164 serge 361
 
278 serge 362
           mov [eax+SRV.size], SRV_SIZE
363
364
 
365
           mov edx, [ebx+SRV.fd]
366
           mov [eax+SRV.fd], edx
367
           mov [eax+SRV.bk], ebx
368
           mov [ebx+SRV.fd], eax
369
           mov [edx+SRV.bk], eax
370
371
 
372
           mov [eax+SRV.srv_proc], ecx
373
           ret 8
281 serge 374
.fail:
164 serge 375
	   xor eax, eax
376
           ret 8
281 serge 377
164 serge 378
 
379
proc get_proc stdcall, exp:dword, sz_name:dword
380
381
 
382
.next:
383
           mov eax, [edx]
384
           test eax, eax
385
           jz .end
386
387
 
388
           stdcall strncmp, eax, [sz_name], 16
389
           pop edx
390
           test eax, eax
391
           jz .ok
392
393
 
394
           jmp .next
395
.ok:
396
           mov eax, [edx+4]
397
.end:
398
           ret
399
endp
400
401
 
402
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
403
404
 
405
	   stdcall strncmp, [pSym], [sz_sym], 8
406
	   test eax,eax
407
	   jz .ok
408
	   add [pSym], 18
409
	   dec [count]
410
	   jnz @b
411
	   xor eax, eax
412
	   ret
413
.ok:
414
	   mov ebx, [pSym]
415
	   mov eax, [ebx+8]
416
	   ret
417
endp
418
419
 
420
proc get_curr_task
188 serge 421
           mov eax,[CURRENT_TASK]
422
           shl eax, 8
423
           ret
424
endp
425
164 serge 426
 
188 serge 427
proc get_fileinfo stdcall, file_name:dword, info:dword
428
           locals
429
             cmd     dd ?
430
             offset  dd ?
431
                     dd ?
432
             count   dd ?
433
             buff    dd ?
434
                     db ?
435
             name    dd ?
436
           endl
437
164 serge 438
 
188 serge 439
           mov ebx, [file_name]
440
           sub ebx, new_app_base
441
           mov ecx, [info]
442
           sub ecx, new_app_base
443
164 serge 444
 
188 serge 445
           mov [offset], eax
446
           mov [offset+4], eax
447
           mov [count], eax
448
           mov [buff], ecx
449
           mov byte [buff+4], al
450
           mov [name], ebx
451
164 serge 452
 
188 serge 453
           lea ebx, [cmd]
454
           sub ebx, new_app_base
455
           int 0x40
456
           ret
457
endp
458
164 serge 459
 
188 serge 460
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
461
                                     bytes:dword
462
           locals
463
             cmd     dd ?
464
             offset  dd ?
465
                     dd ?
466
             count   dd ?
467
             buff    dd ?
468
                     db ?
469
             name    dd ?
470
           endl
471
164 serge 472
 
188 serge 473
           mov ebx, [file_name]
474
           mov ecx, [off]
475
           mov edx, [bytes]
476
           mov esi, [buffer]
477
           sub ebx, new_app_base
478
           sub esi, new_app_base
479
164 serge 480
 
188 serge 481
           mov [offset], ecx
482
           mov [offset+4], eax
483
           mov [count], edx
484
           mov [buff], esi
485
           mov byte [buff+4], al
486
           mov [name], ebx
487
488
 
489
           lea ebx, [cmd]
490
           sub ebx, new_app_base
491
           int 0x40
492
           ret
493
endp
494
495
 
496
proc load_file stdcall, file_name:dword
497
           locals
498
             attr       dd ?
499
             flags      dd ?
500
             cr_time    dd ?
501
             cr_date    dd ?
502
             acc_time   dd ?
503
             acc_date   dd ?
504
             mod_time   dd ?
505
             mod_date   dd ?
506
             file_size  dd ?
507
508
 
509
             file2      dd ?
211 serge 510
           endl
188 serge 511
512
 
513
           stdcall get_fileinfo, [file_name], eax
514
           test eax, eax
164 serge 515
           jnz .fail
188 serge 516
164 serge 517
 
206 serge 518
           cmp eax, 1024*1024*16
237 serge 519
           ja .fail
520
206 serge 521
 
188 serge 522
           mov [file], eax
523
164 serge 524
 
188 serge 525
           cmp ebx, [file_size]
526
           jne .cleanup
527
211 serge 528
 
188 serge 529
           cmp dword [eax], 0x4B43504B
211 serge 530
           jne .exit
531
           mov ebx, [eax+4]
237 serge 532
           mov [file_size], ebx
533
           stdcall kernel_alloc, ebx
534
211 serge 535
 
536
           jz .cleanup
537
538
 
539
           stdcall unpack, [file], eax
540
           stdcall kernel_free, [file]
541
           mov eax, [file2]
542
           mov ebx, [file_size]
237 serge 543
.exit:
211 serge 544
           push eax
269 serge 545
           lea edi, [eax+ebx]     ;cleanup remain space
546
           mov ecx, ebx          ;from file end
547
           add ecx, 4095
548
           and ecx, not 4095
549
           sub ecx, ebx
550
           xor eax, eax
551
           cld
552
           rep stosb
553
           pop eax
554
           ret
188 serge 555
.cleanup:
556
           stdcall kernel_free, [file]
557
.fail:
558
           xor eax, eax
559
           xor ebx, ebx
237 serge 560
           ret
188 serge 561
endp
562
164 serge 563
 
188 serge 564
proc get_proc_ex stdcall, proc_name:dword, imports:dword
565
566
 
567
           mov edx, [imports]
568
           test edx, edx
198 serge 569
           jz .end
570
           mov edx, [edx]
188 serge 571
           test edx, edx
572
           jz .end
573
.next:
574
           mov eax, [edx]
575
           test eax, eax
164 serge 576
           jz .next_table
188 serge 577
164 serge 578
 
188 serge 579
           stdcall strncmp, eax, [proc_name], 16
580
           pop edx
581
           test eax, eax
582
           jz .ok
583
164 serge 584
 
188 serge 585
           jmp .next
586
.next_table:
587
           add [imports], 4
588
           jmp .look_up
589
.ok:
590
           mov eax, [edx+4]
591
           ret
592
.end:
593
           xor eax, eax
594
           ret
595
endp
596
164 serge 597
 
188 serge 598
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
599
                      sym_count:dword, strings:dword, imports:dword
600
           locals
601
             retval dd ?
602
           endl
603
164 serge 604
 
188 serge 605
           mov [retval], 1
606
.fix:
607
           movzx ebx, [edi+CSYM.SectionNumber]
608
           test ebx, ebx
609
           jnz .internal
610
           mov eax, dword [edi+CSYM.Name]
611
           test eax, eax
612
           jnz @F
613
164 serge 614
 
188 serge 615
           add edi, [strings]
616
@@:
617
           push edi
618
           stdcall get_proc_ex, edi,[imports]
619
           pop edi
620
164 serge 621
 
188 serge 622
           test eax, eax
623
           jnz @F
624
164 serge 625
 
188 serge 626
           call sys_msg_board_str
627
           mov esi, edi
628
           call sys_msg_board_str
629
           mov esi, msg_CR
630
           call sys_msg_board_str
631
164 serge 632
 
188 serge 633
@@:
634
           mov edi, [symbols]
635
           mov [edi+CSYM.Value], eax
636
           jmp .next
637
.internal:
638
           dec ebx
639
           shl ebx, 3
640
           lea ebx, [ebx+ebx*4]
641
           add ebx, [sec]
642
643
 
644
           add [edi+CSYM.Value], eax
645
.next:
646
           add edi, CSYM_SIZE
647
           mov [symbols], edi
648
           dec [sym_count]
649
           jnz .fix
650
           mov eax, [retval]
651
           ret
652
endp
164 serge 653
654
 
655
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
188 serge 656
	   locals
164 serge 657
             n_sec     dd ?
188 serge 658
	   endl
164 serge 659
660
 
188 serge 661
           movzx ebx, [eax+CFH.nSections]
662
           mov [n_sec], ebx
663
.fix_sec:
664
           mov esi, [sec]
665
	   mov edi, [esi+CFS.PtrReloc]
164 serge 666
           add edi, [coff]
188 serge 667
164 serge 668
 
188 serge 669
           test ecx, ecx
670
           jz .next
671
.next_reloc:
672
	   mov ebx, [edi+CRELOC.SymIndex]
164 serge 673
	   add ebx,ebx
674
	   lea ebx,[ebx+ebx*8]
675
           add ebx, [sym]
188 serge 676
164 serge 677
 
188 serge 678
164 serge 679
 
188 serge 680
           je .dir_32
681
164 serge 682
 
188 serge 683
           jne .next_reloc
684
.rel_32:
685
	   mov eax, [edi+CRELOC.VirtualAddress]
164 serge 686
           add eax, [esi+CFS.VirtualAddress]
188 serge 687
           sub edx, eax
688
           sub edx, 4
689
           jmp .fix
690
.dir_32:
691
	   mov eax, [edi+CRELOC.VirtualAddress]
692
           add eax, [esi+CFS.VirtualAddress]
693
.fix:
694
           add [eax], edx
695
           add edi, 10
696
           dec ecx
697
           jnz .next_reloc
698
.next:
699
           add [sec], COFF_SECTION_SIZE
206 serge 700
           dec [n_sec]
188 serge 701
           jnz .fix_sec
702
.exit:
164 serge 703
	   ret
704
endp
705
706
 
188 serge 707
proc load_driver stdcall, file_name:dword
708
           locals
709
             coff      dd ?
710
             sym       dd ?
711
             strings   dd ?
712
             img_size  dd ?
713
             img_base  dd ?
714
             start     dd ?
715
716
 
717
                       dd ?
718
           endl
719
720
 
721
214 serge 722
 
188 serge 723
           jz .exit
227 serge 724
188 serge 725
 
726
727
 
728
           xor ebx, ebx
729
730
 
731
@@:
732
           add ebx, [edx+CFS.SizeOfRawData]
733
           add ebx, 15
734
           and ebx, not 15
735
           add edx, COFF_SECTION_SIZE
206 serge 736
           dec ecx
188 serge 737
           jnz @B
738
           mov [img_size], ebx
739
740
 
741
           test eax, eax
742
           jz .fail
743
           mov [img_base], eax
744
745
 
746
           xor eax, eax
747
           mov ecx, [img_size]
748
           add ecx, 4095
749
           and ecx, not 4095
750
           shr ecx, 2
751
           cld
752
           rep stosd
753
754
 
755
           movzx ebx, [edx+CFH.nSections]
756
           mov edi, [img_base]
757
           lea eax, [edx+20]
758
@@:
759
           mov [eax+CFS.VirtualAddress], edi
760
           mov esi, [eax+CFS.PtrRawData]
761
           test esi, esi
762
           jnz .copy
763
           add edi, [eax+CFS.SizeOfRawData]
764
           jmp .next
765
.copy:
766
           add esi, edx
767
           mov ecx, [eax+CFS.SizeOfRawData]
768
           cld
769
           rep movsb
770
.next:
771
           add edi, 15
772
           and edi, not 15
773
           add eax, COFF_SECTION_SIZE
206 serge 774
           dec ebx
188 serge 775
           jnz @B
776
777
 
778
           add ebx, edx
779
           mov [sym], ebx
780
           mov ecx, [edx+CFH.nSymbols]
781
           add ecx,ecx
782
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
783
           add ecx, [sym]
784
           mov [strings], ecx
785
786
 
787
           mov dword [ebx], kernel_export
788
           mov dword [ebx+4], 0
789
           lea eax, [edx+20]
790
791
 
792
                                     [strings], ebx
793
           test eax, eax
794
           jz .link_fail
227 serge 795
188 serge 796
 
797
           add ebx, 20
798
           stdcall fix_coff_relocs, [coff], ebx, [sym]
799
800
 
801
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
227 serge 802
           test eax, eax
803
           jz .link_fail
804
805
 
806
           shr eax, 16
807
           cmp eax, DRV_COMPAT
808
           jb .ver_fail
809
810
 
811
           ja .ver_fail
812
813
 
814
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
188 serge 815
           mov [start], eax
816
817
 
818
819
 
820
           stdcall ebx, DRV_ENTRY
214 serge 821
           test eax, eax
188 serge 822
           jnz .ok
823
824
 
825
           xor eax, eax
826
           ret
827
.ok:
828
           mov ebx, [img_base]
829
           mov [eax+SRV.base], ebx
830
           mov ecx, [start]
214 serge 831
           mov [eax+SRV.entry], ecx
832
           ret
188 serge 833
227 serge 834
 
835
           mov esi, msg_CR
836
           call sys_msg_board_str
837
           mov esi, [file_name]
838
           call sys_msg_board_str
839
           mov esi, msg_CR
840
           call sys_msg_board_str
841
           mov esi, msg_version
842
           call sys_msg_board_str
843
           mov esi, msg_www
844
           call sys_msg_board_str
845
           jmp .cleanup
846
847
 
848
           mov esi, msg_module
849
           call sys_msg_board_str
850
           mov esi, [file_name]
851
           call sys_msg_board_str
852
           mov esi, msg_CR
853
           call sys_msg_board_str
854
.cleanup:
855
           stdcall kernel_free,[img_base]
856
.fail:
188 serge 857
           stdcall kernel_free, [coff]
227 serge 858
.exit:
859
           xor eax, eax
188 serge 860
           ret
861
endp
164 serge 862
863
 
198 serge 864
proc load_library stdcall, file_name:dword
865
           locals
866
             coff      dd ?
867
             sym       dd ?
868
             strings   dd ?
869
             img_size  dd ?
870
             img_base  dd ?
871
             exports   dd ?
872
           endl
873
874
 
875
876
 
877
           test eax, eax
878
           jz .fail
879
880
 
881
           movzx ecx, [eax+CFH.nSections]
882
           xor ebx, ebx
883
884
 
885
@@:
886
           add ebx, [edx+CFS.SizeOfRawData]
887
           add ebx, 15
888
           and ebx, not 15
889
           add edx, COFF_SECTION_SIZE
206 serge 890
           dec ecx
198 serge 891
           jnz @B
892
           mov [img_size], ebx
893
894
 
895
           stdcall user_alloc, [img_size]
896
897
 
898
           jz .fail
899
           mov [img_base], eax
900
901
 
902
           movzx ebx, [edx+CFH.nSections]
903
           mov edi, [img_base]
904
           lea eax, [edx+20]
905
@@:
906
           mov [eax+CFS.VirtualAddress], edi
907
           mov esi, [eax+CFS.PtrRawData]
908
           test esi, esi
909
           jnz .copy
910
           add edi, [eax+CFS.SizeOfRawData]
911
           jmp .next
912
.copy:
913
           add esi, edx
914
           add edi, new_app_base
915
           mov ecx, [eax+CFS.SizeOfRawData]
916
           cld
917
           rep movsb
918
.next:
919
           add edi, 15-new_app_base
920
           and edi, not 15
921
           add eax, COFF_SECTION_SIZE
206 serge 922
           dec ebx
198 serge 923
           jnz @B
924
925
 
926
           add ebx, edx
927
           mov [sym], ebx
928
           mov ecx, [edx+CFH.nSymbols]
929
           add ecx,ecx
930
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
931
           add ecx, [sym]
932
           mov [strings], ecx
933
934
 
935
936
 
937
                                     [strings], dword 0
938
           test eax, eax
939
           jnz @F
940
941
 
942
           mov edx, [coff]
943
           movzx ebx, [edx+CFH.nSections]
944
           mov edi, new_app_base
945
           lea eax, [edx+20]
946
@@:
947
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
948
           add eax, COFF_SECTION_SIZE
206 serge 949
           dec ebx
198 serge 950
           jnz @B
951
952
 
953
           stdcall fix_coff_relocs, [coff], edx, [sym]
954
955
 
956
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
957
           mov [exports], eax
958
959
 
960
           mov eax, [exports]
961
           ret
962
.fail:
963
           xor eax, eax
964
           ret
965
endp
966
967
 
214 serge 968
proc stop_all_services
969
278 serge 970
 
971
.next:
214 serge 972
           cmp edx,  srv.fd-SRV_FD_OFFSET
278 serge 973
           je .done
974
           cmp [edx+SRV.magic], ' SRV'
975
           jne .next
227 serge 976
           cmp [edx+SRV.size], SRV_SIZE
278 serge 977
           jne .next
227 serge 978
           mov ebx, [edx+SRV.entry]
278 serge 979
           mov edx, [edx+SRV.fd]
980
           push edx
981
           stdcall ebx, dword -1
214 serge 982
           pop edx
278 serge 983
           jmp .next
214 serge 984
.done:
278 serge 985
           ret
986
endp
214 serge 987
198 serge 988
 
281 serge 989
;  eax= pid
990
;  ebx= size
991
214 serge 992
 
281 serge 993
create_kernel_object:
994
995
 
996
           call malloc
997
           pop ebx
998
           test eax, eax
999
           jz .fail
1000
1001
 
1002
           shl ecx,8
1003
           add ecx, PROC_BASE+APP_OBJ_OFFSET
1004
1005
 
1006
           mov [eax+APPOBJ.fd], edx
1007
           mov [eax+APPOBJ.bk], ecx
1008
           mov [eax+APPOBJ.pid], ebx
1009
1010
 
1011
           mov [edx+APPOBJ.bk], eax
1012
.fail:
1013
           ret
1014
1015
 
1016
;  eax= object
1017
1018
 
1019
destroy_kernel_object:
1020
1021
 
1022
           mov ecx, [eax+APPOBJ.bk]
1023
           mov [ebx+APPOBJ.bk], ecx
1024
           mov [ecx+APPOBJ.fd], ebx
1025
1026
 
1027
           mov [eax], edx
1028
           mov [eax+4], edx
1029
           mov [eax+8], edx
1030
           mov [eax+12], edx
1031
           mov [eax+16], edx
1032
1033
 
1034
           ret
1035
1036
 
1037
 
202 diamond 1038
drv_infinity   db '/rd/1/drivers/infinity.obj', 0
1039
drv_hw_mouse   db '/rd/1/drivers/ati2d.obj',0
227 serge 1040
164 serge 1041
 
1042
szInfinity     db 'INFINITY',0
1043
szHwMouse      db 'HWCURSOR',0
227 serge 1044
164 serge 1045
 
1046
szEXPORTS      db 'EXPORTS',0
1047
szIMPORTS      db 'IMPORTS',0
1048
1049
 
188 serge 1050
msg_module     db 'in module ',0
1051
msg_version    db 'incompatible driver version',13,10,0
227 serge 1052
msg_www        db 'please visit www.kolibrios.org',13,10,0
1053
msg_CR         db  13,10,0
188 serge 1054
1055
 
214 serge 1056
create_cursor    dd 0
227 serge 1057
set_hw_cursor    dd 0
214 serge 1058
hw_restore       dd 0
221 serge 1059
214 serge 1060
 
164 serge 1061
services:
1062
           dd szSound,    drv_sound
1063
           dd szInfinity, drv_infinity
1064
           dd szHwMouse,  drv_hw_mouse
227 serge 1065
           dd 0
164 serge 1066