Subversion Repositories Kolibri OS

Rev

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

Rev 6418 Rev 6420
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-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: 6418 $
8
$Revision: 6420 $
Line 9... Line 9...
9
 
9
 
10
; NTFS driver
10
; NTFS driver
Line 1873... Line 1873...
1873
        push    ebx ecx
1873
        push    ebx ecx
1874
        mov     ebx, edx
1874
        mov     ebx, edx
1875
        jmp     .forEXT
1875
        jmp     .forEXT
Line 1876... Line 1876...
1876
 
1876
 
-
 
1877
;----------------------------------------------------------------
-
 
1878
ntfs_GetFileInfo:
-
 
1879
        cmp     byte [esi], 0
-
 
1880
        jnz     @f
-
 
1881
        movi    eax, ERROR_UNSUPPORTED_FS
-
 
1882
        ret
-
 
1883
@@:
-
 
1884
        call    ntfs_lock
-
 
1885
        stdcall ntfs_find_lfn, [esp+4]
-
 
1886
        jnc     .found
-
 
1887
        test    eax, eax
-
 
1888
        jz      ntfsFail
-
 
1889
        jmp     ntfsNotFound
-
 
1890
 
-
 
1891
.found:
-
 
1892
        push    esi edi
-
 
1893
        mov     esi, eax
-
 
1894
        mov     edi, [ebx+16]
-
 
1895
        xor     eax, eax
-
 
1896
        call    ntfs_direntry_to_bdfe
-
 
1897
        pop     edi esi
-
 
1898
        call    ntfs_unlock
-
 
1899
        xor     eax, eax
-
 
1900
        ret
-
 
1901
 
1877
;----------------------------------------------------------------
1902
;----------------------------------------------------------------
1878
ntfs_CreateFolder:
1903
ntfs_CreateFolder:
1879
        mov     [ebp+NTFS.bFolder], 1
1904
        mov     [ebp+NTFS.bFolder], 1
Line 1880... Line 1905...
1880
        jmp     @f
1905
        jmp     @f
Line 1895... Line 1920...
1895
; found, rewrite
1920
; found, rewrite
1896
        cmp     [ebp+NTFS.cur_iRecord], 16
1921
        cmp     [ebp+NTFS.cur_iRecord], 16
1897
        jc      ntfsDenied
1922
        jc      ntfsDenied
1898
        cmp     [ebp+NTFS.bFolder], 1
1923
        cmp     [ebp+NTFS.bFolder], 1
1899
        jz      .folder
1924
        jz      .folder
-
 
1925
        test    byte [eax+fileFlags], 1
-
 
1926
        jnz     ntfsDenied
1900
        cmp     [ebp+NTFS.fragmentCount], 1
1927
        cmp     [ebp+NTFS.fragmentCount], 1
1901
        jnz     ntfsUnsupported     ; record fragmented
1928
        jnz     ntfsUnsupported     ; record fragmented
1902
; edit directory node
1929
; edit directory node
1903
        mov     edi, [ebp+NTFS.cur_index_buf]
1930
        mov     edi, [ebp+NTFS.cur_index_buf]
1904
        cmp     dword [edi], 'INDX'
1931
        cmp     dword [edi], 'INDX'
Line 1911... Line 1938...
1911
        mov     cl, [esi+attributeOffset]
1938
        mov     cl, [esi+attributeOffset]
1912
        sub     esi, [ebp+NTFS.frs_buffer]
1939
        sub     esi, [ebp+NTFS.frs_buffer]
1913
        add     eax, ecx
1940
        add     eax, ecx
1914
        add     eax, esi
1941
        add     eax, esi
1915
@@:
1942
@@:
-
 
1943
        mov     edi, eax
1916
        mov     edx, [ebx+12]
1944
        mov     eax, [ebx+12]
1917
        mov     [eax+fileRealSize], edx
1945
        mov     [edi+fileRealSize], eax
1918
        mov     dword [eax+fileRealSize+4], 0
1946
        mov     dword [edi+fileRealSize+4], 0
-
 
1947
        push    ebx eax
-
 
1948
        call    ntfsGetTime
-
 
1949
        mov     [edi+fileModified], eax
-
 
1950
        mov     [edi+fileModified+4], edx
-
 
1951
        mov     [edi+recordModified], eax
-
 
