Subversion Repositories Kolibri OS

Rev

Rev 6848 | Rev 6852 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6848 Rev 6849
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2013-2016. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2013-2016. All rights reserved. ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 6848 $
8
$Revision: 6849 $
9
 
9
 
10
; EXT external functions
10
; EXT external functions
11
;   in:
11
;   in:
Line 1016... Line 1016...
1016
        jmp     @b
1016
        jmp     @b
Line 1017... Line 1017...
1017
 
1017
 
1018
extfsExtendFile:
1018
extfsExtendFile:
1019
;   in:
1019
;   in:
1020
; [ebp+EXTFS.inodeBuffer] = inode
1020
; [ebp+EXTFS.inodeBuffer] = inode
1021
; eax = inode number
1021
; ecx = inode number
1022
; ecx = new size
1022
; edx:eax = new size
1023
        push    ebx ecx edx esi edi eax
1023
        push    ebx esi edi ecx
1024
        lea     esi, [ebp+EXTFS.inodeBuffer]
1024
        lea     esi, [ebp+EXTFS.inodeBuffer]
1025
        mov     eax, ecx
1025
        mov     ebx, [esi+INODE.fileSize]
1026
        mov     edx, [esi+INODE.fileSize]
1026
        mov     ecx, [esi+INODE.fileSizeHigh]
-
 
1027
        cmp     ebx, eax
1027
        cmp     edx, eax
1028
        sbb     ecx, edx
-
 
1029
        jnc     .ret
1028
        jnc     .ret
1030
        mov     ecx, [esi+INODE.fileSizeHigh]
1029
        mov     [esi+INODE.fileSize], eax
1031
        mov     [esi+INODE.fileSize], eax
1030
        mov     ecx, [ebp+EXTFS.sectorsPerBlockLog]
1032
        mov     [esi+INODE.fileSizeHigh], edx
1031
        add     ecx, 9
1033
        sub     eax, 1
1032
        dec     eax
1034
        sbb     edx, 0
1033
        shr     eax, cl
1035
        div     [ebp+EXTFS.bytesPerBlock]
-
 
1036
        inc     eax
-
 
1037
        xchg    eax, ebx
1034
        inc     eax
1038
        mov     edx, ecx
-
 
1039
        sub     eax, 1
1035
        sub     edx, 1
1040
        sbb     edx, 0
1036
        jc      @f
1041
        jc      @f
1037
        shr     edx, cl
1042
        div     [ebp+EXTFS.bytesPerBlock]
1038
@@:
1043
@@:
1039
        inc     edx
1044
        inc     eax
1040
        sub     eax, edx
1045
        sub     ebx, eax
1041
        jz      .ret
1046
        jz      .ret
-
 
1047
        push    ebx
1042
        push    eax
1048
        mov     edx, eax
1043
@@:
1049
@@:
1044
        mov     ecx, [esp]
1050
        mov     ecx, [esp]
1045
        mov     eax, [esp+4]
1051
        mov     eax, [esp+4]
1046
        test    ecx, ecx
1052
        test    ecx, ecx
Line 1182... Line 1188...
1182
        stdcall kernel_free, esi
1188
        stdcall kernel_free, esi
1183
.done:
1189
.done:
1184
        xor     eax, eax
1190
        xor     eax, eax
1185
        pop     edi
1191
        pop     edi
1186
.ret:
1192
.ret:
1187
        pop     edi edi esi edx ecx ebx
1193
        pop     edi edi esi ebx
1188
        ret
1194
        ret
Line 1189... Line 1195...
1189
 
1195
 
1190
.errSave:
1196
.errSave:
1191
        push    eax
1197
        push    eax
Line 1306... Line 1312...
1306
.ret:
1312
.ret:
1307
        xor     edx, edx
1313
        xor     edx, edx
1308
        ret
1314
        ret
Line 1309... Line 1315...
1309
 
1315
 
1310
extfsTruncateFile:
1316
extfsTruncateFile:
1311
; in: ecx = new size, [ebp+EXTFS.inodeBuffer] = inode
-
 
1312
        push    ebx ecx edx esi edi
1317
; in: edx:eax = new size, [ebp+EXTFS.inodeBuffer] = inode
-
 
1318
        lea     esi, [ebp+EXTFS.inodeBuffer]
1313
        lea     esi, [ebp+EXTFS.inodeBuffer]
1319
        mov     ecx, edx
-
 
1320
        cmp     eax, [esi+INODE.fileSize]
1314
        cmp     ecx, [esi+INODE.fileSize]
1321
        sbb     ecx, [esi+INODE.fileSizeHigh]
1315
        jnc     .ret
1322
        jnc     .ret
-
 
1323
        mov     [esi+INODE.fileSize], eax
1316
        mov     [esi+INODE.fileSize], ecx
1324
        mov     [esi+INODE.fileSizeHigh], edx
1317
        mov     edx, ecx
1325
        sub     eax, 1
1318
        jecxz   .directBlocks
1326
        sbb     edx, 0
1319
        dec     edx
1327
        jc      @f
-
 
1328
        div     [ebp+EXTFS.bytesPerBlock]
1320
        mov     ecx, [ebp+EXTFS.sectorsPerBlockLog]
1329
@@:
1321
        add     ecx, 9
1330
        inc     eax
1322
        shr     edx, cl
-
 
1323
        inc     edx
1331
        mov     edx, eax
1324
        cmp     edx, 12
1332
        cmp     edx, 12
1325
        jc      .directBlocks
1333
        jc      .directBlocks
1326
        sub     edx, 12
1334
        sub     edx, 12
1327
        cmp     edx, [ebp+EXTFS.dwordsPerBlock]
1335
        cmp     edx, [ebp+EXTFS.dwordsPerBlock]
Line 1397... Line 1405...
1397
.err:
1405
.err:
1398
        pop     eax eax
1406
        pop     eax eax
1399
.done:
1407
.done:
1400
        call    kernel_free
1408
        call    kernel_free
1401
.ret:
1409
.ret:
1402
        pop     edi esi edx ecx ebx
-
 
1403
        ret
1410
        ret
Line 1404... Line 1411...
1404
 
1411
 
1405
linkInode:
1412
linkInode:
1406
;   in:
1413
;   in:
Line 1483... Line 1490...
1483
        inc     ecx
1490
        inc     ecx
1484
        cmp     ecx, [esp]
1491
        cmp     ecx, [esp]
1485
        push    ecx
1492
        push    ecx
1486
        jnz     @f
1493
        jnz     @f
1487
.alloc_block:
1494
.alloc_block:
1488
        mov     ecx, [esi+INODE.fileSize]
1495
        mov     eax, [esi+INODE.fileSize]
1489
        add     ecx, [ebp+EXTFS.bytesPerBlock]
1496
        add     eax, [ebp+EXTFS.bytesPerBlock]
-
 
1497
        xor     edx, edx
1490
        mov     eax, [esp+24]
1498
        mov     ecx, [esp+24]
1491
        call    extfsExtendFile
1499
        call    extfsExtendFile
1492
        jc      .error_get_inode_block
1500
        jc      .error_get_inode_block
1493
        mov     eax, [esp+24]
1501
        mov     eax, [esp+24]
1494
        mov     ebx, esi
1502
        mov     ebx, esi
1495
        call    writeInode
1503
        call    writeInode
Line 1631... Line 1639...
1631
        lea     edi, [ebp+EXTFS.inodeBuffer]
1639
        lea     edi, [ebp+EXTFS.inodeBuffer]
1632
        movzx   ecx, [ebp+EXTFS.superblock.inodeSize]
1640
        movzx   ecx, [ebp+EXTFS.superblock.inodeSize]
1633
        mov     edx, esi
1641
        mov     edx, esi
1634
        rep movsb
1642
        rep movsb
1635
        pop     esi
1643
        pop     esi
1636
        pushd   0 ROOT_INODE
1644
        pushd   ebx 0 ROOT_INODE
1637
        mov     edi, esi
1645
        mov     edi, esi
1638
        cmp     [edx+INODE.fileSize], 0
