Subversion Repositories Kolibri OS

Rev

Rev 237 | Rev 278 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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