Subversion Repositories Kolibri OS

Rev

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

Rev 6107 Rev 6151
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: 6107 $
8
$Revision: 6151 $
Line 9... Line 9...
9
 
9
 
10
; NTFS driver
10
; NTFS driver
Line 2013... Line 2013...
2013
; found, rewrite
2013
; found, rewrite
2014
        cmp     [ebp+NTFS.ntfs_cur_iRecord], 16
2014
        cmp     [ebp+NTFS.ntfs_cur_iRecord], 16
2015
        jc      ntfsDenied
2015
        jc      ntfsDenied
2016
        cmp     [ebp+NTFS.ntfsFolder], 1
2016
        cmp     [ebp+NTFS.ntfsFolder], 1
2017
        jz      .folder
2017
        jz      .folder
2018
        xor     ecx, ecx
-
 
2019
        mov     edx, [ebx+12]
-
 
2020
        mov     [ebp+NTFS.nodeLastRead], ecx
-
 
2021
        cmp     [eax+fileRealSize+4], ecx
-
 
2022
        jnz     @f
-
 
2023
        cmp     [eax+fileRealSize], edx
-
 
2024
        jz      .readAttribute
-
 
2025
@@:         ; set file size in the directory
-
 
2026
        cmp     [ebp+NTFS.ntfsFragmentCount], 1
2018
        cmp     [ebp+NTFS.ntfsFragmentCount], 1
2027
        jnz     ntfsUnsupported     ; record fragmented
2019
        jnz     ntfsUnsupported     ; record fragmented
-
 
2020
; edit directory node
2028
        mov     edi, [ebp+NTFS.cur_index_buf]
2021
        mov     edi, [ebp+NTFS.cur_index_buf]
2029
        cmp     dword [edi], 'INDX'
2022
        cmp     dword [edi], 'INDX'
2030
        jz      @f
2023
        jz      @f
2031
        mov     esi, [ebp+NTFS.frs_buffer]
2024
        mov     esi, [ebp+NTFS.frs_buffer]
2032
        mov     ecx, [esi+recordRealSize]
2025
        mov     ecx, [esi+recordRealSize]
Line 2035... Line 2028...
2035
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2028
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2036
        mov     cl, [esi+attributeOffset]
2029
        mov     cl, [esi+attributeOffset]
2037
        sub     esi, [ebp+NTFS.frs_buffer]
2030
        sub     esi, [ebp+NTFS.frs_buffer]
2038
        add     eax, ecx
2031
        add     eax, ecx
2039
        add     eax, esi
2032
        add     eax, esi
2040
        xor     ecx, ecx
-
 
2041
@@:
2033
@@:
-
 
2034
        mov     edx, [ebx+12]
2042
        mov     [eax+fileRealSize], edx
2035
        mov     [eax+fileRealSize], edx
2043
        mov     [eax+fileRealSize+4], ecx
2036
        mov     dword [eax+fileRealSize+4], 0
2044
        mov     eax, [ebp+NTFS.ntfsLastRead]
2037
        mov     eax, [ebp+NTFS.ntfsLastRead]
2045
        mov     [ebp+NTFS.nodeLastRead], eax
2038
        mov     [ebp+NTFS.nodeLastRead], eax
2046
.readAttribute:
-
 
2047
        mov     [ebp+NTFS.ntfs_cur_attr], 0x80
2039
        mov     [ebp+NTFS.ntfs_cur_attr], 0x80
2048
        mov     [ebp+NTFS.ntfs_cur_offs], 0
2040
        mov     [ebp+NTFS.ntfs_cur_offs], 0
2049
        mov     [ebp+NTFS.ntfs_cur_size], 0
2041
        mov     [ebp+NTFS.ntfs_cur_size], 0
2050
        call    ntfs_read_attr
2042
        call    ntfs_read_attr
2051
        jc      ntfsFail
2043
        jc      ntfsFail
Line 2053... Line 2045...
2053
        mov     eax, edx
2045
        mov     eax, edx
2054
        xor     edx, edx
2046
        xor     edx, edx
2055
        cmp     word [ecx+baseRecordReuse], 0
2047
        cmp     word [ecx+baseRecordReuse], 0
2056
        jnz     ntfsUnsupported     ; auxiliary record
2048
        jnz     ntfsUnsupported     ; auxiliary record
2057
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
2049
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
2058
        cmp     byte [ecx+nonResidentFlag], 1
2050
        cmp     word [ecx+attributeFlags], 0
2059
        jnz     ntfsUnsupported     ; resident $DATA
2051
        jnz     ntfsUnsupported
2060
        test    eax, eax
2052
        push    ebx
-
 
2053
        cmp     byte [ecx+nonResidentFlag], 0
2061
        jz      ntfsUnsupported
2054
        jz      @f
2062
        cmp     [ecx+attributeRealSize+4], edx
2055
        cmp     [ecx+attributeRealSize+4], edx
2063
        jnz     @f
2056
        jnz     @f
2064
        cmp     [ecx+attributeRealSize], eax
2057
        cmp     [ecx+attributeRealSize], eax
2065
        jz      ntfs_WriteFile.writeNode
2058
        jz      ntfs_WriteFile.writeNode
2066
@@:
2059
@@:
Line 2146... Line 2139...
2146
        shr     ecx, 2
2139
        shr     ecx, 2
2147
        xor     eax, eax
2140
        xor     eax, eax
2148
        rep stosd
2141
        rep stosd
2149
        cld
2142
        cld
2150
        add     edi, 4
2143
        add     edi, 4
2151
        pop     eax
2144
        pop     ecx
2152
        pop     esi
2145
        pop     esi
2153
        mov     [edi+indexAllocatedSize], ax     ; fill index with data
2146
        mov     [edi+indexAllocatedSize], cx    ; fill index with data
2154
        mov     eax, [esp]
2147
        mov     eax, [esp]
2155
        shl     eax, 1
2148
        shl     eax, 1
2156
        add     eax, 42h
2149
        add     eax, 42h
2157
        mov     [edi+indexRawSize], ax
2150
        mov     [edi+indexRawSize], ax
2158
        mov     eax, [ebp+NTFS.ntfs_attr_iRecord]
2151
        mov     eax, [ebp+NTFS.ntfs_attr_iRecord]
2159
        mov     [edi+directoryRecordReference], eax
2152
        mov     [edi+directoryRecordReference], eax
2160
        mov     eax, [ebp+NTFS.frs_buffer]