1646
        cmp     [edx+INODE.fileSize], 0
1639
        jz      .not_found
1647
        jz      .not_found
1640
        cmp     byte [esi], 0
1648
        cmp     byte [esi], 0
1641
        jnz     .next_path_part
1649
        jnz     .next_path_part
1642
        xor     eax, eax
1650
        xor     eax, eax
1643
        pop     esi ecx
1651
        pop     esi ecx ebx
1644
        ret
1652
        ret
Line 1645... Line 1653...
1645
 
1653
 
1646
@@:
1654
@@:
1647
        pop     esi esi
1655
        pop     esi esi
1648
.error:
1656
.error:
1649
        pop     esi ecx
1657
        pop     esi ecx ebx
1650
        xor     edi, edi
1658
        xor     edi, edi
1651
        stc
1659
        stc
Line 1652... Line 1660...
1652
        ret
1660
        ret
Line 1727... Line 1735...
1727
        xor     edi, edi    ; path folder not found
1735
        xor     edi, edi    ; path folder not found
1728
@@:
1736
@@:
1729
        movi    eax, ERROR_FILE_NOT_FOUND
1737
        movi    eax, ERROR_FILE_NOT_FOUND
1730
        stc
1738
        stc
1731
.ret:
1739
.ret:
1732
        pop     esi ecx
1740
        pop     esi ecx ebx
1733
        ret
1741
        ret
Line 1734... Line 1742...
1734
 
1742
 
1735
writeSuperblock:
1743
writeSuperblock:
1736
        push    ebx
1744
        push    ebx
Line 1760... Line 1768...
1760
;----------------------------------------------------------------
1768
;----------------------------------------------------------------
1761
ext_ReadFolder:
1769
ext_ReadFolder:
1762
        call    ext_lock
1770
        call    ext_lock
1763
        cmp     byte [esi], 0
1771
        cmp     byte [esi], 0
1764
        jz      .root_folder
1772
        jz      .root_folder
1765
        push    ebx
-
 
1766
        call    findInode
1773
        call    findInode
1767
        pop     ebx
-
 
1768
        jc      .error_ret
1774
        jc      .error_ret
1769
        lea     esi, [ebp+EXTFS.inodeBuffer]
1775
        lea     esi, [ebp+EXTFS.inodeBuffer]
1770
        test    [esi+INODE.accessMode], FLAG_FILE
1776
        test    [esi+INODE.accessMode], FLAG_FILE
1771
        jnz     .error_not_found
1777
        jnz     .error_not_found
1772
        jmp     @f
1778
        jmp     @f
Line 1970... Line 1976...
1970
        jmp     .error_ret
1976
        jmp     .error_ret
Line 1971... Line 1977...
1971
 
1977
 
1972
;----------------------------------------------------------------
1978
;----------------------------------------------------------------
1973
ext_ReadFile:
1979
ext_ReadFile:
1974
        call    ext_lock
-
 
1975
        pushd   0 ebx
1980
        call    ext_lock
1976
        call    findInode
-
 
1977
        pop     ebx
1981
        call    findInode
1978
        push    eax
1982
        pushd   0 eax
1979
        jc      .ret
1983
        jc      .ret
1980
        lea     esi, [ebp+EXTFS.inodeBuffer]
1984
        lea     esi, [ebp+EXTFS.inodeBuffer]
1981
        mov     byte [esp], ERROR_ACCESS_DENIED
1985
        mov     byte [esp], ERROR_ACCESS_DENIED
1982
        test    [esi+INODE.accessMode], FLAG_FILE
1986
        test    [esi+INODE.accessMode], FLAG_FILE
Line 2077... Line 2081...
2077
        ret
2081
        ret
Line 2078... Line 2082...
2078
 
2082
 
2079
;----------------------------------------------------------------
2083
;----------------------------------------------------------------
2080
ext_GetFileInfo:
2084
ext_GetFileInfo:
2081
        call    ext_lock
-
 
2082
        mov     edx, [ebx+16]
2085
        call    ext_lock
2083
        cmp     byte [esi], 0