1952
        mov     [edi+recordModified+4], edx
-
 
1953
        mov     [edi+fileAccessed], eax
-
 
1954
        mov     [edi+fileAccessed+4], edx
-
 
1955
        pop     edx ebx
1919
        mov     eax, [ebp+NTFS.LastRead]
1956
        mov     eax, [ebp+NTFS.LastRead]
1920
        mov     [ebp+NTFS.nodeLastRead], eax
1957
        mov     [ebp+NTFS.nodeLastRead], eax
1921
        mov     [ebp+NTFS.cur_attr], 0x80
1958
        mov     [ebp+NTFS.cur_attr], 0x80
1922
        mov     [ebp+NTFS.cur_offs], 0
1959
        mov     [ebp+NTFS.cur_offs], 0
1923
        mov     [ebp+NTFS.cur_size], 0
1960
        mov     [ebp+NTFS.cur_size], 0
1924
        call    ntfs_read_attr
1961
        call    ntfs_read_attr
1925
        jc      ntfsFail
1962
        jc      ntfsFail
-
 
1963
        mov     esi, edi
1926
        mov     ecx, [ebp+NTFS.frs_buffer]
1964
        mov     edi, [ebp+NTFS.frs_buffer]
-
 
1965
        cmp     word [edi+baseRecordReuse], 0
-
 
1966
        jnz     ntfsUnsupported     ; auxiliary record
-
 
1967
        mov     al, [edi+attributeOffset]
-
 
1968
        add     edi, eax
-
 
1969
        mov     al, [edi+attributeOffset]
-
 
1970
        add     edi, eax
-
 
1971
        mov     ecx, 6
-
 
1972
        add     esi, fileModified
-
 
1973
        add     edi, 8
-
 
1974
        rep movsd
1927
        mov     eax, edx
1975
        mov     eax, edx
1928
        xor     edx, edx
1976
        xor     edx, edx
1929
        cmp     word [ecx+baseRecordReuse], 0
-
 
1930
        jnz     ntfsUnsupported     ; auxiliary record
-
 
1931
        mov     ecx, [ebp+NTFS.attr_offs]
1977
        mov     ecx, [ebp+NTFS.attr_offs]
1932
        cmp     word [ecx+attributeFlags], 0
1978
        cmp     word [ecx+attributeFlags], 0
1933
        jnz     ntfsUnsupported
1979
        jnz     ntfsUnsupported
1934
        push    ebx
1980
        push    ebx
1935
        cmp     byte [ecx+nonResidentFlag], 0
1981
        cmp     byte [ecx+nonResidentFlag], 0
Line 2424... Line 2470...
2424
        shr     ecx, 2
2470
        shr     ecx, 2
2425
        xor     eax, eax
2471
        xor     eax, eax
2426
        rep stosd
2472
        rep stosd
2427
        cld
2473
        cld
2428
        add     edi, 4
2474
        add     edi, 4
-
 
2475
        call    ntfsGetTime
-
 
2476
        mov     [edi+fileCreated], eax
-
 
2477
        mov     [edi+fileCreated+4], edx
-
 
2478
        mov     [edi+fileModified], eax
-
 
2479
        mov     [edi+fileModified+4], edx
-
 
2480
        mov     [edi+recordModified], eax
-
 
2481
        mov     [edi+recordModified+4], edx
-
 
2482
        mov     [edi+fileAccessed], eax
-
 
2483
        mov     [edi+fileAccessed+4], edx
2429
        pop     ecx
2484
        pop     ecx
2430
        pop     esi
2485
        pop     esi
2431
        mov     [edi+indexAllocatedSize], cx    ; fill index with data
2486
        mov     [edi+indexAllocatedSize], cx    ; fill index with data
2432
        mov     eax, [esp]
2487
        mov     eax, [esp]
2433
        shl     eax, 1
2488
        shl     eax, 1
Line 2638... Line 2693...
2638
; $StandardInformation
2693
; $StandardInformation
2639
        mov     byte [edi+attributeType], 10h
2694
        mov     byte [edi+attributeType], 10h
2640
        mov     byte [edi+sizeWithHeader], 48h
2695
        mov     byte [edi+sizeWithHeader], 48h
2641
        mov     byte [edi+sizeWithoutHeader], 30h
2696
        mov     byte [edi+sizeWithoutHeader], 30h