2153
        mov     eax, [ebp+NTFS.frs_buffer]
2161
        mov     eax, [eax+reuseCounter]
2154
        mov     eax, [eax+reuseCounter]
2162
        mov     [edi+directoryReferenceReuse], ax
2155
        mov     [edi+directoryReferenceReuse], ax
2163
        mov     eax, [ebx+12]
2156
        mov     eax, [ebx+12]
-
 
2157
        add     ecx, 30h+48h+8+18h+8
-
 
2158
        add     ecx, eax
2164
        mov     [ebp+NTFS.fileRealSize], eax
2159
        mov     [ebp+NTFS.fileRealSize], eax
2165
        mov     [edi+fileRealSize], eax
2160
        mov     [edi+fileRealSize], eax
-
 
2161
        cmp     [ebp+NTFS.frs_size], ecx
-
 
2162
        jc      @f
-
 
2163
        mov     eax, [ebx+16]
-
 
2164
        mov     [ebp+NTFS.fileDataStart], eax
-
 
2165
        xor     eax, eax
-
 
2166
@@:
2166
        mov     ecx, [ebp+NTFS.sectors_per_cluster]
2167
        mov     ecx, [ebp+NTFS.sectors_per_cluster]
2167
        shl     ecx, 9
2168
        shl     ecx, 9
2168
        add     eax, ecx
2169
        add     eax, ecx
2169
        dec     eax
2170
        dec     eax
2170
        xor     edx, edx
2171
        xor     edx, edx
Line 2189... Line 2190...
2189
        mov     edi, [ebp+NTFS.indexOffset]
2190
        mov     edi, [ebp+NTFS.indexOffset]
2190
        bts     dword [edi+fileFlags], 28
2191
        bts     dword [edi+fileFlags], 28
2191
        jmp     .mftBitmap
2192
        jmp     .mftBitmap
Line 2192... Line 2193...
2192
 
2193
 
2193
@@: ; 3. File data
2194
@@: ; 3. File data
2194
        cmp     [ebp+NTFS.fileRealSize], 0
2195
        cmp     [ebp+NTFS.fileDataSize], 0
2195
        jz      .mftBitmap
2196
        jz      .mftBitmap
2196
        mov     edi, [ebp+NTFS.BitmapStart]
2197
        mov     edi, [ebp+NTFS.BitmapStart]
2197
        call    ntfsSpaceAlloc
2198
        call    ntfsSpaceAlloc
2198
        jc      ntfsDiskFull
2199
        jc      ntfsDiskFull
Line 2295... Line 2296...
2295
        call    fs_write64_sys  ; $MFTMirr
2296
        call    fs_write64_sys  ; $MFTMirr
2296
        call    ntfsSpaceClean
2297
        call    ntfsSpaceClean
2297
        pop     [ebp+NTFS.fileDataSize]
2298
        pop     [ebp+NTFS.fileDataSize]
2298
        pop     [ebp+NTFS.fileDataStart]
2299
        pop     [ebp+NTFS.fileDataStart]
2299
.mftRecord:
2300
.mftRecord:
2300
        mov     esi, [ebp+NTFS.indexOffset]
2301
        mov     ecx, [ebp+NTFS.frs_size]
-
 
2302
        shr     ecx, 2
2301
        mov     edi, [ebp+NTFS.frs_buffer]
2303
        mov     edi, [ebp+NTFS.frs_buffer]
2302
        xor     eax, eax
2304
        xor     eax, eax
2303
        movzx   ecx, word [esi+indexAllocatedSize]
-
 
2304
        add     ecx, 8+30h+48h+50h+8
-
 
2305
        push    ecx
-
 
2306
        shr     ecx, 2
-
 
2307
        rep stosd
2305
        rep stosd
2308
        mov     edi, [ebp+NTFS.frs_buffer]
2306
        mov     edi, [ebp+NTFS.frs_buffer]
2309
; record header
2307
; record header
-
 
2308
        mov     eax, [ebp+NTFS.frs_size]
-
 
2309
        mov     [edi+recordAllocatedSize], eax
-
 
2310
        shr     eax, 9
-
 
2311
        inc     eax
-
 
2312
        mov     [edi+updateSequenceSize], al
2310
        mov     dword[edi], 'FILE'
2313
        mov     dword[edi], 'FILE'
2311
        mov     byte [edi+updateSequenceOffset], 2ah
2314
        mov     byte [edi+updateSequenceOffset], 2ah
2312
        mov     byte [edi+updateSequenceSize], 3
-
 
2313
        mov     byte [edi+hardLinkCounter], 1
2315
        mov     byte [edi+hardLinkCounter], 1
2314
        mov     byte [edi+attributeOffset], 30h
2316
        mov     byte [edi+attributeOffset], 30h
2315
        popd    [edi+recordRealSize]
-
 
2316
        mov     word [edi+recordAllocatedSize], 1024
-
 
2317
        mov     byte [edi+newAttributeID], 3
2317
        mov     byte [edi+newAttributeID], 3
2318
        rdtsc
2318
        rdtsc
2319
        mov     [edi+2ah], ax
2319
        mov     [edi+2ah], ax
2320
        add     edi, 30h
2320
        add     edi, 30h
2321
; $StandardInformation
2321
; $StandardInformation
Line 2323... Line 2323...
2323
        mov     byte [edi+sizeWithHeader], 48h
2323
        mov     byte [edi+sizeWithHeader], 48h
2324
        mov     byte [edi+sizeWithoutHeader], 30h
2324
        mov     byte [edi+sizeWithoutHeader], 30h
2325
        mov     byte [edi+attributeOffset], 18h
2325
        mov     byte [edi+attributeOffset], 18h
2326
        add     edi, 48h
2326
        add     edi, 48h
2327
; $FileName
2327
; $FileName
-
 
2328
        mov     esi, [ebp+NTFS.indexOffset]
2328
        mov     byte [edi+attributeType], 30h
2329
        mov     byte [edi+attributeType], 30h
2329
        mov     byte [edi+attributeID], 1
2330
        mov     byte [edi+attributeID], 1
-
 
2331
        mov     byte [edi+attributeOffset], 18h
-
 
2332
        mov     byte [edi+indexedFlag], 1
2330
        mov     cx, [esi+indexRawSize]
2333
        mov     cx, [esi+indexRawSize]
2331
        mov     [edi+sizeWithoutHeader], ecx
2334
        mov     [edi+sizeWithoutHeader], ecx
