Subversion Repositories Kolibri OS

Rev

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