2642
        mov     byte [edi+attributeOffset], 18h
2697
        mov     byte [edi+attributeOffset], 18h
-
 
2698
        mov     cl, 8
-
 
2699
        add     esi, fileCreated
2643
        add     edi, 48h
2700
        add     edi, 18h
-
 
2701
        rep movsd
-
 
2702
        add     edi, 16
-
 
2703
        mov     esi, [ebp+NTFS.indexPointer]
2644
; $FileName
2704
; $FileName
2645
        mov     byte [edi+attributeType], 30h
2705
        mov     byte [edi+attributeType], 30h
2646
        mov     byte [edi+attributeID], 1
2706
        mov     byte [edi+attributeID], 1
2647
        mov     byte [edi+attributeOffset], 18h
2707
        mov     byte [edi+attributeOffset], 18h
2648
        mov     byte [edi+indexedFlag], 1
2708
        mov     byte [edi+indexedFlag], 1
Line 3482... Line 3542...
3482
        call    ntfs_lock
3542
        call    ntfs_lock
3483
        stdcall ntfs_find_lfn, [esp+4]
3543
        stdcall ntfs_find_lfn, [esp+4]
3484
        jc      ntfsNotFound
3544
        jc      ntfsNotFound
3485
        cmp     [ebp+NTFS.cur_iRecord], 16
3545
        cmp     [ebp+NTFS.cur_iRecord], 16
3486
        jc      ntfsDenied
3546
        jc      ntfsDenied
3487
        bt      dword [eax+fileFlags], 28
3547
        test    dword [eax+fileFlags], 10000001h
3488
        jc      ntfsDenied
3548
        jnz     ntfsDenied
3489
        cmp     [ebp+NTFS.fragmentCount], 1
3549
        cmp     [ebp+NTFS.fragmentCount], 1
3490
        jnz     ntfsUnsupported     ; record fragmented
3550
        jnz     ntfsUnsupported     ; record fragmented
3491
; edit directory node
3551
; edit directory node
3492
        mov     edi, [ebp+NTFS.cur_index_buf]
3552
        mov     edi, [ebp+NTFS.cur_index_buf]
3493
        cmp     dword [edi], 'INDX'
3553
        cmp     dword [edi], 'INDX'
Line 3500... Line 3560...
3500
        mov     cl, [esi+attributeOffset]
3560
        mov     cl, [esi+attributeOffset]
3501
        sub     esi, [ebp+NTFS.frs_buffer]
3561
        sub     esi, [ebp+NTFS.frs_buffer]
3502
        add     eax, ecx
3562
        add     eax, ecx
3503
        add     eax, esi
3563
        add     eax, esi
3504
@@:
3564
@@:
-
 
3565
        mov     edi, eax
3505
        mov     ecx, [ebx+4]
3566
        mov     eax, [ebx+4]
3506
        mov     edx, [ebx+8]
3567
        mov     edx, [ebx+8]
3507
        add     ecx, [ebx+12]
3568
        add     eax, [ebx+12]
3508
        adc     edx, 0
3569
        adc     edx, 0
3509
        mov     [eax+fileRealSize], ecx
3570
        mov     [edi+fileRealSize], eax
3510
        mov     [eax+fileRealSize+4], edx
3571
        mov     [edi+fileRealSize+4], edx
-
 
3572
        push    edx eax ebx
-
 
3573
        call    ntfsGetTime
-
 
3574
        mov     [edi+fileModified], eax
-
 
3575
        mov     [edi+fileModified+4], edx
-
 
3576
        mov     [edi+recordModified], eax
-
 
3577
        mov     [edi+recordModified+4], edx
-
 
3578
        mov     [edi+fileAccessed], eax
-
 
3579
        mov     [edi+fileAccessed+4], edx
-
 
3580
        pop     ebx ecx edx
3511
        mov     eax, [ebp+NTFS.LastRead]
3581
        mov     eax, [ebp+NTFS.LastRead]
3512
        mov     [ebp+NTFS.nodeLastRead], eax
3582
        mov     [ebp+NTFS.nodeLastRead], eax
3513
        mov     [ebp+NTFS.cur_attr], 0x80
3583
        mov     [ebp+NTFS.cur_attr], 0x80
3514
        mov     [ebp+NTFS.cur_offs], 0
