Subversion Repositories Kolibri OS

Rev

Rev 346 | Rev 363 | 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, 4096          ;from file end
357 serge 515
           and ebx, 4095
516
           sub ecx, ebx
269 serge 517
           xor eax, eax
518
           cld
519
           rep stosb
520
           mov ebx, [file_size]
357 serge 521
           pop eax
269 serge 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