VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/Firmware/FatPkg/EnhancedFatDxe/Delete.c@ 107675

最後變更 在這個檔案從107675是 99404,由 vboxsync 提交於 2 年 前

Devices/EFI/FirmwareNew: Update to edk2-stable202302 and make it build, bugref:4643

  • 屬性 svn:eol-style 設為 native
檔案大小: 2.5 KB
 
1/** @file
2 Function that deletes a file.
3
4Copyright (c) 2005 - 2013, Intel Corporation. All rights reserved.<BR>
5SPDX-License-Identifier: BSD-2-Clause-Patent
6
7
8**/
9
10#include "Fat.h"
11
12/**
13
14 Deletes the file & Closes the file handle.
15
16 @param FHand - Handle to the file to delete.
17
18 @retval EFI_SUCCESS - Delete the file successfully.
19 @retval EFI_WARN_DELETE_FAILURE - Fail to delete the file.
20
21**/
22EFI_STATUS
23EFIAPI
24FatDelete (
25 IN EFI_FILE_PROTOCOL *FHand
26 )
27{
28 FAT_IFILE *IFile;
29 FAT_OFILE *OFile;
30 FAT_DIRENT *DirEnt;
31 EFI_STATUS Status;
32 UINTN Round;
33
34 IFile = IFILE_FROM_FHAND (FHand);
35 OFile = IFile->OFile;
36
37 FatWaitNonblockingTask (IFile);
38
39 //
40 // Lock the volume
41 //
42 FatAcquireLock ();
43
44 //
45 // If the file is read-only, then don't delete it
46 //
47 if (IFile->ReadOnly) {
48 Status = EFI_WRITE_PROTECTED;
49 goto Done;
50 }
51
52 //
53 // If the file is the root dir, then don't delete it
54 //
55 if (OFile->Parent == NULL) {
56 Status = EFI_ACCESS_DENIED;
57 goto Done;
58 }
59
60 //
61 // If the file has a permanent error, skip the delete
62 //
63 Status = OFile->Error;
64 if (!EFI_ERROR (Status)) {
65 //
66 // If this is a directory, make sure it's empty before
67 // allowing it to be deleted
68 //
69 if (OFile->ODir != NULL) {
70 //
71 // We do not allow to delete nonempty directory
72 //
73 FatResetODirCursor (OFile);
74 for (Round = 0; Round < 3; Round++) {
75 Status = FatGetNextDirEnt (OFile, &DirEnt);
76 if ((EFI_ERROR (Status)) ||
77 ((Round < 2) && ((DirEnt == NULL) || !FatIsDotDirEnt (DirEnt))) ||
78 ((Round == 2) && (DirEnt != NULL))
79 )
80 {
81 Status = EFI_ACCESS_DENIED;
82 goto Done;
83 }
84 }
85 }
86
87 //
88 // Return the file's space by setting its size to 0
89 //
90 FatTruncateOFile (OFile, 0);
91 //
92 // Free the directory entry for this file
93 //
94 Status = FatRemoveDirEnt (OFile->Parent, OFile->DirEnt);
95 if (EFI_ERROR (Status)) {
96 goto Done;
97 }
98
99 //
100 // Set a permanent error for this OFile in case there
101 // are still opened IFiles attached
102 //
103 OFile->Error = EFI_NOT_FOUND;
104 } else if (OFile->Error == EFI_NOT_FOUND) {
105 Status = EFI_SUCCESS;
106 }
107
108Done:
109 //
110 // Always close the handle
111 //
112 FatIFileClose (IFile);
113 //
114 // Done
115 //
116 Status = FatCleanupVolume (OFile->Volume, NULL, Status, NULL);
117 FatReleaseLock ();
118
119 if (EFI_ERROR (Status)) {
120 Status = EFI_WARN_DELETE_FAILURE;
121 }
122
123 return Status;
124}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette