Subversion Repositories Kolibri OS

Rev

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