Subversion Repositories Kolibri OS

Rev

Rev 419 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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