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