Subversion Repositories Kolibri OS

Rev

Rev 214 | Rev 227 | 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.  
  5. align 4
  6. proc attach_int_handler stdcall, irq:dword, handler:dword
  7.  
  8.          mov ebx, [irq]        ;irq num
  9.          test ebx, ebx
  10.          jz .err
  11.          mov eax, [handler]
  12.          test eax, eax
  13.          jz .err
  14.          mov [irq_tab+ebx*4], eax
  15.          stdcall enable_irq, [irq]
  16.          ret
  17. .err:
  18.          xor eax, eax
  19.          ret
  20. endp
  21.  
  22. align 4
  23. proc  detach_int_handler
  24.  
  25.            ret
  26. endp
  27.  
  28. align 4
  29. proc enable_irq stdcall, irq_line:dword
  30.            mov ebx, [irq_line]
  31.            mov edx, 0x21
  32.            cmp ebx, 8
  33.            jb @F
  34.            mov edx, 0xA1
  35.            sub ebx,8
  36. @@:
  37.            in al,dx
  38.            btr eax, ebx
  39.            out dx, al
  40.            ret
  41. endp
  42.  
  43. align 16
  44. ;; proc irq_serv
  45.  
  46. irq_serv:
  47.  
  48. .irq_1:
  49.            push eax
  50.            mov eax, 1
  51.            jmp .main
  52. align 4
  53. .irq_2:
  54.            push eax
  55.            mov eax, 2
  56.            jmp .main
  57. align 4
  58. .irq_3:
  59.            push eax
  60.            mov eax, 3
  61.            jmp .main
  62. align 4
  63. .irq_4:
  64.            push eax
  65.            mov eax, 4
  66.            jmp .main
  67. align 4
  68. .irq_5:
  69.            push eax
  70.            mov eax, 5
  71.            jmp .main
  72. align 4
  73. .irq_6:
  74.            push eax
  75.            mov eax, 6
  76.            jmp .main
  77. align 4
  78. .irq_7:
  79.            push eax
  80.            mov eax, 7
  81.            jmp .main
  82. align 4
  83. .irq_8:
  84.            push eax
  85.            mov eax, 8
  86.            jmp .main
  87. align 4
  88. .irq_9:
  89.            push eax
  90.            mov eax, 9
  91.            jmp .main
  92. align 4
  93. .irq_10:
  94.            push eax
  95.            mov eax, 10
  96.            jmp .main
  97. align 4
  98. .irq_11:
  99.            push eax
  100.            mov eax, 11
  101.            jmp .main
  102. align 4
  103. .irq_12:
  104.            push eax
  105.            mov eax, 12
  106.            jmp .main
  107. align 4
  108. .irq_13:
  109.            push eax
  110.            mov eax, 13
  111.            jmp .main
  112. align 4
  113. .irq_14:
  114.            push eax
  115.            mov eax, 14
  116.            jmp .main
  117. align 4
  118. .irq_15:
  119.            push eax
  120.            mov eax, 15
  121.            jmp .main
  122.  
  123. align 16
  124. .main:
  125.            save_ring3_context
  126.            mov   bx, os_data
  127.            mov   ds, bx
  128.            mov   es, bx
  129.  
  130.            mov ebx, [irq_tab+eax*4]
  131.            test ebx, ebx
  132.            jz .exit
  133.  
  134.            call ebx
  135.  
  136. .exit:
  137.            restore_ring3_context
  138.  
  139.            cmp eax, 8
  140.            mov al, 0x20
  141.            jb @f
  142.            out 0xa0, al
  143. @@:
  144.            out 0x20, al
  145.  
  146.            pop eax
  147.            iret
  148.  
  149. align 4
  150. proc get_notify stdcall, p_ev:dword
  151.  
  152. .wait:
  153.            mov ebx,[CURRENT_TASK]
  154.            shl ebx,8
  155.            test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
  156.            jz @f
  157.            and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
  158.            mov edi, [p_ev]
  159.            mov dword [edi], EV_INTR
  160.            mov eax, [ebx+PROC_BASE+APPDATA.event]
  161.            mov dword [edi+4], eax
  162.            ret
  163. @@:
  164.            call change_task
  165.            jmp .wait
  166. endp
  167.  
  168. align 4
  169. proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
  170.            xor eax, eax
  171.            xor ebx, ebx
  172.            mov ah, byte [bus]
  173.            mov al, 6
  174.            mov bh, byte [devfn]
  175.            mov bl, byte [reg]
  176.            call pci_read_reg
  177.            ret
  178. endp
  179.  
  180. align 4
  181. proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
  182.            xor eax, eax
  183.            xor ebx, ebx
  184.            mov ah, byte [bus]
  185.            mov al, 4
  186.            mov bh, byte [devfn]
  187.            mov bl, byte [reg]
  188.            call pci_read_reg
  189.            ret
  190. endp
  191.  
  192. align 4
  193. proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
  194.            xor eax, eax
  195.            xor ebx, ebx
  196.            mov ah, byte [bus]
  197.            mov al, 8
  198.            mov bh, byte [devfn]
  199.            mov bl, byte [reg]
  200.            mov ecx, [val]
  201.            call pci_write_reg
  202.            ret
  203. endp
  204.  
  205. handle     equ  IOCTL.handle
  206. io_code    equ  IOCTL.io_code
  207. input      equ  IOCTL.input
  208. inp_size   equ  IOCTL.inp_size
  209. output     equ  IOCTL.output
  210. out_size   equ  IOCTL.out_size
  211.  
  212.  
  213. align 4
  214. proc srv_handler stdcall, ioctl:dword
  215.            mov esi, [ioctl]
  216.            test esi, esi
  217.            jz .err
  218.  
  219.            mov edi, [esi+handle]
  220.            cmp [edi+SRV.magic], ' SRV'
  221.            jne .fail
  222.  
  223.            cmp [edi+SRV.size], SRV_SIZE
  224.            jne .fail
  225.  
  226.            stdcall [edi+SRV.srv_proc], esi
  227.            ret
  228. .fail:
  229.            xor eax, eax
  230.            not eax
  231.            mov [esi+output], eax
  232.            mov [esi+out_size], 4
  233.            ret
  234. .err:
  235.            xor eax, eax
  236.            not eax
  237.            ret
  238. endp
  239.  
  240. align 4
  241. proc srv_handlerEx stdcall, ioctl:dword
  242.            mov esi, [ioctl]
  243.            test esi, esi
  244.            jz .err
  245.            add esi, new_app_base
  246.  
  247.            mov edi, [esi+handle]
  248.            cmp [edi+SRV.magic], ' SRV'
  249.            jne .fail
  250.  
  251.            cmp [edi+SRV.size], SRV_SIZE
  252.            jne .fail
  253.  
  254.            add [esi+input], new_app_base
  255.            add [esi+output], new_app_base
  256.  
  257.            stdcall [edi+SRV.srv_proc], esi
  258.            ret
  259. .fail:
  260.            xor eax, eax
  261.            not eax
  262.            mov [esi+output], eax
  263.            mov [esi+out_size], 4
  264.            ret
  265. .err:
  266.            xor eax, eax
  267.            not eax
  268.            ret
  269. endp
  270.  
  271. restore  handle
  272. restore  io_code
  273. restore  input
  274. restore  inp_size
  275. restore  output
  276. restore  out_size
  277.  
  278. align 4
  279. proc get_service stdcall, sz_name:dword
  280.            locals
  281.              srv_ptr  dd ?
  282.              counter  dd ?
  283.            endl
  284.  
  285.            mov eax, [sz_name]
  286.            test eax, eax
  287.            jnz @F
  288.            ret
  289. @@:
  290.            mov [srv_ptr], srv_tab
  291.            mov [counter], 16
  292. @@:
  293.            stdcall strncmp, [srv_ptr], [sz_name], 16
  294.            test eax, eax
  295.            je .ok
  296.  
  297.            add [srv_ptr], SRV_SIZE
  298.            dec [counter]
  299.            jnz @B
  300. .not_load:
  301.            stdcall find_service, [sz_name]
  302.            test eax, eax
  303.            jnz @F
  304.            ret
  305. @@:
  306.            stdcall load_driver, eax
  307.            ret
  308. .ok:
  309.            mov eax, [srv_ptr]
  310.            ret
  311. endp
  312.  
  313. align 4
  314. proc find_service stdcall ,sz_name:dword
  315.  
  316.            mov eax, [sz_name]
  317.            test eax, eax
  318.            jz .fail
  319.  
  320.            mov esi, services
  321. @@:
  322.            mov eax, [esi]
  323.            test eax, eax
  324.            jz .fail
  325.            push esi
  326.            stdcall strncmp, eax, [sz_name], 16
  327.            pop esi
  328.            test eax, eax
  329.            je .ok
  330.  
  331.            add esi, 8
  332.            jmp @B
  333. .ok:
  334.            mov eax, [esi+4]
  335.            ret
  336. .fail:
  337.            xor eax, eax
  338.            ret
  339. endp
  340.  
  341. align 4
  342. proc reg_service stdcall, sz_name:dword, handler:dword
  343.            locals
  344.              srv dd ?
  345.            endl
  346.  
  347.            mov eax, [sz_name]
  348.            test eax, eax
  349.            jz .fail
  350.  
  351.            mov ebx, [handler]
  352.            test ebx, ebx
  353.            jz .fail
  354.  
  355.            call alloc_service
  356.            test eax, eax
  357.            jz .fail
  358.  
  359.            mov [srv], eax
  360.            mov edi, eax
  361.            mov esi, [sz_name]
  362.            mov ecx, 16
  363.            rep movsb
  364.  
  365.            mov edi, eax
  366.            mov [edi+SRV.magic], ' SRV'
  367.            mov [edi+SRV.size], SRV_SIZE
  368.            mov ebx, [handler]
  369.            mov [edi+SRV.srv_proc], ebx
  370.            mov eax, [srv]
  371.            ret
  372. .fail:
  373.            xor eax, eax
  374.            ret
  375. endp
  376.  
  377. align 4
  378. proc get_proc stdcall, exp:dword, sz_name:dword
  379.  
  380.            mov edx, [exp]
  381. .next:
  382.            mov eax, [edx]
  383.            test eax, eax
  384.            jz .end
  385.  
  386.            push edx
  387.            stdcall strncmp, eax, [sz_name], 16
  388.            pop edx
  389.            test eax, eax
  390.            jz .ok
  391.  
  392.            add edx,8
  393.            jmp .next
  394. .ok:
  395.            mov eax, [edx+4]
  396. .end:
  397.            ret
  398. endp
  399.  
  400. align 4
  401. proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
  402.  
  403. @@:
  404.            stdcall strncmp, [pSym], [sz_sym], 8
  405.            test eax,eax
  406.            jz .ok
  407.            add [pSym], 18
  408.            dec [count]
  409.            jnz @b
  410.            xor eax, eax
  411.            ret
  412. .ok:
  413.            mov ebx, [pSym]
  414.            mov eax, [ebx+8]
  415.            ret
  416. endp
  417.  
  418. align 4
  419. proc get_curr_task
  420.            mov eax,[CURRENT_TASK]
  421.            shl eax, 8
  422.            ret
  423. endp
  424.  
  425. align 4
  426. proc get_fileinfo stdcall, file_name:dword, info:dword
  427.            locals
  428.              cmd     dd ?
  429.              offset  dd ?
  430.                      dd ?
  431.              count   dd ?
  432.              buff    dd ?
  433.                      db ?
  434.              name    dd ?
  435.            endl
  436.  
  437.            xor eax, eax
  438.            mov ebx, [file_name]
  439.            sub ebx, new_app_base
  440.            mov ecx, [info]
  441.            sub ecx, new_app_base
  442.  
  443.            mov [cmd], 5
  444.            mov [offset], eax
  445.            mov [offset+4], eax
  446.            mov [count], eax
  447.            mov [buff], ecx
  448.            mov byte [buff+4], al
  449.            mov [name], ebx
  450.  
  451.            mov eax, 70
  452.            lea ebx, [cmd]
  453.            sub ebx, new_app_base
  454.            int 0x40
  455.            ret
  456. endp
  457.  
  458. align 4
  459. proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
  460.                                      bytes:dword
  461.            locals
  462.              cmd     dd ?
  463.              offset  dd ?
  464.                      dd ?
  465.              count   dd ?
  466.              buff    dd ?
  467.                      db ?
  468.              name    dd ?
  469.            endl
  470.  
  471.            xor eax, eax
  472.            mov ebx, [file_name]
  473.            mov ecx, [off]
  474.            mov edx, [bytes]
  475.            mov esi, [buffer]
  476.            sub ebx, new_app_base
  477.            sub esi, new_app_base
  478.  
  479.            mov [cmd], eax
  480.            mov [offset], ecx
  481.            mov [offset+4], eax
  482.            mov [count], edx
  483.            mov [buff], esi
  484.            mov byte [buff+4], al
  485.            mov [name], ebx
  486.  
  487.            mov eax, 70
  488.            lea ebx, [cmd]
  489.            sub ebx, new_app_base
  490.            int 0x40
  491.            ret
  492. endp
  493.  
  494. align 4
  495. proc load_file stdcall, file_name:dword
  496.            locals
  497.              attr       dd ?
  498.              flags      dd ?
  499.              cr_time    dd ?
  500.              cr_date    dd ?
  501.              acc_time   dd ?
  502.              acc_date   dd ?
  503.              mod_time   dd ?
  504.              mod_date   dd ?
  505.              file_size  dd ?
  506.  
  507.              file       dd ?
  508.              file2      dd ?
  509.            endl
  510.  
  511.            lea eax, [attr]
  512.            stdcall get_fileinfo, [file_name], eax
  513.            test eax, eax
  514.            jnz .fail
  515.  
  516.            mov eax, [file_size]
  517.  
  518.            stdcall kernel_alloc, [file_size]
  519.            mov [file], eax
  520.  
  521.            stdcall read_file, [file_name], eax, dword 0, [file_size]
  522.            cmp ebx, [file_size]
  523.            jne .cleanup
  524.  
  525.            mov eax, [file]
  526.            cmp dword [eax], 0x4B43504B
  527.            jne .exit
  528.  
  529.            stdcall kernel_alloc, [eax+4]
  530.  
  531.            test eax, eax
  532.            jz .cleanup
  533.  
  534.            mov [file2], eax
  535.            stdcall unpack, [file], eax
  536.            stdcall kernel_free, [file]
  537.            mov eax, [file2]
  538. .exit:
  539.            ret
  540. .cleanup:
  541.            stdcall kernel_free, [file]
  542. .fail:
  543.            xor eax, eax
  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, file_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.            endl
  703.  
  704.            stdcall load_file, [file_name]
  705.  
  706.            test eax, eax
  707.            jz .fail
  708.  
  709.            mov [coff], eax
  710.  
  711.            movzx ecx, [eax+CFH.nSections]
  712.            xor ebx, ebx
  713.  
  714.            lea edx, [eax+20]
  715. @@:
  716.            add ebx, [edx+CFS.SizeOfRawData]
  717.            add ebx, 15
  718.            and ebx, not 15
  719.            add edx, COFF_SECTION_SIZE
  720.            dec ecx
  721.            jnz @B
  722.            mov [img_size], ebx
  723.  
  724.            stdcall kernel_alloc, ebx
  725.            test eax, eax
  726.            jz .fail
  727.            mov [img_base], eax
  728.  
  729.            mov edi, eax
  730.            xor eax, eax
  731.            mov ecx, [img_size]
  732.            add ecx, 4095
  733.            and ecx, not 4095
  734.            shr ecx, 2
  735.            cld
  736.            rep stosd
  737.  
  738.            mov edx, [coff]
  739.            movzx ebx, [edx+CFH.nSections]
  740.            mov edi, [img_base]
  741.            lea eax, [edx+20]
  742. @@:
  743.            mov [eax+CFS.VirtualAddress], edi
  744.            mov esi, [eax+CFS.PtrRawData]
  745.            test esi, esi
  746.            jnz .copy
  747.            add edi, [eax+CFS.SizeOfRawData]
  748.            jmp .next
  749. .copy:
  750.            add esi, edx
  751.            mov ecx, [eax+CFS.SizeOfRawData]
  752.            cld
  753.            rep movsb
  754. .next:
  755.            add edi, 15
  756.            and edi, not 15
  757.            add eax, COFF_SECTION_SIZE
  758.            dec ebx
  759.            jnz @B
  760.  
  761.            mov ebx, [edx+CFH.pSymTable]
  762.            add ebx, edx
  763.            mov [sym], ebx
  764.            mov ecx, [edx+CFH.nSymbols]
  765.            add ecx,ecx
  766.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  767.            add ecx, [sym]
  768.            mov [strings], ecx
  769.  
  770.            lea ebx, [exports]
  771.            mov dword [ebx], kernel_export
  772.            mov dword [ebx+4], 0
  773.            lea eax, [edx+20]
  774.  
  775.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  776.                                      [strings], ebx
  777.            test eax, eax
  778.            jnz @F
  779.  
  780.            mov esi, msg_module
  781.            call sys_msg_board_str
  782.            mov esi, [file_name]
  783.            call sys_msg_board_str
  784.            mov esi, msg_CR
  785.            call sys_msg_board_str
  786.  
  787.            stdcall kernel_free,[coff]
  788.            xor eax, eax
  789.            ret
  790. @@:
  791.            mov ebx, [coff]
  792.            add ebx, 20
  793.            stdcall fix_coff_relocs, [coff], ebx, [sym]
  794.  
  795.            mov ebx, [coff]
  796.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
  797.            mov [start], eax
  798.  
  799.            stdcall kernel_free, [coff]
  800.  
  801.            mov ebx, [start]
  802.            stdcall ebx, DRV_ENTRY
  803.            test eax, eax
  804.            jnz .ok
  805.  
  806.            stdcall kernel_free, [img_base]
  807.            xor eax, eax
  808.            ret
  809. .ok:
  810.            mov ebx, [img_base]
  811.            mov [eax+SRV.base], ebx
  812.            mov ecx, [start]
  813.            mov [eax+SRV.entry], ecx
  814.            ret
  815. .fail:
  816.            xor eax, eax
  817.            ret
  818. endp
  819.  
  820. align 4
  821. proc load_library stdcall, file_name:dword
  822.            locals
  823.              coff      dd ?
  824.              sym       dd ?
  825.              strings   dd ?
  826.              img_size  dd ?
  827.              img_base  dd ?
  828.              exports   dd ?
  829.            endl
  830.  
  831.            cli
  832.  
  833.            stdcall load_file, [file_name]
  834.  
  835.            test eax, eax
  836.            jz .fail
  837.  
  838.            mov [coff], eax
  839.            movzx ecx, [eax+CFH.nSections]
  840.            xor ebx, ebx
  841.  
  842.            lea edx, [eax+20]
  843. @@:
  844.            add ebx, [edx+CFS.SizeOfRawData]
  845.            add ebx, 15
  846.            and ebx, not 15
  847.            add edx, COFF_SECTION_SIZE
  848.            dec ecx
  849.            jnz @B
  850.            mov [img_size], ebx
  851.  
  852.            call init_heap
  853.            stdcall user_alloc, [img_size]
  854.  
  855.            test eax, eax
  856.            jz .fail
  857.            mov [img_base], eax
  858.  
  859.            mov edx, [coff]
  860.            movzx ebx, [edx+CFH.nSections]
  861.            mov edi, [img_base]
  862.            lea eax, [edx+20]
  863. @@:
  864.            mov [eax+CFS.VirtualAddress], edi
  865.            mov esi, [eax+CFS.PtrRawData]
  866.            test esi, esi
  867.            jnz .copy
  868.            add edi, [eax+CFS.SizeOfRawData]
  869.            jmp .next
  870. .copy:
  871.            add esi, edx
  872.            add edi, new_app_base
  873.            mov ecx, [eax+CFS.SizeOfRawData]
  874.            cld
  875.            rep movsb
  876. .next:
  877.            add edi, 15-new_app_base
  878.            and edi, not 15
  879.            add eax, COFF_SECTION_SIZE
  880.            dec ebx
  881.            jnz @B
  882.  
  883.            mov ebx, [edx+CFH.pSymTable]
  884.            add ebx, edx
  885.            mov [sym], ebx
  886.            mov ecx, [edx+CFH.nSymbols]
  887.            add ecx,ecx
  888.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  889.            add ecx, [sym]
  890.            mov [strings], ecx
  891.  
  892.            lea eax, [edx+20]
  893.  
  894.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  895.                                      [strings], dword 0
  896.            test eax, eax
  897.            jnz @F
  898.  
  899. @@:
  900.            mov edx, [coff]
  901.            movzx ebx, [edx+CFH.nSections]
  902.            mov edi, new_app_base
  903.            lea eax, [edx+20]
  904. @@:
  905.            add [eax+CFS.VirtualAddress], edi  ;patch user space offset
  906.            add eax, COFF_SECTION_SIZE
  907.            dec ebx
  908.            jnz @B
  909.  
  910.            add edx, 20
  911.            stdcall fix_coff_relocs, [coff], edx, [sym]
  912.  
  913.            mov ebx, [coff]
  914.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
  915.            mov [exports], eax
  916.  
  917.            stdcall kernel_free, [coff]
  918.            mov eax, [exports]
  919.            ret
  920. .fail:
  921.            xor eax, eax
  922.            ret
  923. endp
  924.  
  925. align 4
  926. proc stop_all_services
  927.            pushf
  928.            cli
  929.            mov eax, [srv_map]
  930.            not eax
  931.            mov [srv_map], eax
  932. .next:
  933.            bsf eax, [srv_map]
  934.            jnz .find
  935.            popf
  936.            ret
  937. .find:
  938.            btr [srv_map], eax
  939.            shl eax,0x02
  940.            lea eax,[srv_tab+eax+eax*8]   ;srv_tab+eax*36
  941.            mov ebx, [eax+SRV.entry]
  942.            stdcall ebx, dword -1
  943.            jmp .next
  944. endp
  945.  
  946.  
  947. drv_sound      db '/rd/1/drivers/unisound.obj', 0
  948. drv_infinity   db '/rd/1/drivers/infinity.obj', 0
  949. ;drv_ati2d      db '/rd/1/drivers/vesa.obj', 0
  950. ;drv_cursor     db '/rd/1/drivers/vesa.obj',0
  951.  
  952. szSound        db 'SOUND',0
  953. szInfinity     db 'INFINITY',0
  954. ;szHMouse       db 'ATI2D',0
  955. ;szCURSOR       db 'VESACURSOR',0
  956.  
  957. szSTART        db 'START',0
  958. szEXPORTS      db 'EXPORTS',0
  959. szIMPORTS      db 'IMPORTS',0
  960.  
  961. msg_unresolved db 'unresolved ',0
  962. msg_module     db 'in module ',0
  963. msg_CR         db  13,10,0
  964.  
  965. align 4
  966. set_hw_cursor    dd 0
  967. hw_restore       dd 0
  968.  
  969. align 16
  970. services:
  971.            dd szSound,    drv_sound
  972.            dd szInfinity, drv_infinity
  973. ;           dd szHMouse,   drv_ati2d
  974. ;           dd szCURSOR,   drv_cursor
  975.            dd 0
  976.