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] |