Subversion Repositories Kolibri OS

Rev

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