2332
        mov     cx, [esi+indexAllocatedSize]
2335
        mov     cx, [esi+indexAllocatedSize]
2333
        add     ecx, 8
2336
        add     ecx, 8
2334
        mov     [edi+sizeWithHeader], ecx
2337
        mov     [edi+sizeWithHeader], ecx
2335
        mov     byte [edi+attributeOffset], 18h
-
 
2336
        mov     byte [edi+indexedFlag], 1
-
 
2337
        add     edi, 18h
2338
        add     edi, 18h
2338
        add     esi, 16
2339
        add     esi, 16
2339
        sub     ecx, 18h
2340
        sub     ecx, 18h
2340
        shr     ecx, 2
2341
        shr     ecx, 2
2341
        rep movsd
2342
        rep movsd
2342
        mov     byte [edi+sizeWithHeader], 50h
2343
        mov     byte [edi+sizeWithHeader], 50h
2343
        mov     byte [edi+attributeID], 2
2344
        mov     byte [edi+attributeID], 2
2344
        mov     dword[edi+50h], -1      ; $End
-
 
2345
        cmp     [ebp+NTFS.ntfsFolder], 0
2345
        cmp     [ebp+NTFS.ntfsFolder], 1
2346
        jnz     @f
2346
        jz      .indexRoot
2347
; $Data
2347
; $Data
2348
        mov     byte [edi+attributeType], 80h
2348
        mov     byte [edi+attributeType], 80h
2349
        cmp     [ebp+NTFS.fileRealSize], 0
-
 
2350
        jz      .zeroSize
-
 
2351
        mov     esi, [ebp+NTFS.indexOffset]
-
 
2352
        mov     eax, [ebp+NTFS.fileDataSize]
2349
        mov     eax, [ebp+NTFS.fileDataSize]
-
 
2350
        test    eax, eax
-
 
2351
        jz      .resident
-
 
2352
        mov     esi, [ebp+NTFS.indexOffset]
2353
        dec     eax
2353
        dec     eax
2354
        mov     [edi+lastVCN], eax
2354
        mov     [edi+lastVCN], eax
2355
        mov     byte [edi+nonResidentFlag], 1
2355
        mov     byte [edi+nonResidentFlag], 1
2356
        mov     byte [edi+dataRunsOffset], 40h
2356
        mov     byte [edi+dataRunsOffset], 40h
2357
        mov     eax, [esi+fileAllocatedSize]
2357
        mov     eax, [esi+fileAllocatedSize]
2358
        mov     [edi+attributeAllocatedSize], eax
2358
        mov     [edi+attributeAllocatedSize], eax
2359
        mov     eax, [esi+fileRealSize]
2359
        mov     eax, [esi+fileRealSize]
2360
        mov     [edi+attributeRealSize], eax
2360
        mov     [edi+attributeRealSize], eax
2361
        mov     [edi+initialDataSize], eax
2361
        mov     [edi+initialDataSize], eax
-
 
2362
        push    edi
2362
        mov     esi, edi
2363
        mov     esi, edi
2363
        add     edi, 40h
2364
        add     edi, 40h
2364
        call    createMcbEntry
2365
        call    createMcbEntry
2365
        mov     al, 1
2366
        inc     edi
2366
        jmp     .writeMftRecord
2367
        jmp     @f
Line 2367... Line 2368...
2367
 
2368
 
-
 
2369
.resident:
-
 
2370
        mov     ecx, [ebp+NTFS.fileRealSize]
2368
.zeroSize:
2371
        mov     [edi+sizeWithoutHeader], ecx
-
 
2372
        mov     byte [edi+attributeOffset], 18h
-
 
2373
        push    edi
-
 
2374
        mov     esi, [ebp+NTFS.fileDataStart]
-
 
2375
        add     edi, 18h
-
 
2376
        rep movsb
-
 
2377
@@:
-
 
2378
        mov     eax, edi
-
 
2379
        pop     edi
-
 
2380
        sub     eax, edi
-
 
2381
        add     eax, 7
-
 
2382
        and     eax, not 7
-
 
2383
        mov     [edi+sizeWithHeader], eax
2369
        mov     byte [edi+attributeOffset], 18h
2384
        add     edi, eax
2370
        mov     al, 1
2385
        mov     al, 1
Line 2371... Line 2386...
2371
        jmp     .writeMftRecord
2386
        jmp     @f
2372
 
2387
 
2373
@@: ; $IndexRoot
2388
.indexRoot:
2374
        mov     byte [edi+attributeType], 90h
2389
        mov     byte [edi+attributeType], 90h
2375
        mov     byte [edi+nameLength], 4
2390
        mov     byte [edi+nameLength], 4
2376
        mov     byte [edi+nameOffset], 18h
2391
        mov     byte [edi+nameOffset], 18h
Line 2387... Line 2402...
2387
        mov     byte [edi+30h+indexOffset], 16
2402
        mov     byte [edi+30h+indexOffset], 16
2388
        mov     byte [edi+30h+nodeRealSize], 32
2403
        mov     byte [edi+30h+nodeRealSize], 32
2389
        mov     byte [edi+30h+nodeAllocatedSize], 32
2404
        mov     byte [edi+30h+nodeAllocatedSize], 32
2390
        mov     byte [edi+40h+indexAllocatedSize], 16
2405
        mov     byte [edi+40h+indexAllocatedSize], 16
2391
        mov     byte [edi+40h+indexFlags], 2
2406
        mov     byte [edi+40h+indexFlags], 2
-
 
2407
        add     edi, 50h
2392
        mov     al, 3
2408
        mov     al, 3
2393
.writeMftRecord:
2409
@@:
2394
        mov     edi, [ebp+NTFS.frs_buffer]
2410
        mov     esi, [ebp+NTFS.frs_buffer]
-
 
2411
        mov     dword [edi], -1
-
 
2412
        mov     dword [edi+4], 0
-
 
2413
        add     edi, 8
-
 
2414
        sub     edi, esi
2395
        mov     [ebp+NTFS.ntfs_cur_buf], edi
2415
        mov     [ebp+NTFS.ntfs_cur_buf], esi
2396
        mov     [edi+recordFlags], al
2416
        mov     [esi+recordFlags], al
-
 
2417
        mov     [esi+recordRealSize], edi
2397
        call    writeRecord
2418
        call    writeRecord
2398
        test    eax, eax
2419
        test    eax, eax
2399
        jnz     ntfsDevice
