Subversion Repositories Kolibri OS

Rev

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

Rev 321 Rev 335
Line 96... Line 96...
96
uglobal
96
uglobal
97
align 4
97
align 4
98
fat_cache:           times 512 db 0
98
fat_cache:           times 512 db 0
99
 Sector512:                      ; label for dev_hdcd.inc
99
 Sector512:                      ; label for dev_hdcd.inc
100
  buffer:              times 512 db 0
100
  buffer:              times 512 db 0
101
  deltree_buffer:      times 512 db 0
-
 
102
  fsinfo_buffer:       times 512 db 0
101
  fsinfo_buffer:       times 512 db 0
103
endg
102
endg
Line 104... Line 103...
104
 
103
 
105
uglobal
104
uglobal
Line 1234... Line 1233...
1234
    mov   ebx,PUSHAD_EAX        ; file/directory name
1233
    mov   ebx,PUSHAD_EAX        ; file/directory name
1235
    call  analyze_directory
1234
    call  analyze_directory
1236
    jc    file_to_delete_not_found
1235
    jc    file_to_delete_not_found
Line 1237... Line 1236...
1237
 
1236
 
1238
    test  byte [ebx+11],0x10    ; is it directory?
-
 
1239
    jz    delete_notdir         ; no. it's file
-
 
1240
    cmp   edi,1                 ; allow directory remove
-
 
1241
    jnz   delete_no_access      ; no
-
 
1242
 
-
 
1243
    push  eax                   ; save directory sector
-
 
1244
    mov   eax,[ebx+20-2]        ; first cluster of file
-
 
1245
    mov   ax,[ebx+26]           ; 0 length files start cluster = 0
-
 
1246
    and   eax,[fatMASK]
-
 
1247
    xor   ebp,ebp               ; counter for directory deepnes
-
 
1248
    call  clear_directory
-
 
1249
    pop   eax
1237
    test  byte [ebx+11],0x10    ; is it directory?
1250
    jc    delete_no_access
-
 
1251
 
-
 
1252
    push  ebx                   ; save directory pointer in buffer
-
 
1253
    mov   ebx,buffer
-
 
1254
    call  hd_read               ; read directory sector
-
 
1255
    cmp  [hd_error],0
-
 
1256
    jne  delete_no_access_1
-
 
Line 1257... Line 1238...
1257
    pop   ebx
1238
    jnz   delete_no_access
1258
 
1239
 
1259
  delete_notdir:
1240
  delete_notdir:
1260
    call  delete_entry_name
1241
    call  delete_entry_name
Line 1314... Line 1295...
1314
  access_denied_01:
1295
  access_denied_01:
1315
    pop   edx ecx eax
1296
    pop   edx ecx eax
1316
    ret
1297
    ret
Line 1317... Line -...
1317
 
-
 
1318
 
-
 
1319
clear_directory:
-
 
1320
;-----------------------------------------------------
-
 
1321
; input  : eax = directory cluster
-
 
1322
;          ebp = directory deepnes
-
 
1323
; Note   : use recursive call
-
 
1324
;-----------------------------------------------------
-
 
1325
    pushad
-
 
1326
    inc   ebp
-
 
1327
    cmp   ebp,64                ; if over 63 directory deep
-
 
1328
    jnb   clear_error           ; something must be wrong
-
 
1329
 
-
 
1330
  clear_new_cluster:
-
 
1331
    cmp   eax,[LAST_CLUSTER]
-
 
1332
    ja    clear_end
-
 
1333
    cmp   eax,[ROOT_CLUSTER]    ; don't remove root cluster
-
 
1334
    jz    clear_end
-
 
1335
    mov   esi,eax               ; esi = current directory cluster
-
 
1336
    sub   eax,2
-
 
1337
    jb    clear_end
-
 
1338
    mov   ecx,[SECTORS_PER_CLUSTER]
-
 
1339
    imul  eax,ecx
-
 
1340
    add   eax,[DATA_START]
-
 
1341
 
-
 
1342
  clear_new_sector:
-
 
1343
    mov   edi,eax               ; edi = current directory sector
-
 
1344
    mov   ebx,deltree_buffer
-
 
1345
    call  hd_read
-
 
1346
    cmp  [hd_error],0
-
 
1347
    jne  clear_error    
-
 
1348
 
-
 
1349
    mov   edx,512/32            ; count of dir entrys per sector = 16
-
 
1350
 
-
 
1351
  clear_analyze:
-
 
1352
    mov   al,[ebx+11]           ; file attribute
-
 
1353
    and   al,0xf
-
 
1354
    cmp   al,0xf
-
 
1355
    je    clear_long_filename
-
 
1356
 
-
 
1357
    cmp   byte [ebx],'.'        ; parent or current directory