2086
        cmp     byte [esi], 0
2084
        jz      .is_root
-
 
2085
        push    edx
2087
        jz      .is_root
2086
        call    findInode
-
 
2087
        pop     edx
2088
        call    findInode
2088
        lea     esi, [ebp+EXTFS.inodeBuffer]
2089
        lea     esi, [ebp+EXTFS.inodeBuffer]
2089
        jnc     @f
2090
        jnc     @f
2090
        push    eax
2091
        push    eax
2091
        call    ext_unlock
2092
        call    ext_unlock
Line 2094... Line 2095...
2094
 
2095
 
2095
.is_root:
2096
.is_root:
2096
        mov     edi, esi
2097
        mov     edi, esi
2097
        lea     esi, [ebp+EXTFS.rootInodeBuffer]
2098
        lea     esi, [ebp+EXTFS.rootInodeBuffer]
-
 
2099
@@:
2098
@@:
2100
        mov     edx, [ebx+16]
2099
        mov     bl, [edi]
2101
        mov     bl, [edi]
2100
        xor     eax, eax
2102
        xor     eax, eax
2101
        mov     edi, edx
2103
        mov     edi, edx
2102
        mov     ecx, 40/4
2104
        mov     ecx, 40/4
Line 2131... Line 2133...
2131
        ret
2133
        ret
Line 2132... Line 2134...
2132
 
2134
 
2133
;----------------------------------------------------------------
2135
;----------------------------------------------------------------
2134
ext_SetFileInfo:
2136
ext_SetFileInfo:
2135
        call    extfsWritingInit
-
 
2136
        pushd   [ebx+16]
2137
        call    extfsWritingInit
2137
        call    findInode
-
 
2138
        pop     edx
2138
        call    findInode
2139
        jc      @f
2139
        jc      @f
2140
        push    esi     ; inode number
2140
        push    esi
-
 
2141
        mov     esi, [ebx+16]
2141
        lea     esi, [edx+16]
2142
        add     esi, 16
2142
        lea     edi, [ebp+EXTFS.inodeBuffer]
2143
        lea     edi, [ebp+EXTFS.inodeBuffer]
2143
        call    fsCalculateTime
2144
        call    fsCalculateTime
2144
        add     eax, 978307200  ; 01.01.1970-01.01.2001 = (365*31+8)*24*60*60
2145
        add     eax, 978307200  ; 01.01.1970-01.01.2001 = (365*31+8)*24*60*60
Line 2234... Line 2235...
2234
@@:
2235
@@:
2235
        mov     eax, [esp]
2236
        mov     eax, [esp]
2236
        lea     ebx, [ebp+EXTFS.inodeBuffer]
2237
        lea     ebx, [ebp+EXTFS.inodeBuffer]
2237
        call    readInode
2238
        call    readInode
2238
        jc      .error_stack4_eax
2239
        jc      .error_stack4_eax
-
 
2240
        push    edx
-
 
2241
        xor     eax, eax
2239
        xor     ecx, ecx
2242
        xor     edx, edx
2240
        call    extfsTruncateFile   ; free file's data
2243
        call    extfsTruncateFile   ; free file's data
2241
        movzx   ecx, [ebp+EXTFS.superblock.inodeSize]
2244
        movzx   ecx, [ebp+EXTFS.superblock.inodeSize]
2242
        lea     edi, [ebp+EXTFS.inodeBuffer]
2245
        lea     edi, [ebp+EXTFS.inodeBuffer]
2243
        xor     eax, eax
2246
        xor     eax, eax
2244
        push    edx edi
2247
        push    edi
2245
        rep stosb
2248
        rep stosb
2246
        call    fsGetTime
2249
        call    fsGetTime
2247
        pop     ebx ecx
2250
        pop     ebx ecx
2248
        add     eax, 978307200
2251
        add     eax, 978307200
2249
        mov     [ebx+INODE.deletedTime], eax
2252
        mov     [ebx+INODE.deletedTime], eax
Line 2406... Line 2409...
2406
        mov     esi, edi
2409
        mov     esi, edi