2420
        jnz     ntfsDevice
2400
; write MFT bitmap
2421
; write MFT bitmap
2401
        mov     eax, [ebp+NTFS.newMftRecord]
2422
        mov     eax, [ebp+NTFS.newMftRecord]
Line 2408... Line 2429...
2408
        xor     edx, edx
2429
        xor     edx, edx
2409
        call    fs_write64_sys
2430
        call    fs_write64_sys
2410
        test    eax, eax
2431
        test    eax, eax
2411
        jnz     ntfsDevice
2432
        jnz     ntfsDevice
2412
; 5. Write partition bitmap
2433
; 5. Write partition bitmap
2413
        cmp     [ebp+NTFS.ntfsFolder], 0
2434
        cmp     [ebp+NTFS.ntfsFolder], 1
2414
        jnz     @f
-
 
2415
        cmp     [ebp+NTFS.fileRealSize], 0
-
 
2416
        jz      @f
2435
        jz      @f
2417
        mov     eax, [ebp+NTFS.fileDataStart]
2436
        mov     eax, [ebp+NTFS.fileDataStart]
2418
        mov     ecx, [ebp+NTFS.fileDataSize]
2437
        mov     ecx, [ebp+NTFS.fileDataSize]
-
 
2438
        test    ecx, ecx
-
 
2439
        jz      @f
2419
        add     ecx, eax
2440
        add     ecx, eax
2420
        add     ecx, 4095
2441
        add     ecx, 4095
2421
        shr     ecx, 3+9
2442
        shr     ecx, 3+9
2422
        shr     eax, 3+9
2443
        shr     eax, 3+9
2423
        sub     ecx, eax
2444
        sub     ecx, eax
Line 2497... Line 2518...
2497
        shr     eax, 8
2518
        shr     eax, 8
2498
        jnz     @b
2519
        jnz     @b
2499
        lea     eax, [edi+edx+1]
2520
        lea     eax, [edi+edx+1]
2500
        add     eax, ecx
2521
        add     eax, ecx
2501
        sub     eax, esi
2522
        sub     eax, esi
2502
        sub     ax, [esi+sizeWithHeader]
2523
        sub     eax, [esi+sizeWithHeader]
2503
        jc      @f
2524
        jc      @f
2504
        add     word [esi+sizeWithHeader], 8    ; extend attribute
2525
        add     word [esi+sizeWithHeader], 8    ; extend attribute
2505
        mov     esi, [ebp+NTFS.frs_buffer]
2526
        mov     esi, [ebp+NTFS.frs_buffer]
2506
        mov     eax, [esi+recordRealSize]
2527
        mov     eax, [esi+recordRealSize]
2507
        add     eax, 8
2528
        add     eax, 8
Line 2529... Line 2550...
2529
        lea     esi, [ebp+NTFS.fileDataSize]
2550
        lea     esi, [ebp+NTFS.fileDataSize]
2530
        rep movsb
2551
        rep movsb
2531
        lea     esi, [ebp+NTFS.fileDataStart]
2552
        lea     esi, [ebp+NTFS.fileDataStart]
2532
        mov     ecx, edx
2553
        mov     ecx, edx
2533
        rep movsb
2554
        rep movsb
-
 
2555
        mov     [edi], cl
2534
.end:
2556
.end:
2535
        ret
2557
        ret
Line 2536... Line 2558...
2536
 
2558
 
2537
resizeAttribute:
2559
resizeAttribute:
Line 2542... Line 2564...
2542
;   out:
2564
;   out:
2543
; [ebp+NTFS.fileDataSize] = clusters added (positive)
2565
; [ebp+NTFS.fileDataSize] = clusters added (positive)
2544
; [ebp+NTFS.fileDataStart] = added block
2566
; [ebp+NTFS.fileDataStart] = added block
2545
; CF=1 -> eax = error code
2567
; CF=1 -> eax = error code
2546
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2568
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2547
        mov     ecx, [ebp+NTFS.sectors_per_cluster]
-
 
2548
        shl     ecx, 9
-
 
2549
        mov     dword [ebp+NTFS.ntfs_attr_size], eax
2569
        mov     dword [ebp+NTFS.ntfs_attr_size], eax
2550
        mov     dword [ebp+NTFS.ntfs_attr_size+4], edx
2570
        mov     dword [ebp+NTFS.ntfs_attr_size+4], edx
-
 
2571
        cmp     byte [esi+nonResidentFlag], 0
-
 
2572
        jz      .resident
-
 
2573
        mov     ecx, [ebp+NTFS.sectors_per_cluster]
-
 
2574
        shl     ecx, 9
2551
        mov     [esi+attributeRealSize], eax
2575
        mov     [esi+attributeRealSize], eax
2552
        mov     [esi+attributeRealSize+4], edx
2576
        mov     [esi+attributeRealSize+4], edx
2553
        mov     [esi+initialDataSize], eax
2577
        mov     [esi+initialDataSize], eax
2554
        mov     [esi+initialDataSize+4], edx
2578
        mov     [esi+initialDataSize+4], edx
2555
        sub     eax, 1
2579
        sub     eax, 1
2556
        sbb     edx, 0
2580
        sbb     edx, 0
-
 
2581
        jc      .makeResident
2557
        div     ecx
2582
        div     ecx
2558
        mov     edi, eax
2583
        mov     edi, eax
2559
        inc     eax
2584
        inc     eax
2560
        mul     ecx
2585
        mul     ecx
2561
        mov     [esi+attributeAllocatedSize], eax
2586
        mov     [esi+attributeAllocatedSize], eax
Line 2614... Line 2639...
2614
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2639
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2615
        call    createMcbEntry
2640
        call    createMcbEntry
2616
        pop     ecx
2641
        pop     ecx
2617
        pop     eax
2642
        pop     eax
2618
        jc      .err2
2643
        jc      .err2
2619
        mov     byte [edi], 0
-
 
2620
        mov     [ebp+NTFS.fileDataSize], ecx
2644
        mov     [ebp+NTFS.fileDataSize], ecx
2621
        mov     [ebp+NTFS.fileDataStart], eax
2645
        mov     [ebp+NTFS.fileDataStart], eax
-
 
2646
.writeBitmap:
2622
        add     ecx, eax
2647
        add     ecx, eax
2623
        add     ecx, 4095
2648
        add     ecx, 4095
2624
        shr     ecx, 3+9
2649
        shr     ecx, 3+9
2625
        shr     eax, 3+9