3584
        mov     [ebp+NTFS.cur_offs], 0
3515
        mov     [ebp+NTFS.cur_size], 0
3585
        mov     [ebp+NTFS.cur_size], 0
3516
        call    ntfs_read_attr
3586
        call    ntfs_read_attr
3517
        jc      ntfsFail
3587
        jc      ntfsFail
3518
        mov     eax, ecx
3588
        mov     esi, edi
3519
        mov     ecx, [ebp+NTFS.frs_buffer]
3589
        mov     edi, [ebp+NTFS.frs_buffer]
3520
        cmp     word [ecx+baseRecordReuse], 0
3590
        cmp     word [edi+baseRecordReuse], 0
3521
        jnz     ntfsUnsupported     ; auxiliary record
3591
        jnz     ntfsUnsupported     ; auxiliary record
-
 
3592
        mov     al, [edi+attributeOffset]
-
 
3593
        add     edi, eax
-
 
3594
        mov     al, [edi+attributeOffset]
-
 
3595
        add     edi, eax
-
 
3596
        mov     eax, ecx
-
 
3597
        mov     ecx, 6
-
 
3598
        add     esi, fileModified
-
 
3599
        add     edi, 8
-
 
3600
        rep movsd
3522
        mov     ecx, [ebp+NTFS.attr_offs]
3601
        mov     ecx, [ebp+NTFS.attr_offs]
3523
        cmp     word [ecx+attributeFlags], 0
3602
        cmp     word [ecx+attributeFlags], 0
3524
        jnz     ntfsUnsupported
3603
        jnz     ntfsUnsupported
3525
        push    ebx
3604
        push    ebx
3526
        cmp     byte [ecx+nonResidentFlag], 0
3605
        cmp     byte [ecx+nonResidentFlag], 0
Line 3643... Line 3722...
3643
        call    ntfs_lock
3722
        call    ntfs_lock
3644
        stdcall ntfs_find_lfn, [esp+4]
3723
        stdcall ntfs_find_lfn, [esp+4]
3645
        jc      ntfsNotFound
3724
        jc      ntfsNotFound
3646
        cmp     [ebp+NTFS.cur_iRecord], 16
3725
        cmp     [ebp+NTFS.cur_iRecord], 16
3647
        jc      ntfsDenied
3726
        jc      ntfsDenied
-
 
3727
        test    byte [eax+fileFlags], 1
-
 
3728
        jnz     ntfsDenied
3648
        cmp     [ebp+NTFS.fragmentCount], 1
3729
        cmp     [ebp+NTFS.fragmentCount], 1
3649
        jnz     ntfsUnsupported     ; record fragmented
3730
        jnz     ntfsUnsupported     ; record fragmented
3650
        mov     ebx, [eax+directoryRecordReference]
3731
        mov     ebx, [eax+directoryRecordReference]
3651
        mov     [ebp+NTFS.newRecord], ebx
3732
        mov     [ebp+NTFS.newRecord], ebx
3652
        mov     bx, [eax+fileReferenceReuse]
3733
        mov     bx, [eax+fileReferenceReuse]
Line 3684... Line 3765...
3684
        mov     esi, [ebp+NTFS.frs_buffer]
3765
        mov     esi, [ebp+NTFS.frs_buffer]
3685
        cmp     word [esi+baseRecordReuse], 0
3766
        cmp     word [esi+baseRecordReuse], 0
3686
        jnz     ntfsUnsupported     ; auxiliary record
3767
        jnz     ntfsUnsupported     ; auxiliary record
3687
        cmp     word [esi+reuseCounter], bx
3768
        cmp     word [esi+reuseCounter], bx
3688
        jnz     .backToIndex        ; broken index
3769
        jnz     .backToIndex        ; broken index
3689
        cmp     byte [esi+recordFlags], 0
3770
        test    byte [esi+recordFlags], 1
3690
        jz      .writeBitmapMFT     ; record deleted
3771
        jz      .writeBitmapMFT     ; record deleted
3691
        cmp     byte [esi+hardLinkCounter], 3
3772
        cmp     byte [esi+hardLinkCounter], 3
3692
        jnc     ntfsUnsupported
3773
        jnc     ntfsUnsupported
3693
        mov     esi, [ebp+NTFS.attr_offs]
