diff --git a/FatPkg/EnhancedFatDxe/Delete.c b/FatPkg/EnhancedFatDxe/Delete.c index 448d669f9d..a341005afb 100644 --- a/FatPkg/EnhancedFatDxe/Delete.c +++ b/FatPkg/EnhancedFatDxe/Delete.c @@ -44,7 +44,7 @@ FatDelete ( // // If the file is read-only, then don't delete it // - if (IFile->ReadOnly) { + if (IFile->ReadOnly || FeaturePcdGet (PcdFatReadOnlyMode)) { Status = EFI_WRITE_PROTECTED; goto Done; } diff --git a/FatPkg/EnhancedFatDxe/DirectoryManage.c b/FatPkg/EnhancedFatDxe/DirectoryManage.c index 723fc35f38..d296033b13 100644 --- a/FatPkg/EnhancedFatDxe/DirectoryManage.c +++ b/FatPkg/EnhancedFatDxe/DirectoryManage.c @@ -73,6 +73,10 @@ FatStoreDirEnt ( UINT8 EntryCount; UINT8 LfnOrdinal; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + EntryPos = DirEnt->EntryPos; EntryCount = DirEnt->EntryCount; // @@ -709,6 +713,9 @@ FatExpandODir ( IN FAT_OFILE *OFile ) { + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } return FatExpandOFile (OFile, OFile->FileSize + OFile->Volume->ClusterSize); } @@ -954,6 +961,10 @@ FatSetVolumeEntry ( FAT_DIRENT LabelDirEnt; FAT_OFILE *Root; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + Root = Volume->Root; Status = FatSeekVolumeId (Volume->Root, &LabelDirEnt); if (EFI_ERROR (Status)) { @@ -1001,6 +1012,10 @@ FatCreateDotDirEnts ( EFI_STATUS Status; FAT_DIRENT *DirEnt; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + Status = FatExpandODir (OFile); if (EFI_ERROR (Status)) { return Status; @@ -1048,6 +1063,10 @@ FatCreateDirEnt ( FAT_ODIR *ODir; EFI_STATUS Status; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + ASSERT (OFile != NULL); ODir = OFile->ODir; ASSERT (ODir != NULL); @@ -1105,6 +1124,10 @@ FatRemoveDirEnt ( { FAT_ODIR *ODir; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + ODir = OFile->ODir; if (ODir->CurrentCursor == &DirEnt->Link) { // diff --git a/FatPkg/EnhancedFatDxe/Fat.inf b/FatPkg/EnhancedFatDxe/Fat.inf index 17b6348a25..92864278c4 100644 --- a/FatPkg/EnhancedFatDxe/Fat.inf +++ b/FatPkg/EnhancedFatDxe/Fat.inf @@ -56,6 +56,7 @@ [Packages] MdePkg/MdePkg.dec + FatPkg/FatPkg.dec [LibraryClasses] UefiRuntimeServicesTableLib @@ -82,6 +83,7 @@ gEfiUnicodeCollation2ProtocolGuid ## TO_START [Pcd] + gEfiFatPkgTokenSpaceGuid.PcdFatReadOnlyMode ## CONSUMES gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLang ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLang ## SOMETIMES_CONSUMES [UserExtensions.TianoCore."ExtraFiles"] diff --git a/FatPkg/EnhancedFatDxe/FileSpace.c b/FatPkg/EnhancedFatDxe/FileSpace.c index 909d4980d2..d1573df5fb 100644 --- a/FatPkg/EnhancedFatDxe/FileSpace.c +++ b/FatPkg/EnhancedFatDxe/FileSpace.c @@ -362,6 +362,10 @@ FatShrinkEof ( UINTN Cluster; UINTN LastCluster; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + Volume = OFile->Volume; ASSERT_VOLUME_LOCKED (Volume); @@ -440,6 +444,10 @@ FatGrowEof ( UINTN NewCluster; UINTN ClusterCount; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + // // For FAT file system, the max file is 4GB. // diff --git a/FatPkg/EnhancedFatDxe/Flush.c b/FatPkg/EnhancedFatDxe/Flush.c index 8c6010328b..294641e798 100644 --- a/FatPkg/EnhancedFatDxe/Flush.c +++ b/FatPkg/EnhancedFatDxe/Flush.c @@ -35,6 +35,10 @@ FatFlushEx ( EFI_STATUS Status; FAT_TASK *Task; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + IFile = IFILE_FROM_FHAND (FHand); OFile = IFile->OFile; Volume = OFile->Volume; @@ -112,6 +116,9 @@ FatFlush ( IN EFI_FILE_PROTOCOL *FHand ) { + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } return FatFlushEx (FHand, NULL); } diff --git a/FatPkg/EnhancedFatDxe/Init.c b/FatPkg/EnhancedFatDxe/Init.c index 208318c7ad..feae369693 100644 --- a/FatPkg/EnhancedFatDxe/Init.c +++ b/FatPkg/EnhancedFatDxe/Init.c @@ -51,7 +51,7 @@ FatAllocateVolume ( Volume->DiskIo2 = DiskIo2; Volume->BlockIo = BlockIo; Volume->MediaId = BlockIo->Media->MediaId; - Volume->ReadOnly = BlockIo->Media->ReadOnly; + Volume->ReadOnly = BlockIo->Media->ReadOnly || FeaturePcdGet (PcdFatReadOnlyMode); Volume->VolumeInterface.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION; Volume->VolumeInterface.OpenVolume = FatOpenVolume; InitializeListHead (&Volume->CheckRef); diff --git a/FatPkg/EnhancedFatDxe/Open.c b/FatPkg/EnhancedFatDxe/Open.c index f3fd6566ea..32a8e59fa6 100644 --- a/FatPkg/EnhancedFatDxe/Open.c +++ b/FatPkg/EnhancedFatDxe/Open.c @@ -224,8 +224,12 @@ FatOpenEx ( // switch (OpenMode) { case EFI_FILE_MODE_READ: + break; case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE: case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE: + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } break; default: diff --git a/FatPkg/EnhancedFatDxe/ReadWrite.c b/FatPkg/EnhancedFatDxe/ReadWrite.c index 8f525044d1..cf0ed0f52b 100644 --- a/FatPkg/EnhancedFatDxe/ReadWrite.c +++ b/FatPkg/EnhancedFatDxe/ReadWrite.c @@ -211,6 +211,10 @@ FatIFileAccess ( UINT64 EndPosition; FAT_TASK *Task; + if (FeaturePcdGet (PcdFatReadOnlyMode) && IoMode == WriteData) { + return EFI_WRITE_PROTECTED; + } + IFile = IFILE_FROM_FHAND (FHand); OFile = IFile->OFile; Volume = OFile->Volume; @@ -414,6 +418,9 @@ FatWrite ( IN VOID *Buffer ) { + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } return FatIFileAccess (FHand, WriteData, BufferSize, Buffer, NULL); } @@ -437,6 +444,9 @@ FatWriteEx ( IN OUT EFI_FILE_IO_TOKEN *Token ) { + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } return FatIFileAccess (FHand, WriteData, &Token->BufferSize, Token->Buffer, Token); } @@ -471,6 +481,10 @@ FatAccessOFile ( EFI_STATUS Status; UINTN BufferSize; + if (FeaturePcdGet (PcdFatReadOnlyMode) && IoMode == WriteData) { + return EFI_WRITE_PROTECTED; + } + BufferSize = *DataBufferSize; Volume = OFile->Volume; ASSERT_VOLUME_LOCKED (Volume); @@ -542,6 +556,10 @@ FatExpandOFile ( EFI_STATUS Status; UINTN WritePos; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + WritePos = OFile->FileSize; Status = FatGrowEof (OFile, ExpandedSize); if (!EFI_ERROR (Status)) { @@ -575,6 +593,10 @@ FatWriteZeroPool ( UINTN BufferSize; UINTN WriteSize; + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + AppendedSize = OFile->FileSize - WritePos; BufferSize = AppendedSize; if (AppendedSize > FAT_MAX_ALLOCATE_SIZE) { @@ -624,6 +646,10 @@ FatTruncateOFile ( IN UINTN TruncatedSize ) { + if (FeaturePcdGet (PcdFatReadOnlyMode)) { + return EFI_WRITE_PROTECTED; + } + OFile->FileSize = TruncatedSize; return FatShrinkEof (OFile); } diff --git a/FatPkg/FatPkg.dec b/FatPkg/FatPkg.dec index ecd086b41a..017402984a 100644 --- a/FatPkg/FatPkg.dec +++ b/FatPkg/FatPkg.dec @@ -17,3 +17,16 @@ [UserExtensions.TianoCore."ExtraFiles"] FatPkgExtra.uni + +[Guids] + # + # GUID defined in package + # + gEfiFatPkgTokenSpaceGuid = { 0xbe1f59ff, 0x65f5, 0x4b28, {0xb2, 0x8d, 0x56, 0x85, 0x36, 0x4a, 0xb1, 0xd2 } } + +[PcdsFeatureFlag.common] + ## Indicates if driver is in read-only mode.

+ # TRUE - Restricts write operations.
+ # FALSE - Write operations allowed. Default behavior
+ # @Prompt Disables write operations on fat filesystem. + gEfiFatPkgTokenSpaceGuid.PcdFatReadOnlyMode |FALSE|BOOLEAN|0x00000001 diff --git a/FatPkg/FatPkg.dsc b/FatPkg/FatPkg.dsc index 076b577972..e377c25ea1 100644 --- a/FatPkg/FatPkg.dsc +++ b/FatPkg/FatPkg.dsc @@ -82,3 +82,6 @@ [Components] FatPkg/FatPei/FatPei.inf FatPkg/EnhancedFatDxe/Fat.inf + +[PcdsFeatureFlag] + gEfiFatPkgTokenSpaceGuid.PcdFatReadOnlyMode|FALSE