2650
        shr     eax, 3+9
2626
        sub     ecx, eax
2651
        sub     ecx, eax
Line 2629... Line 2654...
2629
        add     eax, [ebp+NTFS.BitmapLocation]
2654
        add     eax, [ebp+NTFS.BitmapLocation]
2630
        add     ebx, [ebp+NTFS.BitmapBuffer]
2655
        add     ebx, [ebp+NTFS.BitmapBuffer]
2631
        xor     edx, edx
2656
        xor     edx, edx
2632
        call    fs_write64_app
2657
        call    fs_write64_app
2633
        test    eax, eax
2658
        test    eax, eax
2634
        jz      .done
2659
        jnz     @f
-
 
2660
.done:
-
 
2661
        ret
-
 
2662
 
-
 
2663
.err4:
-
 
2664
        pop     eax
-
 
2665
@@:
2635
        movi    eax, ERROR_DEVICE
2666
        movi    eax, ERROR_DEVICE
2636
        stc
2667
        stc
2637
.done:
-
 
2638
        ret
2668
        ret
Line 2639... Line 2669...
2639
 
2669
 
2640
.err1:
-
 
2641
        movi    eax, ERROR_DISK_FULL
2670
.err1:
2642
        add     esp, 24
2671
        add     esp, 24
-
 
2672
        stc
-
 
2673
.err10:
2643
        stc
2674
        movi    eax, ERROR_DISK_FULL
Line 2644... Line 2675...
2644
        ret
2675
        ret
2645
 
2676
 
2646
.err2:
2677
.err2:
Line 2687... Line 2718...
2687
        jz      @f
2718
        jz      @f
2688
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2719
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
2689
        call    createMcbEntry
2720
        call    createMcbEntry
2690
        mov     [ebp+NTFS.fileDataSize], 0
2721
        mov     [ebp+NTFS.fileDataSize], 0
2691
@@:
2722
@@:
2692
        mov     byte [edi], 0
-
 
2693
        ret
2723
        ret
Line 2694... Line 2724...
2694
 
2724
 
2695
.err3:
2725
.err3:
2696
        movi    eax, ERROR_FS_FAIL
2726
        movi    eax, ERROR_FS_FAIL
2697
        add     esp, 20
2727
        add     esp, 20
2698
        stc
2728
        stc
Line -... Line 2729...
-
 
2729
        ret
-
 
2730
 
-
 
2731
.resident:
-
 
2732
        test    edx, edx
-
 
2733
        jnz     .nonResident
-
 
2734
        cmp     eax, 8000h
-
 
2735
        jnc     .nonResident
-
 
2736
        add     ax, [esi+attributeOffset]
-
 
2737
        sub     eax, [esi+sizeWithHeader]
-
 
2738
        jc      @f
-
 
2739
        mov     edi, [ebp+NTFS.frs_buffer]
-
 
2740
        mov     ecx, eax
-
 
2741
        add     ecx, [edi+recordRealSize]
-
 
2742
        cmp     [edi+recordAllocatedSize], ecx
-
 
2743
        jc      .nonResident
-
 
2744
        add     eax, 7
-
 
2745
        and     eax, not 7
-
 
2746
        add     [edi+recordRealSize], eax
-
 
2747
        add     edi, [edi+recordRealSize]
-
 
2748
        add     [esi+sizeWithHeader], eax
-
 
2749
        add     esi, [esi+sizeWithHeader]
-
 
2750
        mov     ecx, edi
-
 
2751
        sub     ecx, esi
-
 
2752
        shr     ecx, 2
-
 
2753
        sub     edi, 4
-
 
2754
        mov     esi, edi
-
 
2755
        sub     esi, eax
-
 
2756
        std
-
 
2757
        rep movsd
-
 
2758
        mov     ecx, eax
-
 
2759
        shr     ecx, 2
-
 
2760
        xor     eax, eax
-
 
2761
        rep stosd
-
 
2762
        cld
-
 
2763
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
-
 
2764
@@:
-
 
2765
        mov     eax, dword [ebp+NTFS.ntfs_attr_size]
-
 
2766
        mov     [esi+sizeWithoutHeader], eax
-
 
2767
        mov     [ebp+NTFS.fileDataSize], 0
-
 
2768
        clc
-
 
2769
        ret
-
 
2770
 
-
 
2771
.nonResident:   ; convert resident to non-resident
-
 
2772
        mov     eax, dword [ebp+NTFS.ntfs_attr_size]
-
 
2773
        sub     eax, 1
-
 
2774
        sbb     edx, 0
-
 
2775
        mov     ecx, [ebp+NTFS.sectors_per_cluster]
-
 
2776
        shl     ecx, 9
-
 
2777
        div     ecx
-
 
2778
        inc     eax
-
 
2779
        mov     [ebp+NTFS.fileDataSize], eax
-
 
2780
        mov     edi, [ebp+NTFS.BitmapStart]
-
 
2781
        push    ecx
-
 
2782
        call    ntfsSpaceAlloc
-
 
2783
        pop     ecx
-
 
2784
        jc      .err10
-
 
2785
        mov     [ebp+NTFS.fileDataStart], eax
-
 
2786
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
-
 
2787
        xor     eax, eax
-
 
2788
        xor     edx, edx
-
 
2789
@@:
-
 
2790
        add     eax, ecx
-
 
2791
        inc     edx
-
 
2792
        cmp     eax, [esi+sizeWithoutHeader]
-
 
2793
        jc      @b
-
 
2794
        push    edx
-
 
2795
        push    eax
-
 
2796
        stdcall kernel_alloc, eax
-
 
2797
        mov     ecx, [esp]
-
 
2798
        shr     ecx, 2
-
 
2799
        mov     edi, eax
-
 
2800
        mov     ebx, eax
-
 
2801
        xor     eax, eax
-
 
2802
        rep stosd
-
 
2803
        mov     al, [esi+attributeOffset]
-
 
2804
        mov     ecx, [esi+sizeWithoutHeader]
-
 
2805
        add     esi, eax
-
 
2806
        mov     edi, ebx
-
 
2807
        rep movsb
-
 
2808
        mov     eax, [ebp+NTFS.fileDataStart]
-
 
2809
        mul     [ebp+NTFS.sectors_per_cluster]
-
 
2810
        pop     ecx
-
 
2811
        shr     ecx, 9
-
 
2812
        call    fs_write64_app
-
 
2813
        push    ebx
-
 