2407
        mov     dl, DIR_FLAG_FILE
2410
        mov     dl, DIR_FLAG_FILE
2408
        call    linkInode
2411
        call    linkInode
2409
        jc      .error2
2412
        jc      .error2
2410
        pop     esi ebx
2413
        pop     esi ebx
2411
        mov     ecx, [ebx+12]
2414
        mov     eax, [ebx+12]
-
 
2415
        xor     edx, edx
2412
        jmp     ext_WriteFile.start
2416
        jmp     ext_WriteFile.start
Line 2413... Line 2417...
2413
 
2417
 
2414
.exist:
2418
.exist:
2415
        movi    eax, ERROR_ACCESS_DENIED
2419
        movi    eax, ERROR_ACCESS_DENIED
2416
        test    [ebp+EXTFS.inodeBuffer.accessMode], FLAG_FILE
2420
        test    [ebp+EXTFS.inodeBuffer.accessMode], FLAG_FILE
2417
        jz      .error  ; not a file
2421
        jz      .error  ; not a file
2418
        pop     ebx
2422
        pop     ebx
-
 
2423
        mov     eax, [ebx+12]
-
 
2424
        xor     edx, edx
2419
        mov     ecx, [ebx+12]
2425
        push    eax edx ebx esi
-
 
2426
        call    extfsTruncateFile
2420
        call    extfsTruncateFile
2427
        pop     esi ebx edx eax
Line 2421... Line 2428...
2421
        jmp     ext_WriteFile.start
2428
        jmp     ext_WriteFile.start
2422
 
2429
 
2423
.error2:
2430
.error2:
Line 2429... Line 2436...
2429
        ret
2436
        ret
Line 2430... Line 2437...
2430
 
2437
 
2431
;----------------------------------------------------------------
2438
;----------------------------------------------------------------
2432
ext_WriteFile:
2439
ext_WriteFile:
2433
        call    extfsWritingInit
-
 
2434
        push    ebx
2440
        call    extfsWritingInit
2435
        call    findInode
-
 
2436
        pop     ebx
2441
        call    findInode
2437
        pushd   0 eax
2442
        pushd   0 eax
2438
        jc      .ret
2443
        jc      .ret
2439
        mov     byte [esp], ERROR_ACCESS_DENIED
2444
        mov     byte [esp], ERROR_ACCESS_DENIED
2440
        test    [ebp+EXTFS.inodeBuffer.accessMode], FLAG_FILE
2445
        test    [ebp+EXTFS.inodeBuffer.accessMode], FLAG_FILE
-
 
2446
        jz      .ret    ; not a file
2441
        jz      .ret    ; not a file
2447
        mov     byte [esp], 0
-
 
2448
        mov     eax, [ebx+4]
2442
        mov     ecx, [ebx+4]
2449
        mov     edx, [ebx+8]
-
 
2450
        add     eax, [ebx+12]
2443
        add     ecx, [ebx+12]
2451
        adc     edx, 0
2444
.start:
2452
.start:
2445
        push    esi
2453
        push    esi
2446
        mov     eax, esi
2454
        mov     ecx, esi
2447
        call    extfsExtendFile
2455
        call    extfsExtendFile
2448
        jc      .errorExtend
2456
        jc      .errorExtend
-
 
2457
        mov     eax, [ebx+4]
2449
        mov     eax, [ebx+4]
2458
        mov     edx, [ebx+8]
2450
        mov     ecx, [ebx+12]
2459
        mov     ecx, [ebx+12]
2451
        mov     esi, [ebx+16]
2460
        mov     esi, [ebx+16]
2452
.write:
-
 
2453
        xor     edx, edx
2461
.write:
2454
        div     [ebp+EXTFS.bytesPerBlock]
2462
        div     [ebp+EXTFS.bytesPerBlock]
2455
        test    edx, edx
2463
        test    edx, edx
2456
        jz      .aligned
2464
        jz      .aligned
2457
.piece:
2465
.piece:
Line 2545... Line 2553...
2545
        call    ext_unlock
2553
        call    ext_unlock