-
 
1358
    je    clear_next_entry
-
 
1359
    cmp   byte [ebx],0xe5       ; deleted
-
 
1360
    je    clear_next_entry
-
 
1361
    cmp   byte [ebx],0          ; empty
-
 
1362
    je    clear_write_last
-
 
1363
    ;je    clear_next_entry
-
 
1364
 
-
 
1365
    mov   eax,[ebx+20-2]        ; first cluster of entry
-
 
1366
    mov   ax,[ebx+26]
-
 
1367
    and   eax,[fatMASK]
-
 
1368
 
-
 
1369
    test  byte [ebx+11],0x10    ; is it directory?
-
 
1370
    jz    clear_file            ; no
-
 
1371
 
-
 
1372
    push  eax ebx
-
 
1373
    mov   eax,edi
-
 
1374
    mov   ebx,deltree_buffer    ; save buffer over recursive call
-
 
1375
    call  hd_write              ; write directory sector to disk
-
 
1376
    cmp   [hd_error],0
-
 
1377
    jne   clear_error    
-
 
1378
 
-
 
1379
    pop   ebx eax
-
 
1380
 
-
 
1381
    call  clear_directory       ; recursive call !!!
-
 
1382
    jc    clear_error           ; exit if error found
-
 
1383
 
-
 
1384
    push  eax ebx
-
 
1385
    mov   eax,edi
-
 
1386
    mov   ebx,deltree_buffer
-
 
1387
    call  hd_read               ; read directory sector again
-
 
1388
    cmp  [hd_error],0
-
 
1389
    jne   clear_error_1
-
 
1390
 
-
 
1391
    pop   ebx eax
-
 
1392
 
-
 
1393
  clear_file:
-
 
1394
    call  clear_cluster_chain
-
 
1395
    cmp  [hd_error],0
-
 
1396
    jne   clear_error
-
 
1397
 
-
 
1398
  clear_long_filename:
-
 
1399
    mov   byte [ebx],0xe5
-
 
1400
 
-
 
1401
  clear_next_entry:
-
 
1402
    add   ebx,32                ; position of next dir entry
-
 
1403
    dec   edx
-
 
1404
    jnz   clear_analyze
-
 
1405
 
-
 
1406
    mov   eax,edi
-
 
1407
    mov   ebx,deltree_buffer
-
 
1408
    call  hd_write              ; write directory sector to disk
-
 
1409
    cmp   [hd_error],0
-
 
1410
    jne   clear_error
-
 
1411
 
-
 
1412
    inc   eax                   ; next sector
-
 
1413
    dec   ecx
-
 
1414
    jnz   clear_new_sector
-
 
1415
 
-
 
1416
    mov   eax,esi
-
 
1417
    call  get_FAT               ; get next cluster
-
 
1418
    cmp   [hd_error],0
-
 
1419
    jne   clear_error
-
 
1420
 
-
 
1421
    jmp   clear_new_cluster     ; clear it
-
 
1422
 
-
 
1423
  clear_write_last:
-
 
1424
    mov   eax,edi
-
 
1425
    mov   ebx,deltree_buffer
-
 
1426
    call  hd_write              ; write directory sector to disk
-
 
1427
    cmp   [hd_error],0
-
 
1428
    jne   clear_error
-
 
1429
 
-
 
1430
  clear_end:
-
 
1431
    popad
-
 
1432
    clc
-
 
1433
    ret
-
 
1434
clear_error_1:
-
 
1435
    add  esp,8
-
 
1436
  clear_error:
-
 
1437
    popad
-
 
1438
    stc
-
 
1439
    ret
-
 
1440
 
1298
 
1441
 
1299
 
1442
delete_entry_name:
1300
delete_entry_name:
1443
;-----------------------------------------------------
1301
;-----------------------------------------------------
1444
; input  : eax = directory sector
1302
; input  : eax = directory sector
Line 2261... Line 2119...
2261
        push    ebp
2119
        push    ebp
2262
        push    fat16_root_first
2120
        push    fat16_root_first
2263
        push    fat16_root_next
2121
        push    fat16_root_next
2264
        jmp     .common1
2122
        jmp     .common1
2265
.noroot:
2123
.noroot:
-
 
2124
        mov     eax, ERROR_ACCESS_DENIED
-
 
2125
        cmp     byte [ebp+1], 0
-
 
2126
        jz      .ret1
2266
; check existence
2127
; check existence
2267
        mov     byte [ebp], 0
2128
        mov     byte [ebp], 0
2268
        call    hd_find_lfn
2129
        call    hd_find_lfn
2269
        mov     byte [ebp], '/'
2130
        mov     byte [ebp], '/'
2270
        lea     esi, [ebp+1]
2131
        lea     esi, [ebp+1]