Subversion Repositories Kolibri OS

Rev

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