3774
        mov     esi, [ebp+NTFS.attr_offs]
3694
        cmp     byte [esi+nonResidentFlag], 0
3775
        cmp     byte [esi+nonResidentFlag], 0
Line 3959... Line 4040...
3959
        call    ntfs_lock
4040
        call    ntfs_lock
3960
        stdcall ntfs_find_lfn, [esp+4]
4041
        stdcall ntfs_find_lfn, [esp+4]
3961
        jc      ntfsNotFound
4042
        jc      ntfsNotFound
3962
        cmp     [ebp+NTFS.cur_iRecord], 16
4043
        cmp     [ebp+NTFS.cur_iRecord], 16
3963
        jc      ntfsDenied
4044
        jc      ntfsDenied
3964
        bt      dword [eax+fileFlags], 28
4045
        test    dword [eax+fileFlags], 10000001h
3965
        jc      ntfsDenied
4046
        jnz     ntfsDenied
3966
        cmp     [ebp+NTFS.fragmentCount], 1
4047
        cmp     [ebp+NTFS.fragmentCount], 1
3967
        jnz     ntfsUnsupported     ; record fragmented
4048
        jnz     ntfsUnsupported     ; record fragmented
3968
; edit directory node
4049
; edit directory node
3969
        mov     edi, [ebp+NTFS.cur_index_buf]
4050
        mov     edi, [ebp+NTFS.cur_index_buf]
3970
        cmp     dword [edi], 'INDX'
4051
        cmp     dword [edi], 'INDX'
Line 3977... Line 4058...
3977
        mov     cl, [esi+attributeOffset]
4058
        mov     cl, [esi+attributeOffset]
3978
        sub     esi, [ebp+NTFS.frs_buffer]
4059
        sub     esi, [ebp+NTFS.frs_buffer]
3979
        add     eax, ecx
4060
        add     eax, ecx
3980
        add     eax, esi
4061
        add     eax, esi
3981
@@:
4062
@@:
-
 
4063
        mov     edi, eax
3982
        mov     ecx, [ebx+4]
4064
        mov     eax, [ebx+4]
3983
        mov     edx, [ebx+8]
4065
        mov     edx, [ebx+8]
3984
        mov     [eax+fileRealSize], ecx
4066
        mov     [edi+fileRealSize], eax
3985
        mov     [eax+fileRealSize+4], edx
4067
        mov     [edi+fileRealSize+4], edx
-
 
4068
        push    edx eax ebx
-
 
4069
        call    ntfsGetTime
-
 
4070
        mov     [edi+fileModified], eax
-
 
4071
        mov     [edi+fileModified+4], edx
-
 
4072
        mov     [edi+recordModified], eax
-
 
4073
        mov     [edi+recordModified+4], edx
-
 
4074
        mov     [edi+fileAccessed], eax
-
 
4075
        mov     [edi+fileAccessed+4], edx
-
 
4076
        pop     ebx ecx edx
3986
        mov     eax, [ebp+NTFS.LastRead]
4077
        mov     eax, [ebp+NTFS.LastRead]
3987
        mov     [ebp+NTFS.nodeLastRead], eax
4078
        mov     [ebp+NTFS.nodeLastRead], eax
3988
        mov     [ebp+NTFS.cur_attr], 0x80
4079
        mov     [ebp+NTFS.cur_attr], 0x80
3989
        mov     [ebp+NTFS.cur_offs], 0
4080
        mov     [ebp+NTFS.cur_offs], 0
3990
        mov     [ebp+NTFS.cur_size], 0
4081
        mov     [ebp+NTFS.cur_size], 0
3991
        call    ntfs_read_attr
4082
        call    ntfs_read_attr
3992
        jc      ntfsFail
4083
        jc      ntfsFail
3993
        mov     eax, ecx
4084
        mov     esi, edi
3994
        mov     ecx, [ebp+NTFS.frs_buffer]
4085
        mov     edi, [ebp+NTFS.frs_buffer]
3995
        cmp     word [ecx+baseRecordReuse], 0
4086
        cmp     word [edi+baseRecordReuse], 0
3996
        jnz     ntfsUnsupported     ; auxiliary record
4087
        jnz     ntfsUnsupported     ; auxiliary record
-
 
4088
        mov     al, [edi+attributeOffset]
-
 
4089
        add     edi, eax