2814
        mov     ebx, eax
-
 
2815
        call    kernel_free
-
 
2816
        test    ebx, ebx
-
 
2817
        jnz     .err4
-
 
2818
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
-
 
2819
        add     esi, [esi+sizeWithHeader]
-
 
2820
        mov     ecx, [ebp+NTFS.frs_buffer]
-
 
2821
        add     ecx, [ecx+recordRealSize]
-
 
2822
        sub     ecx, esi
-
 
2823
        shr     ecx, 2
-
 
2824
        lea     edi, [ebp+NTFS.ntfs_bitmap_buf]
-
 
2825
        push    ecx
-
 
2826
        rep movsd
-
 
2827
        mov     edi, [ebp+NTFS.ntfs_attr_offs]
-
 
2828
        add     edi, 16
-
 
2829
        mov     cl, 6
-
 
2830
        xor     eax, eax
-
 
2831
        rep stosd
-
 
2832
        mov     edi, [ebp+NTFS.ntfs_attr_offs]
-
 
2833
        mov     eax, [ebp+NTFS.fileDataSize]
-
 
2834
        dec     eax
-
 
2835
        mov     [edi+lastVCN], eax
-
 
2836
        inc     eax
-
 
2837
        mov     ecx, [ebp+NTFS.sectors_per_cluster]
-
 
2838
        shl     ecx, 9
-
 
2839
        mul     ecx
-
 
2840
        mov     byte [edi+sizeWithHeader], 50h
-
 
2841
        mov     byte [edi+nonResidentFlag], 1
-
 
2842
        mov     byte [edi+dataRunsOffset], 40h
-
 
2843
        mov     [edi+attributeAllocatedSize], eax
-
 
2844
        mov     [edi+attributeAllocatedSize+4], edx
-
 
2845
        mov     eax, dword [ebp+NTFS.ntfs_attr_size]
-
 
2846
        mov     edx, dword [ebp+NTFS.ntfs_attr_size+4]
-
 
2847
        mov     [edi+attributeRealSize], eax
-
 
2848
        mov     [edi+attributeRealSize+4], edx
-
 
2849
        mov     [edi+initialDataSize], eax
-
 
2850
        mov     [edi+initialDataSize+4], edx
-
 
2851
        mov     esi, edi
-
 
2852
        add     edi, 40h
-
 
2853
        call    createMcbEntry
-
 
2854
        mov     eax, edi
-
 
2855
        mov     edi, [ebp+NTFS.ntfs_attr_offs]
-
 
2856
        sub     eax, edi
-
 
2857
        add     eax, 8
-
 
2858
        and     eax, not 7
-
 
2859
        mov     [edi+sizeWithHeader], eax
-
 
2860
        pop     ecx
-
 
2861
        lea     esi, [ebp+NTFS.ntfs_bitmap_buf]
-
 
2862
        add     edi, eax
-
 
2863
        rep movsd
-
 
2864
        mov     esi, [ebp+NTFS.frs_buffer]
-
 
2865
        sub     edi, esi
-
 
2866
        mov     [esi+recordRealSize], edi
-
 
2867
        pop     edx
-
 
2868
        mov     ecx, [ebp+NTFS.fileDataSize]
-
 
2869
        sub     [ebp+NTFS.fileDataSize], edx
-
 
2870
        mov     eax, [ebp+NTFS.fileDataStart]
-
 
2871
        add     [ebp+NTFS.fileDataStart], edx
-
 
2872
        jmp     .writeBitmap
-
 
2873
 
-
 
2874
.makeResident:  ; convert non-resident to empty resident
-
 
2875
        movzx   eax, byte [esi+dataRunsOffset]
-
 
2876
        mov     byte [esi+nonResidentFlag], 0
-
 
2877
        mov     dword [esi+sizeWithoutHeader], 0
-
 
2878
        mov     dword [esi+attributeOffset], 18h
-
 
2879
        add     esi, eax
-
 
2880
        xor     edi, edi
-
 
2881
        sub     esp, 16
-
 
2882
@@:
-
 
2883
        call    ntfs_decode_mcb_entry
-
 
2884
        jnc     @f
-
 
2885
        cmp     dword[esp+8], 0
-
 
2886
        jz      @b
-
 
2887
        add     edi, [esp+8]
-
 
2888
        mov     ebx, [esp]
-
 
2889
        call    ntfsSpaceFree
-
 
2890
        jnc     @b
-
 
2891
@@:
-
 
2892
        add     esp, 16
-
 
2893
        mov     [ebp+NTFS.fileDataSize], 0
2699
        ret
2894
        ret
2700
 
2895
 
2701
ntfsSpaceClean:
2896
ntfsSpaceClean:
2702
; clean up to 16 Mb of disk space
2897
; clean up to 16 Mb of disk space
2703
;   in:
2898
;   in:
Line 3022... Line 3217...
3022
        jc      ntfsNotFound
3217
        jc      ntfsNotFound
3023
        cmp     [ebp+NTFS.ntfs_cur_iRecord], 16
3218
        cmp     [ebp+NTFS.ntfs_cur_iRecord], 16
3024
        jc      ntfsDenied
3219
        jc      ntfsDenied
3025
        bt      dword [eax+fileFlags], 28
3220
        bt      dword [eax+fileFlags], 28
3026
        jc      ntfsDenied
3221
        jc      ntfsDenied
3027
        mov     ecx, eax
-
 
3028
        mov     eax, [ebx+4]
-
 
3029
        mov     edx, [ebx+8]
-
 
3030
        add     eax, [ebx+12]
-
 
3031
        adc     edx, 0
-
 
3032
        mov     [ebp+NTFS.nodeLastRead], 0
-
 
3033
        cmp     edx, [ecx+fileRealSize+4]
-
 
3034
        jc      .readAttribute
-
 
3035
        jnz     @f
-
 
3036
        cmp     [ecx+fileRealSize], eax
-
 
3037
        jnc     .readAttribute
-
 
3038
@@:         ; set file size in the directory
-
 
3039
        cmp     [ebp+NTFS.ntfsFragmentCount], 1
3222
        cmp     [ebp+NTFS.ntfsFragmentCount], 1
3040
        jnz     ntfsUnsupported     ; record fragmented
3223
        jnz     ntfsUnsupported     ; record fragmented
-
 
3224
; edit directory node
3041
        mov     edi, [ebp+NTFS.cur_index_buf]
3225
        mov     edi, [ebp+NTFS.cur_index_buf]
