Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 9265 $
  9.  
  10.  
  11. ;------------------------------------------------------------------------------
  12. align 4
  13. sys_clipboard:
  14.         xor     eax, eax
  15.         dec     eax
  16. ; check availability of main list
  17.         cmp     [clipboard_main_list], eax
  18.         je      .exit_1 ; main list area not found
  19.  
  20.         test    ebx, ebx  ; 0 - Get the number of slots in the clipboard
  21.         jnz     .1
  22. ; get the number of slots
  23.         mov     eax, [clipboard_slots]
  24.         jmp     .exit_1
  25. ;------------------------------------------------------------------------------
  26. align 4
  27. .1:
  28.         dec     ebx  ; 1 - Read the data from the clipboard
  29.         jnz     .2
  30. ; verify the existence of slot
  31.         cmp     ecx, [clipboard_slots]
  32.         jae     .exit_2
  33. ; get a pointer to the data of slot
  34.         shl     ecx, 2
  35.         add     ecx, [clipboard_main_list]
  36.         mov     esi, [ecx]
  37.         mov     ecx, [esi]
  38. ; allocate memory for application for copy the data of slots
  39.         push    ecx
  40.         stdcall user_alloc, ecx
  41.         pop     ecx
  42. ; copying data of slots
  43.         mov     edi, eax
  44.         cld
  45.         rep movsb
  46.         jmp     .exit_1
  47. ;------------------------------------------------------------------------------
  48. align 4
  49. .2:
  50.         dec     ebx  ; 2 - Write the data to the clipboard
  51.         jnz     .3
  52.  
  53. ; check pointer on kernel address
  54.         stdcall is_region_userspace, edx, ecx
  55.         jz      @f
  56.         mov     eax, -1
  57.         jmp     .exit_1
  58. @@:
  59. ; check the lock
  60.         mov     ebx, clipboard_write_lock
  61.         xor     eax, eax
  62.         cmp     [ebx], eax
  63.         jne     .exit_2
  64. ; lock last slot
  65.         inc     eax
  66.         mov     [ebx], eax
  67. ; check the overflow pointer of slots
  68.         cmp     [clipboard_slots], 1024
  69.         jae     .exit_3
  70. ; get memory for new slot
  71.         push    ebx ecx edx
  72.         stdcall kernel_alloc, ecx
  73.         pop     edx ecx ebx
  74.         test    eax, eax
  75.         jz      .exit_3
  76. ; create a new slot
  77.         mov     edi, eax
  78.         mov     eax, [clipboard_slots]
  79.         shl     eax, 2
  80.         add     eax, [clipboard_main_list]
  81.         mov     [eax], edi
  82.         push    edi       ;save pointer to data
  83.         push    ecx       ;save size data
  84. ; copy the data into the slot
  85.         mov     esi, edx
  86.         mov     eax, ecx
  87.         cld
  88.         stosd  ; store size of slot
  89.         sub     ecx, 4
  90.         add     esi, 4
  91.         rep movsb ; store slot data
  92. ;copy ecx in Dword[clipboard_main_list+clipboard_slots*4]
  93.         pop     ecx
  94.         pop     eax
  95.         mov     [eax], ecx
  96. ; increase the counter of slots
  97.         inc     [clipboard_slots]
  98. ; unlock last slot
  99.         xor     eax, eax
  100.         mov     [ebx], eax
  101.         jmp     .exit_1
  102. ;------------------------------------------------------------------------------
  103. align 4
  104. .3:
  105.         dec     ebx  ; 3 - Delete the last slot in the clipboard
  106.         jnz     .4
  107. ; check the availability of slots
  108.         mov     eax, [clipboard_slots]
  109.         test    eax, eax
  110.         jz      .exit_2
  111. ; check the lock
  112.         mov     ebx, clipboard_write_lock
  113.         xor     eax, eax
  114.         cmp     [ebx], eax
  115.         jne     .exit_2
  116. ; lock last slot
  117.         inc     eax
  118.         mov     [ebx], eax
  119. ; decrease the counter of slots
  120.         mov     eax, clipboard_slots
  121.         dec     dword [eax]
  122. ; free of kernel memory allocated for the slot
  123.         mov     eax, [eax]
  124.         shl     eax, 2
  125.         add     eax, [clipboard_main_list]
  126.         mov     eax, [eax]
  127.         push    ebx
  128.         stdcall kernel_free, eax
  129.         pop     ebx
  130. ; unlock last slot
  131.         xor     eax, eax
  132.         mov     [ebx], eax
  133.         jmp     .exit_1
  134. ;------------------------------------------------------------------------------
  135. align 4
  136. .4:
  137.         dec     ebx  ; 4 - Emergency discharge of clipboard
  138.         jnz     .exit
  139. ; check the lock
  140.         mov     ebx, clipboard_write_lock
  141.         xor     eax, eax
  142.         cmp     [ebx], eax
  143.         je      .exit_2
  144.  
  145. ; there should be a procedure for checking the integrity of the slots
  146. ; and I will do so in the future
  147.  
  148. ; unlock last slot
  149.         mov     [ebx], eax
  150.         jmp     .exit
  151. ;------------------------------------------------------------------------------
  152. align 4
  153. .exit_3:
  154. ; unlock last slot
  155.         xor     eax, eax
  156.         mov     [ebx], eax
  157. .exit_2:
  158.         xor     eax, eax
  159.         inc     eax     ; error
  160. .exit_1:
  161.         mov     [esp + 32], eax
  162. .exit:
  163.         ret
  164. ;------------------------------------------------------------------------------
  165. uglobal
  166. align 4
  167. clipboard_slots dd ?
  168. clipboard_main_list dd ?
  169. clipboard_write_lock dd ?
  170. endg
  171. ;------------------------------------------------------------------------------
  172.