-
 
4090
        mov     al, [edi+attributeOffset]
-
 
4091
        add     edi, eax
-
 
4092
        mov     eax, ecx
-
 
4093
        mov     ecx, 6
-
 
4094
        add     esi, fileModified
-
 
4095
        add     edi, 8
-
 
4096
        rep movsd
3997
        mov     ecx, [ebp+NTFS.attr_offs]
4097
        mov     ecx, [ebp+NTFS.attr_offs]
3998
        cmp     word [ecx+attributeFlags], 0
4098
        cmp     word [ecx+attributeFlags], 0
3999
        jnz     ntfsUnsupported
4099
        jnz     ntfsUnsupported
4000
        cmp     byte [ecx+nonResidentFlag], 0
4100
        cmp     byte [ecx+nonResidentFlag], 0
4001
        jz      .resizeAttribute
4101
        jz      .resizeAttribute
Line 4047... Line 4147...
4047
        mov     edx, [ebp+NTFS.nodeLastRead]
4147
        mov     edx, [ebp+NTFS.nodeLastRead]
4048
        call    writeRecord     ; directory
4148
        call    writeRecord     ; directory
4049
        call    ntfsSpaceClean
4149
        call    ntfsSpaceClean
4050
        jmp     ntfsDone
4150
        jmp     ntfsDone
Line -... Line 4151...
-
 
4151
 
-
 
4152
ntfsReadCMOS:
4051
 
4153
        out     70h, al
-
 
4154
        in      al, 71h
-
 
4155
        xor     ah, ah
-
 
4156
        shl     ax, 4
-
 
4157
        shr     al, 4
-
 
4158
        aad
-
 
4159
        ret
4052
;----------------------------------------------------------------
4160
 
-
 
4161
ntfsGetTime:
-
 
4162
        mov     al, 7
-
 
4163
        call    ntfsReadCMOS
-
 
4164
        ror     eax, 8
-
 
4165
        mov     al, 8
-
 
4166
        call    ntfsReadCMOS
-
 
4167
        ror     eax, 8
-
 
4168
        mov     al, 9
-
 
4169
        call    ntfsReadCMOS
-
 
4170
        add     eax, 2000
-
 
4171
        ror     eax, 16
-
 
4172
        push    eax
-
 
4173
        xor     eax, eax
-
 
4174
        call    ntfsReadCMOS
-
 
4175
        ror     eax, 8
-
 
4176
        mov     al, 2
-
 
4177
        call    ntfsReadCMOS
-
 
4178
        ror     eax, 8
-
 
4179
        mov     al, 4
-
 
4180
        call    ntfsReadCMOS
-
 
4181
        ror     eax, 16
-
 
4182
        push    eax
-
 
4183
        mov     esi, esp
-
 
4184
        add     esp, 8
-
 
4185
ntfsCalculateTime:
-
 
4186
; in: esi -> data block
-
 
4187
; out: edx:eax = time
-
 
4188
        movzx   eax, word [esi+6]
-
 
4189
        sub     eax, 2001
-
 
4190
        jnc     @f
-
 
4191
        xor     eax, eax
-
 
4192
@@:
-
 
4193
        mov     edx, months
-
 
4194
        mov     ebx, eax
-
 
4195
        inc     eax
-
 
4196
        test    eax, 3
-
 
4197
        jnz     @f
-
 
4198
        add     edx, 12
4053
ntfs_SetFileInfo:
4199
@@:
-
 
4200
        movzx   eax, byte [esi+5]
-
 
4201
        dec     eax
-
 
4202
        xor     ecx, ecx
-
 
4203
@@:
-
 
4204
        dec     eax
-
 
4205
        js      @f
-
 
4206
        add     cl, [edx+eax]
-
 
4207
        adc     ch, 0
-
 
4208
        jmp     @b
-
 
4209
@@:
-
 
4210
        mov     eax, ebx
-
 
4211
        mov     edx, 365
-
 
4212
        mul     edx
-
 
4213
        shr     ebx, 2
-
 
4214
        add     eax, ebx
-
 
4215
        add     eax, ecx
-
 
4216
        mov     bl, [esi+4]
-
 
4217
        add     eax, ebx
-
 
4218
        add     eax, 400*365+100-4
-
 
4219
        mov     dl, 24
-
 
