Subversion Repositories Kolibri OS

Rev

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

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