Subversion Repositories Kolibri OS

Rev

Rev 357 | Rev 377 | 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
 
363 serge 464
;  allocate kernel memory and loads the specified file
465
;
466
; param
467
;  file_name= full path to file
468
;
469
; retval
470
;  eax= file image in kernel memory
471
;  ebx= size of file
472
;
473
; warging
474
;  You mast call kernel_free() to delete each file
475
;  loaded by the load_file() function
476
477
 
188 serge 478
proc load_file stdcall, file_name:dword
479
           locals
480
             attr       dd ?
481
             flags      dd ?
482
             cr_time    dd ?
483
             cr_date    dd ?
484
             acc_time   dd ?
485
             acc_date   dd ?
486
             mod_time   dd ?
487
             mod_date   dd ?
488
             file_size  dd ?
489
490
 
491
             file2      dd ?
211 serge 492
           endl
188 serge 493
494
 
495
           stdcall get_fileinfo, [file_name], eax
496
           test eax, eax
164 serge 497
           jnz .fail
188 serge 498
164 serge 499
 
206 serge 500
           cmp eax, 1024*1024*16
237 serge 501
           ja .fail
502
206 serge 503
 
188 serge 504
           mov [file], eax
505
164 serge 506
 
188 serge 507
           cmp ebx, [file_size]
508
           jne .cleanup
509
211 serge 510
 
188 serge 511
           cmp dword [eax], 0x4B43504B
211 serge 512
           jne .exit
513
           mov ebx, [eax+4]
237 serge 514
           mov [file_size], ebx
515
           stdcall kernel_alloc, ebx
516
211 serge 517
 
518
           jz .cleanup
519
520
 
521
           stdcall unpack, [file], eax
522
           stdcall kernel_free, [file]
523
           mov eax, [file2]
524
           mov ebx, [file_size]
237 serge 525
.exit:
211 serge 526
           push eax
269 serge 527
           lea edi, [eax+ebx]     ;cleanup remain space
528
           mov ecx, 4096          ;from file end
357 serge 529
           and ebx, 4095
530
           sub ecx, ebx
269 serge 531
           xor eax, eax
532
           cld
533
           rep stosb
534
           mov ebx, [file_size]
357 serge 535
           pop eax
269 serge 536
           ret
188 serge 537
.cleanup:
538
           stdcall kernel_free, [file]
539
.fail:
540
           xor eax, eax
541
           xor ebx, ebx
237 serge 542
           ret
188 serge 543
endp
544
164 serge 545
 
188 serge 546
proc get_proc_ex stdcall, proc_name:dword, imports:dword
547
548
 
549
           mov edx, [imports]
550
           test edx, edx
198 serge 551
           jz .end
552
           mov edx, [edx]
188 serge 553
           test edx, edx
554
           jz .end
555
.next:
556
           mov eax, [edx]
557
           test eax, eax
164 serge 558
           jz .next_table
188 serge 559
164 serge 560
 
188 serge 561
           stdcall strncmp, eax, [proc_name], 16
562
           pop edx
563
           test eax, eax
564
           jz .ok
565
164 serge 566
 
188 serge 567
           jmp .next
568
.next_table:
569
           add [imports], 4
570
           jmp .look_up
571
.ok:
572
           mov eax, [edx+4]
573
           ret
574
.end:
575
           xor eax, eax
576
           ret
577
endp
578
164 serge 579
 
188 serge 580
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
581
                      sym_count:dword, strings:dword, imports:dword
582
           locals
583
             retval dd ?
584
           endl
585
164 serge 586
 
188 serge 587
           mov [retval], 1
588
.fix:
589
           movzx ebx, [edi+CSYM.SectionNumber]
590
           test ebx, ebx
591
           jnz .internal
592
           mov eax, dword [edi+CSYM.Name]
593
           test eax, eax
594
           jnz @F
595
164 serge 596
 
188 serge 597
           add edi, [strings]
598
@@:
599
           push edi
600
           stdcall get_proc_ex, edi,[imports]
601
           pop edi
602
164 serge 603
 
188 serge 604
           test eax, eax
605
           jnz @F
606
164 serge 607
 
188 serge 608
           call sys_msg_board_str
609
           mov esi, edi
610
           call sys_msg_board_str
611
           mov esi, msg_CR
612
           call sys_msg_board_str
613
164 serge 614
 
188 serge 615
@@:
616
           mov edi, [symbols]
617
           mov [edi+CSYM.Value], eax
618
           jmp .next
619
.internal:
620
           dec ebx
621
           shl ebx, 3
622
           lea ebx, [ebx+ebx*4]
623
           add ebx, [sec]
624
625
 
626
           add [edi+CSYM.Value], eax
627
.next:
628
           add edi, CSYM_SIZE
629
           mov [symbols], edi
630
           dec [sym_count]
631
           jnz .fix
632
           mov eax, [retval]