2546
        pop     eax ebx
2554
        pop     eax ebx
2547
        ret
2555
        ret
Line 2548... Line 2556...
2548
 
2556
 
2549
.erase:
2557
.erase:
2550
        push    eax eax edx
2558
        push    eax eax edi
2551
        mov     eax, ebx
2559
        mov     eax, ebx
Line 2552... Line 2560...
2552
        jmp     .write
2560
        jmp     .write
2553
 
2561
 
2554
;----------------------------------------------------------------
2562
;----------------------------------------------------------------
2555
ext_SetFileEnd:
-
 
2556
        call    extfsWritingInit
2563
ext_SetFileEnd:
2557
        pushd   [ebx+4]
-
 
2558
        call    findInode
2564
        call    extfsWritingInit
2559
        pop     ecx
2565
        call    findInode
2560
        jc      .error2
2566
        jc      .error2
2561
        lea     edi, [ebp+EXTFS.inodeBuffer]
2567
        lea     edi, [ebp+EXTFS.inodeBuffer]
2562
        movi    eax, ERROR_ACCESS_DENIED
2568
        movi    eax, ERROR_ACCESS_DENIED
-
 
2569
        test    [edi+INODE.accessMode], FLAG_FILE
2563
        test    [edi+INODE.accessMode], FLAG_FILE
2570
        jz      .error2 ; not a file
2564
        jz      .error2 ; not a file
2571
        mov     eax, [ebx+4]
-
 
2572
        mov     edx, [ebx+8]
2565
        push    esi
2573
        mov     ebx, [edi+INODE.fileSize]
2566
        mov     ebx, [edi+INODE.fileSize]
2574
        mov     ecx, [edi+INODE.fileSizeHigh]
-
 
2575
        push    esi ecx
-
 
2576
        cmp     ebx, eax
2567
        mov     eax, esi
2577
        sbb     ecx, edx
2568
        cmp     ebx, ecx
2578
        mov     ecx, esi
-
 
2579
        jnc     @f
2569
        jnc     @f
2580
        call    extfsExtendFile
-
 
2581
        pop     esi
-
 
2582
        jc      .error
2570
        call    extfsExtendFile
2583
        mov     eax, [edi+INODE.fileSize]
-
 
2584
        mov     edx, [edi+INODE.fileSizeHigh]
-
 
2585
        sub     eax, ebx
2571
        jc      .error
2586
        sbb     edx, esi
2572
        sub     ecx, ebx
2587
        jnz     .done
2573
        cmp     ecx, 1000001h
2588
        cmp     eax, 1000001h
2574
        jnc     .done
2589
        jnc     .done
2575
        push    ecx
2590
        push    eax
2576
        stdcall kernel_alloc, ecx
2591
        stdcall kernel_alloc, eax
2577
        pop     ecx
2592
        pop     ecx
2578
        test    eax, eax
2593
        test    eax, eax
2579
        jz      .error
2594
        jz      .error
2580
        push    ecx
2595
        push    ecx
-
 
2596
        add     ecx, 3
2581
        add     ecx, 3
2597
        shr     ecx, 2
2582
        shr     ecx, 2
2598
        mov     edx, esi
2583
        mov     esi, eax
2599
        mov     esi, eax
2584
        mov     edi, eax
2600
        mov     edi, eax
2585
        xor     eax, eax
2601
        xor     eax, eax
2586
        rep stosd
2602
        rep stosd
2587
        pop     ecx edx
2603
        pop     ecx edi
2588
        push    esi
2604
        push    esi
2589
        call    ext_WriteFile.erase
2605
        call    ext_WriteFile.erase
2590
        call    kernel_free
2606
        call    kernel_free
Line 2591... Line 2607...
2591
        xor     eax, eax
2607
        xor     eax, eax
2592
        ret
2608
        ret
-
 
2609
 
2593
 
2610
@@:
2594
@@:
2611
        call    extfsTruncateFile
2595
        call    extfsTruncateFile
2612
        pop     eax
2596
.done:
2613
.done:
2597
        xor     eax, eax
2614
        xor     eax, eax