diff --git a/kernel/trunk/blkdev/rd.inc b/kernel/trunk/blkdev/rd.inc index 0a9f876440..d7ff52e6a2 100644 --- a/kernel/trunk/blkdev/rd.inc +++ b/kernel/trunk/blkdev/rd.inc @@ -918,6 +918,12 @@ ramdisk_root_extend_dir: stc ret +uglobal +; this is for delete support +rd_prev_sector dd ? +rd_prev_prev_sector dd ? +endg + ramdisk_notroot_next: add edi, 0x20 test edi, 0x1FF @@ -926,6 +932,9 @@ ramdisk_notroot_next: ramdisk_notroot_next_sector: push ecx mov ecx, [eax] + push [rd_prev_sector] + pop [rd_prev_prev_sector] + mov [rd_prev_sector], ecx mov ecx, [ecx*2+0x280000] and ecx, 0xFFF cmp ecx, 2849 @@ -2289,4 +2298,107 @@ fs_RamdiskExecute: mov eax, 6 ret +;---------------------------------------------------------------- +; +; fs_RamdiskDelete - delete file or empty folder from ramdisk +; +; esi points to filename +; +; ret eax = 0 ok or other = errormsg +; +;-------------------------------------------------------------- +fs_RamdiskDelete: + cmp byte [esi], 0 + jnz @f +; cannot delete root! +.access_denied: + push ERROR_ACCESS_DENIED +.pop_ret: + pop eax + ret +@@: + and [rd_prev_sector], 0 + and [rd_prev_prev_sector], 0 + push edi + call rd_find_lfn + jnc .found + pop edi + push ERROR_FILE_NOT_FOUND + jmp .pop_ret +.found: + cmp dword [edi], '. ' + jz .access_denied2 + cmp dword [edi], '.. ' + jz .access_denied2 + test byte [edi+11], 10h + jz .dodel +; we can delete only empty folders! + movzx eax, word [edi+26] + push ebx + mov ebx, eax + shl ebx, 9 + add ebx, RAMDISK + 31*0x200 + 2*0x20 +.checkempty: + cmp byte [ebx], 0 + jz .empty + cmp byte [ebx], 0xE5 + jnz .notempty + add ebx, 0x20 + test ebx, 0x1FF + jnz .checkempty + movzx eax, word [RAMDISK_FAT + eax*2] + test eax, eax + jz .empty + mov ebx, eax + shl ebx, 9 + add ebx, RAMDISK + 31*0x200 + jmp .checkempty +.notempty: + pop ebx +.access_denied2: + pop edi + jmp .access_denied +.empty: + pop ebx +.dodel: + movzx eax, word [edi+26] +; delete folder entry + mov byte [edi], 0xE5 +; delete LFN (if present) +.lfndel: + test edi, 0x1FF + jnz @f + cmp [rd_prev_sector], 0 + jz @f + cmp [rd_prev_sector], -1 + jz .lfndone + mov edi, [rd_prev_sector] + push [rd_prev_prev_sector] + pop [rd_prev_sector] + or [rd_prev_prev_sector], -1 + shl edi, 9 + add edi, RAMDISK + 31*0x200 + 0x200 +@@: + sub edi, 0x20 + cmp byte [edi], 0xE5 + jz .lfndone + cmp byte [edi+11], 0xF + jnz .lfndone + mov byte [edi], 0xE5 + jmp .lfndel +.lfndone: +; delete FAT chain + test eax, eax + jz .done + lea eax, [RAMDISK_FAT + eax*2] + push dword [eax] + and word [eax], 0 + pop eax + and eax, 0xFFF + jmp .lfndone +.done: + pop edi + xor eax, eax + ret + ; \end{diamond} diff --git a/kernel/trunk/fs/fat12.inc b/kernel/trunk/fs/fat12.inc index c11a75f9f1..247600d14f 100644 --- a/kernel/trunk/fs/fat12.inc +++ b/kernel/trunk/fs/fat12.inc @@ -1114,6 +1114,12 @@ fat_find_lfn: popa ret +uglobal +; this is for delete support +fd_prev_sector dd ? +fd_prev_prev_sector dd ? +endg + flp_root_next: cmp edi, 0xD200-0x20 jae @f @@ -1124,6 +1130,13 @@ flp_root_next: inc dword [eax] cmp dword [eax], 14 jae flp_root_first.readerr + push [fd_prev_sector] + pop [fd_prev_prev_sector] + push eax + mov eax, [eax] + add eax, 19-1 + mov [fd_prev_sector], eax + pop eax flp_root_first: mov eax, [eax] pusha @@ -1162,7 +1175,11 @@ flp_notroot_next: flp_notroot_next_sector: push ecx mov ecx, [eax] - mov ecx, [ecx*2+0x282000] + push [fd_prev_sector] + pop [fd_prev_prev_sector] + add ecx, 31 + mov [fd_prev_sector], ecx + mov ecx, [(ecx-31)*2+0x282000] and ecx, 0xFFF cmp ecx, 2849 jae flp_notroot_first.err2 @@ -2573,4 +2590,133 @@ fs_FloppyExecute: mov eax, 11 ret +;---------------------------------------------------------------- +; +; fs_FloppyDelete - delete file or empty folder from floppy +; +; esi points to filename +; +; ret eax = 0 ok or other = errormsg +; +;-------------------------------------------------------------- +fs_FloppyDelete: + call read_flp_fat + cmp [FDC_Status], 0 + jz @f + push 11 + jmp .pop_ret +@@: + cmp byte [esi], 0 + jnz @f +; cannot delete root! +.access_denied: + push ERROR_ACCESS_DENIED +.pop_ret: + pop eax + ret +@@: + and [fd_prev_sector], 0 + and [fd_prev_prev_sector], 0 + push edi + call fd_find_lfn + jnc .found + pop edi + push ERROR_FILE_NOT_FOUND + jmp .pop_ret +.found: + cmp dword [edi], '. ' + jz .access_denied2 + cmp dword [edi], '.. ' + jz .access_denied2 + test byte [edi+11], 10h + jz .dodel +; we can delete only empty folders! + push eax + movzx eax, word [edi+26] + push ebx + pusha + add eax, 31 + call read_chs_sector + popa + mov ebx, FDD_DATA + 2*0x20 +.checkempty: + cmp byte [ebx], 0 + jz .empty + cmp byte [ebx], 0xE5 + jnz .notempty + add ebx, 0x20 + cmp ebx, FDD_DATA + 0x200 + jb .checkempty + movzx eax, word [FLOPPY_FAT + eax*2] + pusha + add eax, 31 + call read_chs_sector + popa + mov ebx, FDD_DATA + jmp .checkempty +.notempty: + pop ebx + pop eax +.access_denied2: + pop edi + jmp .access_denied +.empty: + pop ebx + pop eax + pusha + call read_chs_sector + popa +.dodel: + push eax + movzx eax, word [edi+26] + xchg eax, [esp] +; delete folder entry + mov byte [edi], 0xE5 +; delete LFN (if present) +.lfndel: + cmp edi, FDD_DATA + ja @f + cmp [fd_prev_sector], 0 + jz .lfndone + push [fd_prev_sector] + push [fd_prev_prev_sector] + pop [fd_prev_sector] + and [fd_prev_prev_sector], 0 + pusha + call save_chs_sector + popa + pop eax + pusha + call read_chs_sector + popa + mov edi, FDD_DATA+0x200 +@@: + sub edi, 0x20 + cmp byte [edi], 0xE5 + jz .lfndone + cmp byte [edi+11], 0xF + jnz .lfndone + mov byte [edi], 0xE5 + jmp .lfndel +.lfndone: + pusha + call save_chs_sector + popa +; delete FAT chain + pop eax + test eax, eax + jz .done +@@: + lea eax, [FLOPPY_FAT + eax*2] + push dword [eax] + and word [eax], 0 + pop eax + and eax, 0xFFF + jnz @b +.done: + call save_flp_fat + pop edi + xor eax, eax + ret + ; \end{diamond} diff --git a/kernel/trunk/fs/fat32.inc b/kernel/trunk/fs/fat32.inc index fbea699844..4be80235dc 100644 --- a/kernel/trunk/fs/fat32.inc +++ b/kernel/trunk/fs/fat32.inc @@ -7,6 +7,7 @@ ;; Copyright 2002 Paolo Minazzi, paolo.minazzi@inwind.it ;; ;; ;; ;; See file COPYING for details ;; +;; 08.10.2006 LFN delete file/folder - diamond ;; ;; 20.08.2006 LFN set file size (truncate/extend) - diamond ;; ;; 17.08.2006 LFN write/append to file - diamond ;; ;; 23.06.2006 LFN start application - diamond ;; @@ -61,6 +62,8 @@ PUSHAD_EBP equ [esp+8] PUSHAD_ESI equ [esp+4] PUSHAD_EDI equ [esp+0] +uglobal +align 4 cluster dd 0 ; used by file_write,makedir,append partition_count dd 0 ; partitions found by set_FAT32_variables longname_sec1 dd 0 ; used by analyze_directory to save 2 previous @@ -83,11 +86,15 @@ new_filepos dd 0 ; used by append bytes2write dd 0 ; used by append cache_search_start dd 0 ; used by find_empty_slot +endg +iglobal fat_in_cache dd -1 -fat_cache: times 512 db 0 +endg uglobal +align 4 +fat_cache: times 512 db 0 Sector512: ; label for dev_hdcd.inc buffer: times 512 db 0 deltree_buffer: times 512 db 0 @@ -980,38 +987,6 @@ makedir: xor eax,eax ret - -removedir: -;----------------------------------------------------- -; input : eax = file/directory name -; edx = path -; output : eax = 0 - ok -; 3 - unknown FS -; 5 - file not found -; 10 - access denied -;----------------------------------------------------- - cmp [fat_type],0 - jnz remove_dir_fat_ok - mov eax,ERROR_UNKNOWN_FS - ret - - remove_dir_fat_ok: -; call reserve_hd1 - - push edi - mov edi,1 ; allow directory remove - call file_delete - cmp [hd_error],0 - jne @f - - pop edi - - call update_disk ; write all of cache and fat to hd - @@: - mov [hd1_status],0 - ret - - add_disk_free_space: ;----------------------------------------------------- ; input : ecx = cluster count @@ -2340,8 +2315,14 @@ fat16_root_next: ret ; CF=0 fat16_root_next_sector: ; read next sector + push [longname_sec2] + pop [longname_sec1] push ecx mov ecx, [eax+4] + push ecx + add ecx, [ROOT_START] + mov [longname_sec2], ecx + pop ecx inc ecx mov [eax+4], ecx cmp ecx, [ROOT_SECTORS] @@ -2391,6 +2372,12 @@ fat_notroot_next: add edi, 0x20 ret ; CF=0 fat_notroot_next_sector: + push [longname_sec2] + pop [longname_sec1] + push eax + call fat_get_sector + mov [longname_sec2], eax + pop eax push ecx mov ecx, [eax+4] inc ecx @@ -3639,7 +3626,7 @@ fs_HdExecute: .flags: cmp [fat_type], 0 jnz @f - mov eax, ERROR_UNKNOWN_FS + mov eax, -ERROR_UNKNOWN_FS ret @@: cmp byte [esi], 0 @@ -3722,4 +3709,154 @@ fs_HdExecute: mov eax, 11 ret +;---------------------------------------------------------------- +; +; fs_HdDelete - delete file or empty folder from hard disk +; +; esi points to filename +; +; ret eax = 0 ok or other = errormsg +; +;-------------------------------------------------------------- +fs_HdDelete: + cmp [fat_type], 0 + jnz @f + push ERROR_UNKNOWN_FS +.pop_ret: + pop eax + ret +@@: + cmp byte [esi], 0 + jnz @f +; cannot delete root! +.access_denied: + push ERROR_ACCESS_DENIED + jmp .pop_ret +@@: + and [longname_sec1], 0 + and [longname_sec2], 0 + push edi + call hd_find_lfn + jnc .found + pop edi + push ERROR_FILE_NOT_FOUND + jmp .pop_ret +.found: + cmp dword [edi], '. ' + jz .access_denied2 + cmp dword [edi], '.. ' + jz .access_denied2 + test byte [edi+11], 10h + jz .dodel +; we can delete only empty folders! + pushad + mov ebp, [edi+20-2] + mov bp, [edi+26] + xor ecx, ecx + lea eax, [ebp-2] + imul eax, [SECTORS_PER_CLUSTER] + add eax, [DATA_START] + mov ebx, buffer + call hd_read + cmp [hd_error], 0 + jnz .err1 + add ebx, 2*0x20 +.checkempty: + cmp byte [ebx], 0 + jz .empty + cmp byte [ebx], 0xE5 + jnz .notempty + add ebx, 0x20 + cmp ebx, buffer+0x200 + jb .checkempty + inc ecx + cmp ecx, [SECTORS_PER_CLUSTER] + jb @f + mov eax, ebp + call get_FAT + cmp [hd_error], 0 + jnz .err1 + mov ebp, eax + xor ecx, ecx +@@: + lea eax, [ebp-2] + imul eax, [SECTORS_PER_CLUSTER] + add eax, [DATA_START] + add eax, ecx + mov ebx, buffer + call hd_read + cmp [hd_error], 0 + jz .checkempty +.err1: + popad +.err2: + pop edi + push 11 + pop eax + ret +.notempty: + popad +.access_denied2: + pop edi + push ERROR_ACCESS_DENIED + pop eax + ret +.empty: + popad + push ebx + mov ebx, buffer + call hd_read + pop ebx + cmp [hd_error], 0 + jnz .err2 +.dodel: + push eax + mov eax, [edi+20-2] + mov ax, [edi+26] + xchg eax, [esp] +; delete folder entry + mov byte [edi], 0xE5 +; delete LFN (if present) +.lfndel: + cmp edi, buffer + ja @f + cmp [longname_sec2], 0 + jz .lfndone + push [longname_sec2] + push [longname_sec1] + pop [longname_sec2] + and [longname_sec1], 0 + push ebx + mov ebx, buffer + call hd_write + mov eax, [esp+4] + call hd_read + pop ebx + pop eax + mov edi, buffer+0x200 +@@: + sub edi, 0x20 + cmp byte [edi], 0xE5 + jz .lfndone + cmp byte [edi+11], 0xF + jnz .lfndone + mov byte [edi], 0xE5 + jmp .lfndel +.lfndone: + push ebx + mov ebx, buffer + call hd_write + pop ebx +; delete FAT chain + pop eax + call clear_cluster_chain + call update_disk + pop edi + xor eax, eax + cmp [hd_error], 0 + jz @f + mov al, 11 +@@: + ret + ; \end{diamond} diff --git a/kernel/trunk/fs/fs.inc b/kernel/trunk/fs/fs.inc index 449c385833..a81d4dce95 100644 --- a/kernel/trunk/fs/fs.inc +++ b/kernel/trunk/fs/fs.inc @@ -37,7 +37,6 @@ file_system: ; ; eax = 0 ; read file /RamDisk/First 6 ; eax = 1 ; write file /RamDisk/First 33 /HardDisk/First 56 -; eax = 2 ; delete file /RamDisk/First 32 ; eax = 4 ; makedir ; eax = 5 ; rename file/directory ; eax = 8 ; lba read @@ -92,8 +91,6 @@ file_system: je fs_read cmp dword [eax+0],4 ; MAKEDIR - dont care about read&write blocks je fs_read - cmp dword [eax+0],2 ; DELETE - dont care about read&write blocks - je fs_read cmp dword [0x3000],1 ; no memory checks for kernel requests jz no_checks_for_kernel @@ -283,15 +280,6 @@ endg jmp file_system_return fs_noramdisk_write: - - cmp dword [esp+20],2 ;DELETE - jne fs_noramdisk_delete - mov eax,[esp+4] ; fname - add eax,2*12+1 - call filedelete - jmp file_system_return - - fs_noramdisk_delete: fs_noramdisk: ;******************************************************************** @@ -359,17 +347,6 @@ endg fs_noflpdisk_write: - cmp dword [esp+20],2 ; DELETE - jne fs_noflpdisk_delete - - mov eax,[esp+4] ; fname - add eax,2*12+1 - call floppy_filedelete - mov [flp_status],0 - jmp file_system_return - - fs_noflpdisk_delete: - fs_noflpdisk: ;***************************************************************** @@ -521,24 +498,6 @@ hd_err_return: fs_noharddisk_write: - cmp dword [esp+20],2 ; DELETE - jne fs_noharddisk_delete - - mov eax,[esp+0] ; /dirname or /filename - mov byte [eax],0 ; path to asciiz - inc eax ; filename start - mov edx,[esp+4] - add edx,12*2 ; path start - - call removedir - - mov edi,[esp+0] - mov byte [edi],'/' - - jmp file_system_return - - fs_noharddisk_delete: - cmp dword [esp+20],4 ; MAKEDIR jne fs_noharddisk_makedir diff --git a/kernel/trunk/fs/fs_lfn.inc b/kernel/trunk/fs/fs_lfn.inc index 8890209800..8198523630 100644 --- a/kernel/trunk/fs/fs_lfn.inc +++ b/kernel/trunk/fs/fs_lfn.inc @@ -82,9 +82,8 @@ file_system_lfn: ; 5 : get file/directory attributes structure ; 6 : set file/directory attributes structure ; 7 : start application -; 8 : delete file - not implemented yet +; 8 : delete file ; 9 : create directory - not implemented yet -; 10: rename file/directory - not implemented yet add eax, std_application_base_address ; parse file name @@ -352,6 +351,7 @@ fs_RamdiskServices: dd fs_RamdiskGetFileInfo dd fs_RamdiskSetFileInfo dd fs_RamdiskExecute + dd fs_RamdiskDelete fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4 fs_OnFloppy: @@ -381,6 +381,7 @@ fs_FloppyServices: dd fs_FloppyGetFileInfo dd fs_FloppySetFileInfo dd fs_FloppyExecute + dd fs_FloppyDelete fs_NumFloppyServices = ($ - fs_FloppyServices)/4 fs_OnHd0: @@ -452,6 +453,7 @@ fs_HdServices: dd fs_HdGetFileInfo dd fs_HdSetFileInfo dd fs_HdExecute + dd fs_HdDelete fs_NumHdServices = ($ - fs_HdServices)/4 ;*******************************************************