633
           ret
634
endp
164 serge 635
636
 
637
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
188 serge 638
	   locals
164 serge 639
             n_sec     dd ?
188 serge 640
	   endl
164 serge 641
642
 
188 serge 643
           movzx ebx, [eax+CFH.nSections]
644
           mov [n_sec], ebx
645
.fix_sec:
646
           mov esi, [sec]
647
	   mov edi, [esi+CFS.PtrReloc]
164 serge 648
           add edi, [coff]
188 serge 649
164 serge 650
 
188 serge 651
           test ecx, ecx
652
           jz .next
653
.next_reloc:
654
	   mov ebx, [edi+CRELOC.SymIndex]
164 serge 655
	   add ebx,ebx
656
	   lea ebx,[ebx+ebx*8]
657
           add ebx, [sym]
188 serge 658
164 serge 659
 
188 serge 660
164 serge 661
 
188 serge 662
           je .dir_32
663
164 serge 664
 
188 serge 665
           jne .next_reloc
666
.rel_32:
667
	   mov eax, [edi+CRELOC.VirtualAddress]
164 serge 668
           add eax, [esi+CFS.VirtualAddress]
188 serge 669
           sub edx, eax
670
           sub edx, 4
671
           jmp .fix
672
.dir_32:
673
	   mov eax, [edi+CRELOC.VirtualAddress]
674
           add eax, [esi+CFS.VirtualAddress]
675
.fix:
676
           add [eax], edx
677
           add edi, 10
678
           dec ecx
679
           jnz .next_reloc
680
.next:
681
           add [sec], COFF_SECTION_SIZE
206 serge 682
           dec [n_sec]
188 serge 683
           jnz .fix_sec
684
.exit:
164 serge 685
	   ret
686
endp
687
688
 
188 serge 689
proc load_driver stdcall, driver_name:dword
346 diamond 690
           locals
188 serge 691
             coff      dd ?
692
             sym       dd ?
693
             strings   dd ?
694
             img_size  dd ?
695
             img_base  dd ?
696
             start     dd ?
697
698
 
699
                       dd ?
700
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
346 diamond 701
           endl
188 serge 702
703
 
346 diamond 704
        mov     dword [edx], '/rd/'
705
        mov     dword [edx+4], '1/dr'
706
        mov     dword [edx+8], 'iver'
707
        mov     word [edx+12], 's/'
708
        mov     esi, [driver_name]
709
        lea     edi, [edx+14]
710
        mov     ecx, 16
711
@@:
712
        lodsb
713
        test    al, al
714
        jz      @f
715
        stosb
716
        loop    @b
717
@@:
718
        mov     dword [edi], '.obj'
719
        mov     byte [edi+4], 0
720
           stdcall load_file, edx
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, [driver_name]
346 diamond 838
           call sys_msg_board_str
227 serge 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, [driver_name]
346 diamond 851
           call sys_msg_board_str
227 serge 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= size
291 serge 990
;  ebx= pid
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
 
345 serge 1006
           cli
1007
           mov edx, [ecx+APPOBJ.fd]
281 serge 1008
           mov [eax+APPOBJ.fd], edx
1009
           mov [eax+APPOBJ.bk], ecx
1010
           mov [eax+APPOBJ.pid], ebx
1011
1012
 
1013
           mov [edx+APPOBJ.bk], eax
1014
           popfd
345 serge 1015
.fail:
281 serge 1016
           ret
1017
1018
 
1019
;  eax= object
1020
1021
 
1022
destroy_kernel_object:
1023
1024
 
345 serge 1025
           cli
1026
           mov ebx, [eax+APPOBJ.fd]
281 serge 1027
           mov ecx, [eax+APPOBJ.bk]
1028
           mov [ebx+APPOBJ.bk], ecx
1029
           mov [ecx+APPOBJ.fd], ebx
1030
           popfd
345 serge 1031
281 serge 1032
 
1033
           mov [eax], edx
1034
           mov [eax+4], edx
1035
           mov [eax+8], edx
1036
           mov [eax+12], edx
1037
           mov [eax+16], edx
1038
1039
 
1040
           ret
1041
1042
 
1043
 
346 diamond 1044
;szInfinity     db 'INFINITY',0
1045
szHwMouse      db 'ATI2D',0
1046
164 serge 1047
 
1048
szEXPORTS      db 'EXPORTS',0
1049
szIMPORTS      db 'IMPORTS',0
1050
1051
 
188 serge 1052
msg_module     db 'in module ',0
1053
msg_version    db 'incompatible driver version',13,10,0
227 serge 1054
msg_www        db 'please visit www.kolibrios.org',13,10,0
1055
msg_CR         db  13,10,0
188 serge 1056
1057
 
214 serge 1058
create_cursor    dd 0
227 serge 1059
set_hw_cursor    dd 0
214 serge 1060
hw_restore       dd 0
221 serge 1061