4220
        mul     edx
-
 
4221
        mov     bl, [esi+2]
-
 
4222
        add     eax, ebx
-
 
4223
        mov     ecx, 60
-
 
4224
        mul     ecx
-
 
4225
        mov     bl, [esi+1]
-
 
4226
        add     eax, ebx
-
 
4227
        mul     ecx
-
 
4228
        mov     bl, [esi]
-
 
4229
        add     ebx, eax
-
 
4230
        mov     eax, edx
-
 
4231
        mov     ecx, 10000000
-
 
4232
        mul     ecx
-
 
4233
        xchg    eax, ebx
-
 
4234
        mul     ecx
4054
        movi    eax, ERROR_UNSUPPORTED_FS
4235
        add     edx, ebx
Line 4055... Line 4236...
4055
        ret
4236
        ret
4056
 
4237
 
4057
;----------------------------------------------------------------
4238
;----------------------------------------------------------------
4058
ntfs_GetFileInfo:
4239
ntfs_SetFileInfo:
4059
        cmp     byte [esi], 0
4240
        cmp     byte [esi], 0
4060
        jnz     @f
4241
        jnz     @f
4061
        movi    eax, ERROR_UNSUPPORTED_FS
4242
        movi    eax, ERROR_UNSUPPORTED_FS
4062
        ret
4243
        ret
4063
@@:
4244
@@:
4064
        call    ntfs_lock
4245
        call    ntfs_lock
4065
        stdcall ntfs_find_lfn, [esp+4]
4246
        stdcall ntfs_find_lfn, [esp+4]
4066
        jnc     .found
4247
        jnc     @f
4067
        test    eax, eax
4248
        test    eax, eax
-
 
4249
        jz      ntfsFail
4068
        jz      ntfsFail
4250
        jmp     ntfsNotFound
-
 
4251
 
-
 
4252
@@:
-
 
4253
        cmp     [ebp+NTFS.fragmentCount], 1
-
 
4254
        jnz     ntfsUnsupported     ; record fragmented
-
 
4255
        mov     esi, [ebp+NTFS.cur_index_buf]
4069
        jmp     ntfsNotFound
4256
        cmp     dword [esi], 'INDX'
-
 
4257
        jz      @f
-
 
4258
        sub     eax, esi
-
 
4259
        mov     esi, [ebp+NTFS.indexRoot]
4070
.found:
4260
        movzx   edx, byte [esi+attributeOffset]
-
 
4261
        add     eax, esi
4071
        push    esi edi
4262
        add     eax, edx
4072
        mov     esi, eax
4263
@@:
-
 
4264
        mov     esi, [ebx+16]
-
 
4265
        mov     edi, eax
-
 
4266
        mov     eax, [esi]
-
 
4267
        and     eax, 27h
-
 
4268
        and     byte [edi+fileFlags], -28h
4073
        mov     edi, [ebx+16]
4269
        or      [edi+fileFlags], al
-
 
4270
        add     esi, 8
-
 
4271
        call    ntfsCalculateTime
4074
        xor     eax, eax
4272
        mov     [edi+fileCreated], eax
4075
        call    ntfs_direntry_to_bdfe
4273
        mov     [edi+fileCreated+4], edx
-
 
4274
        add     esi, 8
-
 
4275
        call    ntfsCalculateTime
4076
        pop     edi esi
4276
        mov     [edi+fileAccessed], eax
-
 
4277
        mov     [edi+fileAccessed+4], edx
-
 
4278
        add     esi, 8
-
 
4279
        call    ntfsCalculateTime
-
 
4280
        mov     [edi+fileModified], eax
-
 
4281
        mov     [edi+fileModified+4], edx
4077
        call    ntfs_unlock
4282
        mov     ebx, [ebp+NTFS.cur_index_buf]
-
 
4283
        cmp     dword [ebx], 'INDX'
-
 
4284
        jz      @f
-
 
4285
        mov     ebx, [ebp+NTFS.frs_buffer]
-
 
4286
@@:
-
 
4287
        mov     edx, [ebp+NTFS.LastRead]
Line 4078... Line 4288...
4078
        xor     eax, eax
4288
        call    writeRecord
4079
        ret
4289
        jmp     ntfsDone
4080
 
4290
 
4081
ntfsUnsupported:
4291
ntfsUnsupported: