Subversion Repositories Kolibri OS

Rev

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

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