3042
        cmp     dword [edi], 'INDX'
3226
        cmp     dword [edi], 'INDX'
3043
        jz      @f
3227
        jz      @f
3044
        mov     esi, [ebp+NTFS.frs_buffer]
3228
        mov     esi, [ebp+NTFS.frs_buffer]
3045
        push    ecx
-
 
3046
        mov     ecx, [esi+recordRealSize]
3229
        mov     ecx, [esi+recordRealSize]
3047
        shr     ecx, 2
3230
        shr     ecx, 2
3048
        rep movsd
3231
        rep movsd
3049
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
3232
        mov     esi, [ebp+NTFS.ntfs_attr_offs]
3050
        mov     cl, [esi+attributeOffset]
3233
        mov     cl, [esi+attributeOffset]
3051
        sub     esi, [ebp+NTFS.frs_buffer]
3234
        sub     esi, [ebp+NTFS.frs_buffer]
3052
        add     esi, ecx
3235
        add     eax, ecx
3053
        pop     ecx
-
 
3054
        add     ecx, esi
3236
        add     eax, esi
3055
@@:
3237
@@:
-
 
3238
        mov     ecx, [ebx+4]
-
 
3239
        mov     edx, [ebx+8]
-
 
3240
        add     ecx, [ebx+12]
-
 
3241
        adc     edx, 0
3056
        mov     [ecx+fileRealSize], eax
3242
        mov     [eax+fileRealSize], ecx
3057
        mov     [ecx+fileRealSize+4], edx
3243
        mov     [eax+fileRealSize+4], edx
3058
        mov     ecx, [ebp+NTFS.ntfsLastRead]
3244
        mov     eax, [ebp+NTFS.ntfsLastRead]
3059
        mov     [ebp+NTFS.nodeLastRead], ecx
3245
        mov     [ebp+NTFS.nodeLastRead], eax
3060
.readAttribute:
-
 
3061
        mov     [ebp+NTFS.ntfs_cur_attr], 0x80
3246
        mov     [ebp+NTFS.ntfs_cur_attr], 0x80
3062
        mov     [ebp+NTFS.ntfs_cur_offs], 0
3247
        mov     [ebp+NTFS.ntfs_cur_offs], 0
3063
        mov     [ebp+NTFS.ntfs_cur_size], 0
3248
        mov     [ebp+NTFS.ntfs_cur_size], 0
3064
        push    eax
-
 
3065
        call    ntfs_read_attr
3249
        call    ntfs_read_attr
3066
        pop     eax
-
 
3067
        jc      ntfsFail
3250
        jc      ntfsFail
-
 
3251
        mov     eax, ecx
3068
        mov     ecx, [ebp+NTFS.frs_buffer]
3252
        mov     ecx, [ebp+NTFS.frs_buffer]
3069
        cmp     word [ecx+baseRecordReuse], 0
3253
        cmp     word [ecx+baseRecordReuse], 0
3070
        jnz     ntfsUnsupported     ; auxiliary record
3254
        jnz     ntfsUnsupported     ; auxiliary record
3071
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
3255
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
-
 
3256
        cmp     word [ecx+attributeFlags], 0
-
 
3257
        jnz     ntfsUnsupported
-
 
3258
        push    ebx
3072
        cmp     byte [ecx+nonResidentFlag], 1
3259
        cmp     byte [ecx+nonResidentFlag], 0
3073
        jnz     ntfsUnsupported     ; resident $DATA
3260
        jz      .resizeAttribute
3074
        cmp     edx, [ecx+attributeRealSize+4]
3261
        cmp     edx, [ecx+attributeRealSize+4]
3075
        jc      .writeNode
3262
        jc      .writeNode
3076
        jnz     .resizeAttribute
3263
        jnz     .resizeAttribute
3077
        cmp     [ecx+attributeRealSize], eax
3264
        cmp     [ecx+attributeRealSize], eax
3078
        jnc     .writeNode
3265
        jnc     .writeNode
3079
.resizeAttribute:
3266
.resizeAttribute:
3080
        push    ebx
-
 
3081
        call    resizeAttribute
3267
        call    resizeAttribute
3082
        jc      ntfsErrorPop
3268
        jc      ntfsErrorPop
-
 
3269
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
-
 
3270
        cmp     byte [ecx+nonResidentFlag], 1
-
 
3271
        jz      @f
-
 
3272
        mov     ebx, [esp]
-
 
3273
        movzx   edi, byte [ecx+attributeOffset]
-
 
3274
        add     edi, ecx
-
 
3275
        add     edi, [ebx+4]
-
 
3276
        mov     ecx, [ebx+12]
-
 
3277
        mov     esi, [ebx+16]
-
 
3278
        rep movsb
-
 
3279
@@:
3083
        mov     eax, [ebp+NTFS.frs_buffer]
3280
        mov     eax, [ebp+NTFS.frs_buffer]
3084
        mov     [ebp+NTFS.ntfs_cur_buf], eax
3281
        mov     [ebp+NTFS.ntfs_cur_buf], eax
3085
        call    writeRecord     ; file
3282
        call    writeRecord     ; file
3086
        mov     ebx, [ebp+NTFS.frs_buffer]
3283
        mov     ebx, [ebp+NTFS.frs_buffer]
3087
        call    ntfs_restore_usa_frs
3284
        call    ntfs_restore_usa_frs
3088
        pop     ebx
-
 
3089
.writeNode:
3285
.writeNode:
3090
        mov     eax, [ebp+NTFS.nodeLastRead]
3286
        mov     eax, [ebp+NTFS.nodeLastRead]
3091
        test    eax, eax
-
 
3092
        jz      .writeData
-
 
3093
        mov     [ebp+NTFS.ntfsLastRead], eax
3287
        mov     [ebp+NTFS.ntfsLastRead], eax
3094
        mov     eax, [ebp+NTFS.cur_index_buf]
3288
        mov     eax, [ebp+NTFS.cur_index_buf]
3095
        mov     [ebp+NTFS.ntfs_cur_buf], eax
3289
        mov     [ebp+NTFS.ntfs_cur_buf], eax
3096
        push    ebx
-
 
3097
        call    writeRecord     ; directory
3290
        call    writeRecord     ; directory
3098
        pop     ebx
3291
        pop     ebx
-
 
3292
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
-
 
3293
        cmp     byte [ecx+nonResidentFlag], 0
-
 
3294
        jz      .done
-
 
3295
        mov     ecx, [ebx+12]
3099
.writeData:
3296
        test    ecx, ecx
-
 
3297
        jz      .done
3100
        mov     eax, [ebx+4]
3298
        mov     eax, [ebx+4]
3101
        mov     edx, [ebx+8]
3299
        mov     edx, [ebx+8]
3102
        mov     ecx, [ebx+12]
-
 
3103
        mov     esi, [ebx+16]
3300
        mov     esi, [ebx+16]
3104
        shrd    eax, edx, 9
3301
        shrd    eax, edx, 9
3105
        test    dword[ebx+4], 1FFh
3302
        test    dword[ebx+4], 1FFh
3106
        jz      .aligned
3303
        jz      .aligned
3107
        mov     [ebp+NTFS.ntfs_cur_offs], eax
3304
        mov     [ebp+NTFS.ntfs_cur_offs], eax
Line 3129... Line 3326...
3129
        xor     edx, edx
3326
        xor     edx, edx
3130
        call    fs_write64_app
3327
        call    fs_write64_app
3131
        pop     ebx
3328
        pop     ebx
3132
        pop     ecx
3329
        pop     ecx
3133
        test    ecx, ecx
3330
        test    ecx, ecx
3134
        jz      @f
3331
        jz      .done
3135
        mov     eax, [ebx+4]
3332
        mov     eax, [ebx+4]
3136
        mov     edx, [ebx+8]
3333
        mov     edx, [ebx+8]
3137
        shrd    eax, edx, 9
3334
        shrd    eax, edx, 9
3138
        inc     eax
3335
        inc     eax
3139
.aligned:
3336
.aligned:
Line 3149... Line 3346...
3149
        mov     [ebp+NTFS.ntfsWriteAttr], 0
3346
        mov     [ebp+NTFS.ntfsWriteAttr], 0
3150
        pop     [ebp+NTFS.ntfs_cur_offs]
3347
        pop     [ebp+NTFS.ntfs_cur_offs]
3151
        pop     ecx
3348
        pop     ecx
3152
        jc      ntfsDevice
3349
        jc      ntfsDevice
3153
        and     ecx, 1FFh
3350
        and     ecx, 1FFh
3154
        jz      @f
3351
        jz      .done
3155
        add     esi, [ebp+NTFS.ntfs_cur_read]
3352
        add     esi, [ebp+NTFS.ntfs_cur_read]
3156
        mov     [ebp+NTFS.ntfs_cur_size], 1
3353
        mov     [ebp+NTFS.ntfs_cur_size], 1
3157
        lea     edi, [ebp+NTFS.ntfs_bitmap_buf]
3354
        lea     edi, [ebp+NTFS.ntfs_bitmap_buf]
3158
        mov     [ebp+NTFS.ntfs_cur_buf], edi
3355
        mov     [ebp+NTFS.ntfs_cur_buf], edi
3159
        call    ntfs_read_attr.continue
3356
        call    ntfs_read_attr.continue
Line 3164... Line 3361...
3164
        lea     ebx, [ebp+NTFS.ntfs_bitmap_buf]
3361
        lea     ebx, [ebp+NTFS.ntfs_bitmap_buf]
3165
        mov     ecx, 1
3362
        mov     ecx, 1
3166
        xor     edx, edx
3363
        xor     edx, edx
3167
        call    fs_write64_app
3364
        call    fs_write64_app
3168
        pop     ebx
3365
        pop     ebx
3169
@@:
3366
.done:
3170
        mov     ebx, [ebx+12]
3367
        mov     ebx, [ebx+12]
3171
        jmp     ntfsDone
3368
        jmp     ntfsDone
Line 3172... Line 3369...
3172
 
3369
 
3173
;----------------------------------------------------------------
3370
;----------------------------------------------------------------
Line 3317... Line 3514...
3317
        jc      ntfsDenied
3514
        jc      ntfsDenied
3318
        bt      dword [eax+fileFlags], 28
3515
        bt      dword [eax+fileFlags], 28
3319
        jc      ntfsDenied
3516
        jc      ntfsDenied
3320
        cmp     [ebp+NTFS.ntfsFragmentCount], 1
3517
        cmp     [ebp+NTFS.ntfsFragmentCount], 1
3321
        jnz     ntfsUnsupported     ; record fragmented
3518
        jnz     ntfsUnsupported     ; record fragmented
3322
; set file size in the directory
3519
; edit directory node
3323
        mov     edi, [ebp+NTFS.cur_index_buf]
3520
        mov     edi, [ebp+NTFS.cur_index_buf]
3324
        cmp     dword [edi], 'INDX'
3521
        cmp     dword [edi], 'INDX'
3325
        jz      @f
3522
        jz      @f
3326
        mov     esi, [ebp+NTFS.frs_buffer]
3523
        mov     esi, [ebp+NTFS.frs_buffer]
3327
        mov     ecx, [esi+recordRealSize]
3524
        mov     ecx, [esi+recordRealSize]
Line 3347... Line 3544...
3347
        mov     eax, ecx
3544
        mov     eax, ecx
3348
        mov     ecx, [ebp+NTFS.frs_buffer]
3545
        mov     ecx, [ebp+NTFS.frs_buffer]
3349
        cmp     word [ecx+baseRecordReuse], 0
3546
        cmp     word [ecx+baseRecordReuse], 0
3350
        jnz     ntfsUnsupported     ; auxiliary record
3547
        jnz     ntfsUnsupported     ; auxiliary record
3351
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
3548
        mov     ecx, [ebp+NTFS.ntfs_attr_offs]
-
 
3549
        cmp     word [ecx+attributeFlags], 0
-
 
3550
        jnz     ntfsUnsupported
3352
        cmp     byte [ecx+nonResidentFlag], 1
3551
        cmp     byte [ecx+nonResidentFlag], 0
3353
        jnz     ntfsUnsupported     ; resident $DATA
3552
        jz      .resizeAttribute
3354
        cmp     [ecx+attributeRealSize+4], edx
3553
        cmp     [ecx+attributeRealSize+4], edx
3355
        jnz     .resizeAttribute
3554
        jnz     .resizeAttribute
3356
        cmp     [ecx+attributeRealSize], eax
3555
        cmp     [ecx+attributeRealSize], eax
3357
        jnc     .resizeAttribute
3556
        jnc     .resizeAttribute
3358
        mov     eax, [ecx+attributeRealSize]
3557
        mov     eax, [ecx+attributeRealSize]